Edited at

Docker for MacでKubernetes構築


環境


  • OS: Mac OS 10.14(Mojave)

  • Docker for Mac: stable版(18.06.1-ce-mac73 (26764))


TL;DR


  • Docker for Mac(stable版)でKubernetesインストールしてみた

  • docker-comose.ymlでもKubernetesにデプロイできる

  • 余談(kube-composeについて)

今年の初めにDocker for macのedge版でKubernetensの統合されていたようですが、試しそびれていました。現在では自分の端末に入っているstable版にもKubernetes機能入っていたので試してみました。


Kubernetesのインストール

はい、これだけです。

1. 「Preference」で設定開いて「Kubernetes」メニュー選ぶ

2. 「Enable Kubernetes」チェック入れて「Kubernetes」を選択して「Apply」をクリック(swarmの選択肢は残されている)



3. 「install」でKubernetesインストール開始



Kubernetesのインストールが正常に終わると「Kubernetes is running」の表示が出ます。あっさり。


Contextの切り替え

kubectlで管理する向き先(Kubernetesの環境)を「docker-for-desktop」にしておきます。自分の場合は昔作ったminikube環境もあったのでそちらから変更。


インストールの確認


dockerコンテナ

Kubernetesの各コンポーネントがdockerコンテナ化されて立ち上がっています。

$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14f9376a591d k8s.gcr.io/pause-amd64:3.1 "/pause" 4 days ago Up 4 days k8s_POD_kubernetes-dashboard-7d5dcdb6d9-v2htg_kube-system_a65ca6bd-c45a-11e8-b684-025000000001_0
f5e9689be63e k8s.gcr.io/k8s-dns-sidecar-amd64 "/sidecar --v=2 --lo…" 5 days ago Up 5 days k8s_sidecar_kube-dns-86f4d74b45-dhqsw_kube-system_6f9e4239-c398-11e8-b684-025000000001_0
5703f9d2d7a0 k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64 "/dnsmasq-nanny -v=2…" 5 days ago Up 5 days k8s_dnsmasq_kube-dns-86f4d74b45-dhqsw_kube-system_6f9e4239-c398-11e8-b684-025000000001_0
91571f8472c2 docker/kube-compose-api-server "/api-server --kubec…" 5 days ago Up 5 days k8s_compose_compose-api-6fbc44c575-8cbcj_docker_6f9cbdbc-c398-11e8-b684-025000000001_0
1a7e00f186af k8s.gcr.io/kube-proxy-amd64 "/usr/local/bin/kube…" 5 days ago Up 5 days k8s_kube-proxy_kube-proxy-rlnsl_kube-system_6fbbb55e-c398-11e8-b684-025000000001_0
483c8c6b6dbc docker/kube-compose-controller "/compose-controller…" 5 days ago Up 5 days k8s_compose_compose-7447646cf5-mrqpl_docker_6f9de91a-c398-11e8-b684-025000000001_0
746e2792f53a k8s.gcr.io/k8s-dns-kube-dns-amd64 "/kube-dns --domain=…" 5 days ago Up 5 days k8s_kubedns_kube-dns-86f4d74b45-dhqsw_kube-system_6f9e4239-c398-11e8-b684-025000000001_0
bd83b0c4b898 k8s.gcr.io/pause-amd64:3.1 "/pause" 5 days ago Up 5 days k8s_POD_compose-api-6fbc44c575-8cbcj_docker_6f9cbdbc-c398-11e8-b684-025000000001_0
0278b6953eb5 k8s.gcr.io/pause-amd64:3.1 "/pause" 5 days ago Up 5 days k8s_POD_kube-proxy-rlnsl_kube-system_6fbbb55e-c398-11e8-b684-025000000001_0
d8a93dc5826d k8s.gcr.io/pause-amd64:3.1 "/pause" 5 days ago Up 5 days k8s_POD_compose-7447646cf5-mrqpl_docker_6f9de91a-c398-11e8-b684-025000000001_0
5dea4052fa58 k8s.gcr.io/pause-amd64:3.1 "/pause" 5 days ago Up 5 days k8s_POD_kube-dns-86f4d74b45-dhqsw_kube-system_6f9e4239-c398-11e8-b684-025000000001_0
bad5703d1be2 k8s.gcr.io/etcd-amd64 "etcd --data-dir=/va…" 5 days ago Up 5 days k8s_etcd_etcd-docker-for-desktop_kube-system_d76b3556d1f39ec8d0043b915215028f_0
734db670ba24 k8s.gcr.io/kube-apiserver-amd64 "kube-apiserver --ad…" 5 days ago Up 5 days k8s_kube-apiserver_kube-apiserver-docker-for-desktop_kube-system_ca46586ea287e0ae17ccd3dbfa4aa8ee_0
2a1effa9da89 k8s.gcr.io/kube-scheduler-amd64 "kube-scheduler --ad…" 5 days ago Up 5 days k8s_kube-scheduler_kube-scheduler-docker-for-desktop_kube-system_ea66a171667ec4aaf1b274428a42a7cf_0
82f789f4ce8b k8s.gcr.io/kube-controller-manager-amd64 "kube-controller-man…" 5 days ago Up 5 days k8s_kube-controller-manager_kube-controller-manager-docker-for-desktop_kube-system_708c58241d063556f72d047bd4ff0668_0
814f74f0aa8c k8s.gcr.io/pause-amd64:3.1 "/pause" 5 days ago Up 5 days k8s_POD_etcd-docker-for-desktop_kube-system_d76b3556d1f39ec8d0043b915215028f_0
68b84d8cbbaa k8s.gcr.io/pause-amd64:3.1 "/pause" 5 days ago Up 5 days k8s_POD_kube-scheduler-docker-for-desktop_kube-system_ea66a171667ec4aaf1b274428a42a7cf_0
3794af6fbf34 k8s.gcr.io/pause-amd64:3.1 "/pause" 5 days ago Up 5 days k8s_POD_kube-controller-manager-docker-for-desktop_kube-system_708c58241d063556f72d047bd4ff0668_0
3c1ee6d1aedf k8s.gcr.io/pause-amd64:3.1 "/pause" 5 days ago Up 5 days k8s_POD_kube-apiserver-docker-for-desktop_kube-system_ca46586ea287e0ae17ccd3dbfa4aa8ee_0


