Docker for WindowsでKubernetesを試してみる

# はじめに

Docker for Macでのkubernetesの記事は多々あるのに、windowsは見当たらなかったので記載しておきます。
~~Windows版は、まだEdgeでの提供となっています。~~
stableバージョンでkubernetes使えます！
参考：https://blog.docker.com/2018/07/kubernetes-is-now-available-in-docker-desktop-stable-channel/

いつもは、そのままGKE環境で実行していましたが、今後勉強会等でもっと簡単に試せないかなーと、試しに動かしてみました。

# インストール

## インストール環境

- Windows 10  ( CPU：Core i7、メモリ：16GB)
- Hyper-V 有効化済み

## ダウンロード

下記ページの `download.docker.com` のリンクをクリックしてダウンロードします。 
https://docs.docker.com/docker-for-windows/install
> If you haven’t already downloaded the installer (Docker for Windows Installer.exe), you can get it from download.docker.com. It typically downloads to your Downloads folder, or you can run it from the recent downloads bar at the bottom of your web browser.

## インストーラーの実行

windowsコンテナは使う予定は、無いので、下のチェックボックスはオフのまま進みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/85cd5804-7197-0339-0e42-53040741accf.png)

「OK」ボタンを押すと、何やらインストール開始されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/dd0a2559-d1e6-fae1-5f95-aabcd062ed6c.png)

1分程度で、インストール完了します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/93f36bbe-fa88-f4ad-e364-572c7c54fd3f.png)

「Docker for Windows」をクリックすると起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/ab8d8154-74b8-e5f8-c468-ad6c7c85bfbb.png)

# kubernetesの実行

## kubernetesの有効化

常駐しているdockerアイコンを→クリックして、「Settings」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/73dcc9bb-e620-592b-857d-e561231e3c97.png)

「Enable Kubernetes」にチェックを入れて、Swarmではなく、kubernetesを選択します。そして「Apply」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/874e8a1f-d526-f730-eb49-ebe8990c5f42.png)

「数分時間かかるよ！インターネットに接続できている環境で実行してね！」と出ますが、問題ないので「Install」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/4fe7cc30-0eac-076d-0858-2071c7af3c9c.png)

2,3分で下記画面が表示されて、インストール完了となります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/99ae33f1-0799-57d0-823d-6062ece16a26.png)

## Docker for Windowのkubernetesを使う準備
下記説明があります。
https://docs.docker.com/docker-for-windows/#kubernetes
> The Kubernetes client command, kubectl, is included and configured to connect to the local Kubernetes server. If you have kubectl already installed and pointing to some other environment, such as minikube or a GKE cluster, be sure to change context so that kubectl is pointing to docker-for-desktop:
>
> ```
> kubectl config get-contexts
> kubectl config use-context docker-for-desktop
> ```

私の環境だと、GKEクラスタに接続するための設定が有効となっていますので、上記コマンドを実行してdocker for windowsのcontextに切り替えます。

# アプリケーション実行

## アプリケーションのビルド
どうせなら、自分で作ったアプリケーショを動かしたいので、適当なサンプルアプリケーション使います。

```
> git clone -b openjdk11 https://github.com/h-r-k-matsumoto/spring-boot-sample.git
> cd spring-boot-sample
> mvn -Dgcp.project.name=sample-project  compile jib:dockerBuild
```
※registryにpushはしないので、 `jib:dockerBuild` とします。

正常に終了すれば、 `docker images` でビルド結果を確認できます。

```
>docker images |findstr spring-boot
gcr.io/sample-project/spring-boot-sample   0.1.0-SNAPSHOT      4cc738f189da        46 seconds ago      997MB
>
```

## アプリケーションのデプロイ

`kubernetes/020_deployments.yml` のimages部分を下記のように変更します。

```
変更前：image: gcr.io/{change-me-gcp-project}/spring-boot-sample:0.1.0-SNAPSHOT
変更後：image: gcr.io/sample-project/spring-boot-sample:0.1.0-SNAPSHOT
```

docker imageもローカルのimage使うので、reigstryから不要に取得しないようにします。

```
変更前：imagePullPolicy: Always
変更後：imagePullPolicy: IfNotPresent
```

applyします。　

```
> kubectl apply -f kubernetes
configmap "spring-boot-config" created
deployment.apps "spring-boot-sample" created
service "spring-boot-sample" created
>
```

## アプリケーション動作確認

### NodePortでのアクセス。

下記URLにアクセスすることで正常に動作しているのを確認しました。
http://localhost:30000/sample/hello

# おまけ

## Ingressも動かしてみる

ingressもできるのかな？1つしかサービス作ってないですけど試しにやってみます。

https://github.com/docker/for-win/issues/1901

を見る限りできそうですね。

### Ingress Controllerの作成

```
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/cloud-generic.yaml
```

### Ingress作成

```040_ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: samplelb
spec:
  backend:
    serviceName: spring-boot-sample
    servicePort: 30000
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: spring-boot-sample
          servicePort: 30000

```

applyします。

```
> kubectl apply -f kubernetes\040_ingress.yaml
ingress.extensions "samplelb" created
>
```

### 動作確認

```
> kubectl get ingress
NAME       HOSTS     ADDRESS     PORTS     AGE
samplelb   *         localhost   80        18m

>
```

http://localhost:30000/sample/hello
下記URLで問題なく動作しました。

kubernetesも一通り動かす事ができそうです。ロール周りは、あんまり細かい事はできなさそうですが、動かす分には十分かもしれません。

# 変更履歴
## 2018/08/12 21:22
Docker for Windows stableバージョンでkubernetes利用可能となっていました！
全体的に記事もstableバージョンでのインストール方法等に変更しています。問題なく、アプリケーション起動、ingressの動作確認まで行えました。
rubytomato@github さん情報ありがとうございます:grinning: