Docker for Windows で Kubernetes（1）

Laptopを新調したので、改めてDocker for Windowsを Win 10 Pro に入れてみる。ここでは以下まで。

1. 入れる
2. Dashboard出す

# 環境

* Surface Laptop ( Win 10 Pro )

![about_docker.PNG](https://qiita-image-store.s3.amazonaws.com/0/75458/af90974b-8c18-63e2-91b1-dd3d657850ac.png)

# Docker for Windows インストール
ダウンロードして、エグゼたたくだけ（Hyper-V有効化も同時に）

https://docs.docker.com/docker-for-windows/install/

# kubernetes 有効化
ボタン押すだけ

https://docs.docker.com/docker-for-windows/kubernetes/


```shell-session
PS C:\data> kubectl cluster-info
Kubernetes master is running at https://localhost:6445
KubeDNS is running at https://localhost:6445/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

PS C:\data> kubectl get node -o wide
NAME                 STATUS    ROLES     AGE       VERSION   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION         CONTAINER-RUNTIME
docker-for-desktop   Ready     master    1d        v1.10.3   <none>        Docker for Windows   4.9.93-linuxkit-aufs   docker://18.6.0

PS C:\data> kubectl get pod -o wide --all-namespaces
NAMESPACE     NAME                                         READY     STATUS    RESTARTS   AGE       IP             NODE
docker        compose-7447646cf5-bzn6g                     1/1       Running   0          1d        10.1.0.2       docker-for-desktop
docker        compose-api-6fbc44c575-h5slr                 1/1       Running   0          1d        192.168.65.3   docker-for-desktop
kube-system   etcd-docker-for-desktop                      1/1       Running   0          1d        192.168.65.3   docker-for-desktop
kube-system   kube-apiserver-docker-for-desktop            1/1       Running   0          1d        192.168.65.3   docker-for-desktop
kube-system   kube-controller-manager-docker-for-desktop   1/1       Running   0          1d        192.168.65.3   docker-for-desktop
kube-system   kube-dns-86f4d74b45-hlz9s                    3/3       Running   0          1d        10.1.0.4       docker-for-desktop
kube-system   kube-proxy-2s5j7                             1/1       Running   0          1d        192.168.65.3   docker-for-desktop
kube-system   kube-scheduler-docker-for-desktop            1/1       Running   0          1d        192.168.65.3   docker-for-desktop
```

# Dashboard

* https://github.com/kubernetes/dashboard

## デプロイ

```shell-session
PS C:\> kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
```

ローカル（Docker for Windowsを入れたLaptop）からブラウザアクセスするために以下を実施。

```shell-session
PS C:\data\dashboard> kubectl proxy
Starting to serve on 127.0.0.1:8001
```

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

へアクセス。

## Service Account 作成と、ClusterRoleのバインディング

https://github.com/kubernetes/dashboard/wiki/Creating-sample-user

```yaml:admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
```

```shell-session
PS C:\data\dashboard> kubectl apply -f .\admin-user.yaml
serviceaccount "admin-user" created
```

Docker for Windows の kubernetes では Cluster 内に一般的なツールのロールが存在している。これを使用して、作ったSAのロールバインディングのみを作成できる。

```yaml:clusterrolebind.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system
```

```shell-session
PS C:\data\dashboard> kubectl apply -f .\clusterrolebind.yaml
clusterrolebinding.rbac.authorization.k8s.io "admin-user" created
```

```shell-session
PS C:\data\dashboard> kubectl -n kube-system describe secret admin-user-token-4pcz5
Name:         admin-user-token-4pcz5
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=admin-user
              kubernetes.io/service-account.uid=47da24c7-9ad4-11e8-962d-00155d001201

Type:  kubernetes.io/service-account-token

Data
====
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Ii ＜略＞ _5ztb06m8VPnfKm1OAA
```

上記の **token:** の部分をコピーして **Kubernetes Dashboard** ログインポップアップの **Token** に入力して、**Sign in** する。

![vm_resource.PNG](https://qiita-image-store.s3.amazonaws.com/0/75458/253bc537-d8b2-60e7-bb24-1e1584604135.png)

デフォルトのVMだと、2vCPU,2GB Memoryで稼働している。上記はApp PodはDashboard以外はなにも動かしていない状態。このあと動かすとするとちょっとCPUが苦し気か・・・・

# k8s が起動しない・・・問題-1

**2018/9/11現在**

まだきっかけが不明だが、kubernetesが starting ...のままスタックしてしまうことがある。この状態だと起動していないことになる。ネットワーク周りが引っかかってるなとおもいつつ、Github見てみたら、やはり同じ現象にはまっていた人が何人もいて、ワークアラウンドを提示していた人がいたので、それを参考にしてみた。

https://github.com/docker/for-win/issues/1962#issuecomment-418152414

## ワークアラウンド手順
* Settings -> Reset ->「Reset to factory defaults...」
 * Dockerが動いているMobyLinuxVMが一度消えるので、ダウンロード済みのイメージ等全部消えるので注意
* ファイアウォールを無効化
* 再度、Enable Kubernetes

これで起動するようになる。
この後（あとじゃなくてもいいけど）vpnkit.exe をFirewallで許可アプリに設定する。

# k8s が起動しない・・・問題-2

問題-1のワークアラウンドを実施しても、PC再起動後に、同様の減少になっている場合がある。

## ワークアラウンド手順
暫定ではあるが、このときDockerはrunningだがCLIからデーモンにうまくつながらない状態になっているのであれば、DockerをRestartしてみて、きちんとデーモンへのアクセスも確認した後に、k8sをRestartするとrunningになる事がある。