Pod

コンポーネントはPod化もされている。名前空間dockerでcomposeな名前のものが気になる・・・

$ kubectl get pods --all-namespaces

NAMESPACE NAME READY STATUS RESTARTS AGE
docker compose-7447646cf5-mrqpl 1/1 Running 0 11d
docker compose-api-6fbc44c575-8cbcj 1/1 Running 0 11d
kube-system etcd-docker-for-desktop 1/1 Running 0 11d
kube-system kube-apiserver-docker-for-desktop 1/1 Running 0 11d
kube-system kube-controller-manager-docker-for-desktop 1/1 Running 0 11d
kube-system kube-dns-86f4d74b45-dhqsw 3/3 Running 0 11d
kube-system kube-proxy-rlnsl 1/1 Running 0 11d
kube-system kube-scheduler-docker-for-desktop 1/1 Running 0 11d


Service

$ kubectl get services

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d


kubernetes-dashboardのインストール(オプション)

minikubeと違い、kubernetes-dashboardはインストールされていないので、必要に応じてdeploymentのyamlでデプロイします。(全部コマンドでやるんだって人は別にいらないからデフォルトで入ってないのかと。)

公式のyamlをkubectl applyしてproxy立ち上げるだけです。

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

あとは下記URLからlocalhostのKubernetesダッシュボードにアクセスできます。

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/


composeとの統合

先ほどからdockerでcomposeなPodなどいるなーと思っていたら

こちら
docker stack deployでkubernetesにdocker-compose.ymlでデプロイできるとの記事が。自分でも試しにRocket.Chatをデプロイしてみましたが、同様の方法でできました。

「{サービス名}-published」の名前でtype:LoadBalancerのServiceまで自動で作成してくれています。これは便利!

$ kubectl get pods

NAME READY STATUS RESTARTS AGE
db-86b5bb8c7d-cp6bl 1/1 Running 0 23h
rocketchat-868d764d6d-zlhz8 1/1 Running 2 23h

