Docker for MacはKubernetes for Macだった！？　入門してみた。

気になっていたKubernetesをDocker for Macでローカル実行できると聞いて、入門してみました。
Docker for Macの公式ドキュメントに準じてやっていきます。
[Get started with Docker for Mac #Kubernetes | Docker Documentation](https://docs.docker.com/docker-for-mac/#kubernetes)
[Deploy on Kubernetes | Docker Documentation](https://docs.docker.com/docker-for-mac/kubernetes/)

Kubernetesって何？という方は以下の記事を読んでみてください。
[Docker（コンテナ型仮想化）と Kubernetes についての簡単な紹介](https://ubiteku.oinker.me/2017/02/21/docker-and-kubernetes-intro/)
[今さら人に聞けない Kubernetes とは？](https://qiita.com/MahoTakara/items/85096f8b2632c802ab22)
[3分で分かった気になる、Kubernetes とは？](https://qiita.com/r548/items/e6d1e4dcfdd9f8a7874d)

## 実行環境
- macOS High Sierra(10.13.4)
- Docker for Mac (edge) 18.05.0-ce

## Dockerインストール
今回初めて知りましたが、Docker for Macは安定版(Stable)と実験版(Edge) の2種類リリースされています。
Docker公式のアナウンスによると、Kubernetesはまだ、Edge版にしか含まれていないため、Stable版を使用している人でも新しくインストールする必要があるようです。
> Kubernetes is only available in Docker for Mac 17.12 CE and higher, on the Edge channel. Kubernetes support is not included in Docker for Mac Stable releases. To find out more about Stable and Edge channels and how to switch between them, see General configuration.

引用元: [docker docs: Deploy on Kubernetes](https://docs.docker.com/docker-for-mac/kubernetes/)



以下リンクからEdge版をDL&インストールしましょう。
[Docker Store](https://store.docker.com/editions/community/docker-ce-desktop-mac)

既にDocker for MacのStable版を使用されている方は、アプリを置き換えると、imageやコンテナが初期化されてしまうので、注意してください。

<img width="779" alt="Docker_Community_Edition_for_Mac_-_Docker_Store.png" src="https://qiita-image-store.s3.amazonaws.com/0/194498/95fd6d8b-d8c4-3fda-7ea1-4353243d8128.png">


無事インストール後、About Dockerを開くと以下のように、Kubernetesが含まれているのが分かるかと思います。


<img width="584" alt="About_Docker.png" src="https://qiita-image-store.s3.amazonaws.com/0/194498/02f9da41-afd8-8bf9-3ea1-2e3d98c5d428.png">


## Kubernetes有効化
PreferenceからKubernetesを選択し、有効化しましょう。
以下のように、Enable Kubernetesにチェックを入れ、Applyします。

<img width="500" alt="Kubernetes.png" src="https://qiita-image-store.s3.amazonaws.com/0/194498/93aff289-1dcc-07c7-e8fe-4b046f3f980d.png">

有効化すると、数分Kubernetesのインストールが走ります。

インストール完了後に、ターミナルを開きます。
Kubernetes 操作用の`kubectl`というコマンドが使用できるようになっています。

```console
$ which kubectl
/usr/local/bin/kubectl
```

※homebrewなどでインストール済みの場合はコンフリクトが発生するようです。
そのため、`/usr/local/bin/kubectl`をKubernetesインストール前に削除しておく必要があります。

## Kubernetesクラスタ設定

以下のコマンドで使用するクラスタがdocker-for-desktopになっているかを確認します。
CURRENT欄に`*`がついているものが現在使用対象となるクラスタになります。

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

この場合は、このままで大丈夫ですが、今回の方法以外で既にkubectlを使用していた場合は`minikube`など他のクラスタになっている場合があるそうです。
その時は、以下のコマンドを使って`docker-for-desktop`に切り替えましょう。

```console
$ kubectl config use-context docker-for-desktop
```

なお、Dockerのメニューからも切り替えができるようです。
<img width="390" alt="スクリーンショット_2018-05-02_14_10_30.png" src="https://qiita-image-store.s3.amazonaws.com/0/194498/3a95af86-c5c0-83f2-4f23-064ff58b4521.png">


## 確認
ノード一覧を呼び出すと、master(作業中のPC上)で、docker-for-desktopが走っているのがわかります。
これで、Kubernetesを使用できるようになりました。

```console
$ kubectl get nodes
NAME                 STATUS    ROLES     AGE       VERSION
docker-for-desktop   Ready     master    3h        v1.9.6
```

## docker composeでデプロイ
それでは、Kubernetesを使ってアプリをデプロイしていきましょう！
方法としては以下の2種類だそうです
- docker-compose.ymlを使う
- Kubernetes用の記法で書かれたマニフェストファイル(*.yml)を使う

まずはdocker-compose.ymlでやりましょう。

```yaml:docker-compose.yml
version: '3.3'

services:
  web:
    build: web
    image: dockerdemos/lab-web
    ports:
     - "80:80"

  words:
    build: words
    image: dockerdemos/lab-words
    deploy:
      replicas: 5
      endpoint_mode: dnsrr
      resources:
        limits:
          memory: 16M
        reservations:
          memory: 16M

  db:
    build: db
    image: dockerdemos/lab-db

```

ファイルを作ったら、デプロイします。

```console
$ docker stack deploy --compose-file ./docker-compose.yml mystack
Ignoring unsupported options: build

Stack mystack was updated
Waiting for the stack to be stable and running...
 - Service db has one container running
 - Service words has one container running
 - Service web has one container running
Stack mystack is stable and running
```

以下コマンドでデプロイできているか確認しましょう。

```console
$ docker stack services mystack
ID                  NAME                MODE                REPLICAS            IMAGE                   PORTS
9427fd5a-4dc        mystack_db          replicated          1/1                 dockerdemos/lab-db      
942d4cd9-4dc        mystack_web         replicated          0/0                 dockerdemos/lab-web     *:80->80/tcp
942d4cd9-4dc        mystack_web         replicated          0/0                 dockerdemos/lab-web     *:80->80/tcp
942d4cd9-4dc        mystack_web         replicated          0/0                 dockerdemos/lab-web     *:80->80/tcp
9444649f-4dc        mystack_words       replicated          5/5                 dockerdemos/lab-words
```

無事立ち上がっているようなので、アクセスしましょう。
[http://127.0.0.1](http://127.0.0.1)

以下のように画面が表示されたら成功です。
<img width="720" alt="dockercon_EU_17.png" src="https://qiita-image-store.s3.amazonaws.com/0/194498/44ce3e64-8818-5a45-515f-b2c53135c47a.png">

## Kubernetesのマニフェストファイルでデプロイ
今度はKubernetesのマニフェストファイルを使うやり方です。
ここは、Dockerの公式ドキュメントに載っていなかったため、先程のアプリとは異なりますが、Githubにサンプルがあったので、そちらを使います。

[GitHub - kubernetes/dashboard: General-purpose web UI for Kubernetes clusters](https://github.com/kubernetes/dashboard)

[マニフェストファイルサンプル](https://github.com/kubernetes/dashboard/blob/master/src/deploy/recommended/kubernetes-dashboard.yaml)

```console
$  kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
secret "kubernetes-dashboard-certs" created
serviceaccount "kubernetes-dashboard" created
role "kubernetes-dashboard-minimal" created
rolebinding "kubernetes-dashboard-minimal" created
deployment "kubernetes-dashboard" created
service "kubernetes-dashboard" created

$ kubectl proxy
Starting to serve on 127.0.0.1:8001
```

成功していれば、以下URLからローカルのKubernetesをダッシュボード化したアプリを確認できます。
[http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/](http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/)

<img width="1263" alt="スクリーンショット 2018-05-02 18.44.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/194498/be9b3f71-36b1-b7c0-33b4-fd51e1e728eb.png">



## 最後に
色々なサイトを参考にしながら、簡単なアプリをKubernetes上で動かすところまでやってみました。
Kubernetes自体骨太なので、理解するのにはまだまだ触る必要があると感じました。

### 参考リンク
[Kubernetes公式サイト](https://kubernetes.io/)
[Kubernetes: Deployment の仕組み](https://qiita.com/tkusumi/items/01cd18c59b742eebdc6a)
[和訳 デスクトップ向けDockerでのDocker ComposeとKubernetes #docker #kubernetes #k8s](https://www.creationline.com/lab/20578)
[Docker for MacでKubernetes インストールからデプロイまで](https://qiita.com/uni-3/items/a4f2afa0973bfc35b498)