そんな今日この頃の技術ネタ

本家側に書くほどでもない小ネタ用

Docker for Mac にKubernetesがやって来た!(ちょっと追記)

 今朝メーリングリストで通知が来たので試してみた!

f:id:blue1st:20180106145206p:plain

docs.docker.com


導入

 組み込まれるのは17.12.0-ce-mac45からということでEdge版をダウンロード&インストール。

docs.docker.com


 Preferences..メニューを確認するとちゃんとKubernetes v1.8.2の文字が!

f:id:blue1st:20180106145610p:plain


 Kubernetesを使用するには、新たに設けられたKubernetesタブからEnable KubernetesをオンにしてApplyボタンをポチり。ちょっと待つとKubernetes is runningになる。

f:id:blue1st:20180106145808p:plain


動作確認

 そんなこんなで早速いじってみる。

contextの切り替え

 操作対象のクラスタとして既存のminikubeに加えて、新たにdocker-for-desktopが追加されていることが確認できる。use-contextで切り替えて使用していく。minikube同様に(当たり前だけど)一台のnode構成。

$ kubectl config get-contexts
CURRENT   NAME                 CLUSTER                      AUTHINFO             NAMESPACE
*         minikube             minikube                     minikube
          docker-for-desktop   docker-for-desktop-cluster   docker-for-desktop

$ kubectl config use-context  docker-for-desktop
Switched to context "docker-for-desktop".

$ kubectl get node
NAME                 STATUS    ROLES     AGE       VERSION
docker-for-desktop   Ready     master    39m       v1.8.2


Manifestfileの作成

 公式ドキュメントじゃDocker.incの苦々しい思いもあってかdocker-compose.ymlを使う例しか載ってないけど、せっかくのKubernetesなんでちゃんとManifestfileを使ったデプロイをしてみる。

(docker-compose.yamlでデプロイできるKomposeなんてものも世間にはあるけど、k8sとdocker compose必ずしも完全互換じゃなくて凝ったことをやろうとすると躓くこと必至なんで、普通にKubernetesの流儀を学ぶことをオススメしたい。)

 例としてminikubeの時と同様にnginxを立ち上げてみる。

 以下のようなManifestfileを用意。今回は折角ローカルで動いているということで、開発時を想定してホストのディレクトリをマウントしてみる。

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: http
  labels:
    app: http-app
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http-port
          containerPort: 80
      volumeMounts:
        - name: docroot
          mountPath: /usr/share/nginx/html
  volumes:
    - name: docroot
      hostPath:
        path: /PATH/TO/DIR # 作業ディレクトリ

 ちなみにこのディレクトリはFile Sharingタブで指定されているディレクトリの下位である必要がある。/Users/YOUR_NAMEとか/tmp/k8s/sampleとか。(まあこれは通常のDocker for Mac使用時も同様だけど。)

f:id:blue1st:20180106193415p:plain


 External IPどうすりゃええねんと色々試行錯誤してみたけど、docker-composeと同じノリでlocalhostで使いたければひとまずtype: LoadBalancerにしておけば良さそう。

# service.yaml
kind: Service
apiVersion: v1
metadata:
  name: http-service
  labels:
    app: http-app
spec:
  selector:
    app: http-app
  ports:
    - port: 8080
      targetPort: http-port
  type: LoadBalancer


起動

 createコマンドで先程作成したManifestfileを指定して起動

$ kubectl create  -f service.yaml -f pod.yaml
service "http-service" created
pod "http" created

$ kubectl get all
NAME      READY     STATUS    RESTARTS   AGE
po/http   1/1       Running   0          9m

NAME               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
svc/http-service   LoadBalancer   10.106.61.172   <pending>     8080:31557/TCP   10m
svc/kubernetes     ClusterIP      10.96.0.1       <none>        443/TCP          4h

 svcは<pending>のままで問題なさそう。podがRunningになれば起動完了。


 curlでアクセスすると、最初はドキュメントルートが空なので当然403。

$ curl localhost:8080
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.13.8</center>
</body>
</html>


 それじゃあというわけで、マウントしたディレクトリにindex.htmlを作成すると・・・

$ echo '<html><body>hello k8s!</body></html>'>   /PATH/TO/DIR/index.html
$ curl localhost:8080
<html><body>hello k8s!</body></html>

ちゃんと作成したindex.htmlが読み込まれてる!



 まだ出始めだしminikubeは色々addonが用意されてて便利だしですぐに移行する/できるかというと微妙かなーとは思うけど、公式ツールに組み込まれてることによるお手軽さは良いですな。社内で初心者にKubernetesの説明をする分にはやりやすくなる。

 これまで手軽さからローカル開発時はdocker-compose、ステージング・本番環境はk8sみたいな二重体制だったのを上手いこと一本化できれば良いなあ。

WEB+DB PRESS Vol.99

WEB+DB PRESS Vol.99

  • 作者: ?橋健一,谷口禎英,井本大登,山崎勝平,大和田純,内村元樹,坂東昌哉,平田敏之,牧大輔,板敷康洋,大?浩崇,穴井宏幸,原口宗悟,久田真寛,ふしはらかん,のざきひろふみ,うらがみ,ひげぽん,池田拓司,はまちや2,竹原,片田雄樹,渋江一晃,WEB+DB PRESS編集部編
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/06/24
  • メディア: 大型本
  • この商品を含むブログを見る

↑の特集がpodとかserviceとかって何よ?的なKubernetesの概念を最初にざっくり把握するにはおすすめ。