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機能入っていたので試してみました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/257806/da4f2c04-7f47-a168-89d3-d5d05a3e3cad.png" width=400>

# Kubernetesのインストール
はい、これだけです。
1. 「Preference」で設定開いて「Kubernetes」メニュー選ぶ
2. 「Enable Kubernetes」チェック入れて「Kubernetes」を選択して「Apply」をクリック（swarmの選択肢は残されている）
<img src="https://qiita-image-store.s3.amazonaws.com/0/257806/c0169652-53cb-cebe-e8e5-7918dbc9036c.png" width=400>
3. 「install」でKubernetesインストール開始
<img src="https://qiita-image-store.s3.amazonaws.com/0/257806/2be72c73-e971-86ba-7b25-21803525cc63.png" width=400>
<img src="https://qiita-image-store.s3.amazonaws.com/0/257806/5165e40f-5f67-2e17-fdfd-e5698c443b66.png" width=400>

Kubernetesのインストールが正常に終わると「Kubernetes is running」の表示が出ます。あっさり。
<img src="https://qiita-image-store.s3.amazonaws.com/0/257806/b3077978-81cc-2ded-18aa-ce997e19a981.png" width=400>

# Contextの切り替え
kubectlで管理する向き先（Kubernetesの環境）を「docker-for-desktop」にしておきます。自分の場合は昔作ったminikube環境もあったのでそちらから変更。
<img src="https://qiita-image-store.s3.amazonaws.com/0/257806/845c0f43-58a1-2329-f8dd-a3f4d29af5a2.png" width=400>

# インストールの確認
### 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でデプロイします。（全部コマンドでやるんだって人は別にいらないからデフォルトで入ってないのかと。）
<a href=https://github.com/kubernetes/dashboard/blob/master/src/deploy/recommended/kubernetes-dashboard.yaml>公式のyaml</a>を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などいるなーと思っていたら<a href=https://qiita.com/uni-3/items/a4f2afa0973bfc35b498>
こちら</a>で`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
```
ちなみに<a href=https://hub.docker.com/r/docker/kube-compose-api-server/>Dockerhubのリポジトリ</a>にも説明一切なし。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は出てこなかったのか・・？
<img src="https://qiita-image-store.s3.amazonaws.com/0/257806/13c13580-463e-d239-da07-91c0a9e9358d.png" width=500>
compose-controllerも同じでした。
<img src="https://qiita-image-store.s3.amazonaws.com/0/257806/4b8c8e96-bdc8-3b1a-55f1-7470b8b106cb.png" width=500>

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

```
/ # cat /etc/issue
Welcome to Alpine Linux 3.7
Kernel \r on an \m (\l)
```