$ kubectl get services

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
db ClusterIP None <none> 55555/TCP 23h
rocketchat ClusterIP None <none> 55555/TCP 23h
rocketchat-published LoadBalancer 10.107.203.249 localhost 3000:32046/TCP 23h

ただ、上記の記事と状況が違ったのはCRD(Custom Resource Definition)が出てこなかった事。バイナリレベルで統合されたんでしょうか・・・?


余談(kube-composeについて)

コンテナ一覧を見ていて気になったkube-compose。おそらくこれらがcomposeでのデプロイを可能にしているのでは?と思いもう少し見てみました。

CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS               NAMES

91571f8472c2 docker/kube-compose-api-server "/api-server --kubec…" 5 days ago Up 5 days k8s_compose_compose-api-6fbc44c575-8cbcj_docker_6f9cbdbc-c398-11e8-b684-025000000001_0
483c8c6b6dbc docker/kube-compose-controller "/compose-controller…" 5 days ago Up 5 days k8s_compose_compose-7447646cf5-mrqpl_docker_6f9de91a-c398-11e8-b684-025000000001_0

ちなみにDockerhubのリポジトリにも説明一切なし。gitのリポジトリにも出てこない。。ということでdocker imageの履歴を覗いてみました。

$ docker image ls

REPOSITORY TAG IMAGE ID CREATED SIZE
docker/kube-compose-controller v0.3.9 16260a912a7b 3 months ago 29.9MB
docker/kube-compose-api-server v0.3.9 8757267f7b06 3 months ago 42.5MB

kube-compose-api-server

$ docker history 8757267f7b06 --no-trunc

IMAGE CREATED CREATED BY SIZE COMMENT
sha256:8757267f7b0602bb4cc7824401d827f02ad7fc28a4c25597d9b36010acacbf5d 3 months ago /bin/sh -c #(nop) COPY file:e7db357c3c8a7cb5eac874ad0d2d02c211be0b996f395947b8317354de4fffae in /validate-yaml 4.84MB
<missing> 3 months ago /bin/sh -c #(nop) COPY file:955c5482c520f26c4e30aaa98406fc833d9dcfc14de6e30b1ce7612dc4573fbe in /api-server 33MB
<missing> 3 months ago /bin/sh -c #(nop) ENTRYPOINT ["/api-server"] 0B
<missing> 3 months ago /bin/sh -c apk add ca-certificates --no-cache 555kB
<missing> 8 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 8 months ago /bin/sh -c #(nop) ADD file:093f0723fa46f6cdbd6f7bd146448bb70ecce54254c35701feeceb956414622f in / 4.15MB

kube-compose-controller

$ docker history 16260a912a7b --no-trunc

IMAGE CREATED CREATED BY SIZE COMMENT
sha256:16260a912a7b6e10bf56d6b7a85ae2f6a6fbd036a17c937261bb0d96670d056d 3 months ago /bin/sh -c #(nop) COPY file:e7db357c3c8a7cb5eac874ad0d2d02c211be0b996f395947b8317354de4fffae in /validate-yaml 4.84MB
<missing> 3 months ago /bin/sh -c #(nop) COPY file:71a9ea80a2ad03c6633727b8e2c57f9cc185f5e78fad340b072d101f77e5fa06 in /compose-controller 20.4MB
<missing> 3 months ago /bin/sh -c #(nop) ENTRYPOINT ["/compose-controller"] 0B
<missing> 3 months ago /bin/sh -c apk add ca-certificates --no-cache 555kB
<missing> 8 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 8 months ago /bin/sh -c #(nop) ADD file:093f0723fa46f6cdbd6f7bd146448bb70ecce54254c35701feeceb956414622f in / 4.15MB

なんかCOPYしてる。よくわからないのでコンテナの中にも入ってみました。

$ docker exec -it k8s_compose_compose-api… /bin/sh

バイナリコピーしてただけか。だからCRDは出てこなかったのか・・?



compose-controllerも同じでした。

どうでもいいですがコンテナのOSはやっぱりAlpineでした。

/ # cat /etc/issue

Welcome to Alpine Linux 3.7
Kernel \r on an \m (\l)