DockerDesktop(Kubernetes) + WSL環境構築

ローカルPCにDcokerDesktopとWSLをインストールし、
Kubernetesをローカル環境で使ってみよう！

##■環境
**ローカルPCのOS：Windows 10 Pro(Edition：1909)**
**Docker Desktopバージョン：2.4.0.0（Kubernetes1.18.8）**
**WSL種別：Ubuntu 18.04 LTS**

環境構築のため、Docker DesktopとWSLをインストールする必要があるが、
先にローカルPCにて以下の設定をしないといけない。

###●Hyper-V有効化、Linux用Windowsサブシステム有効化
ローカルPCにてスタートボタンをクリックし、設定画面を開いて以下に移動する
「アプリ」⇒「プログラムと機能」⇒「Windowsの機能の有効化または無効化」
リストからHyper-VとLinux用Windowsサブシステムを有効化する。
（再起動を求められるので、再起動しましょ）
![local_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/d28ca033-62cb-04ea-cace-b00d2d3a1a80.png)

###●vmcompute.exeのCFG設定
ローカルPCにてスタートボタンをクリックし、設定画面を開いて以下に移動する
「更新とセキュリティ」⇒「Windowsセキュリティ」⇒「アプリとブラウザの制御」⇒「Exploit protection の設定」⇒「プログラム設定」
vmcompute.exeの編集画面から「制御フローガード（CFG）」⇒「厳密なCFGを使用する」のチェックを外す。
![cfg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/58995df7-ec31-07af-bc07-0c923cc2d18b.png)
（再起動を求められるので、再起動しましょ）

ここまで出来たら、次にDocker DesktopとWSLをインストールする。
###●Docker Desktopインストール
今回はKubernetes1.18を使いたいので、1.18が対応されているDocker Desktop 2.4.0.0をダウンロードしてインストールしよう
ダウンロード：[Docker Desktop2.4.0.0](https://desktop.docker.com/win/stable/48506/Docker%20Desktop%20Installer.exe)
インストールの時やインストール後、バージョンアップ画面が出たら、Skipをする。
Docker Desktopバージョンによって対応されているkubernetesのバージョンが異なるので、アップデートしたらダメ！
![dockerdesktop_no_update.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/962ec0b3-2759-beb9-a644-22dcd07f9ab2.png)

インストール時に以下の画面が出たら、「Install required Windows compomnets for WSL 2」を外してインストールする。
そもそも**Windows 10 Pro(Edition：1909)**でWSL2は使えない。
WSL2を使うためにはbuild editionが2004以上のものにアップデートしないといけないし、
WSL2を使ってみたけど、なんか怪しい気がするのでここでWSL2は使わない。
![dockerdesktop_install_start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/4d471f4f-fda3-ce05-6818-af82c65c0113.png)

次の画面が出たら、インストール完了～
![dockerdesktop_install_end.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/a0582926-7b1a-f2f0-cc1b-4c7ffe1ee0fe.png)

インストール完了後、勝手にDocker Desktopが起動されるはずだが、
じゃない場合はデスクトップからDocker Desktopアイコンをクリックして起動させる。
kubernetes使用のため、次の画面でSettingsボタンをクリックして諸々設定を行う。
![dockerdesktop_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/4f46ce9d-0f70-408a-c0c5-d028a107ac96.png)

General画面で以下の項目のチェックを外す。
●automatically check for updates
●Use the WSL 2 based engine
![dockerdesktop_setting_general.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/cbef0b5c-1afb-e297-0f52-6232f1265fec.png)

Kubernetes画面で以下の項目のチェックを入れる。
●Enable Kubernetes
![dockerdesktop_setting_kubernetes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/db3b4a50-ce60-5780-d40d-b448e93fafff.png)
「Apply & Restart」をクリックして、以下の画面が出たら、installをクリックしてkubernetesをインストールする。
![dockerdesktop_setting_kubernetes_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/30879910-d1b4-caa5-3e7c-717041c0fb7c.png)

Kubernetes初期化のため、Docker Desktopが色々頑張っているので、終わるまで待つ！
![dockerdesktop_setting_kubernetes_install2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/d0a681e2-7c65-a03c-1c3d-cada7417f056.png)

以下の画面のように「Start a Kubernetes single-node cluster when starting Docker Desktop.」が表示されたら、終わり～
![dockerdesktop_setting_kubernetes_install3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/f57fb187-e074-fc03-6dc2-fe954b360345.png)

###●WSLインストール
WSLをローカルPCに入れなくても実はWindowsのcliでDocker Desktopで設置したkubernetesの操作はできるが、
Windows野郎のcliではできないことが多すぎて個人的には使い勝手が悪すぎる:pensive:
なので、Linux様のcliが使えるwslをインストールするぞ！

デスクトップの検索バーにてstoreを検索してMicrosoft Storeを実行する。
Store画面にて検索バーから「wsl」を検索する。
![wsl_search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/02388535-d85c-5194-79b2-222675c152b5.png)
ここではUbuntu 18.04 LTSを使うので、該当画面をクリックしよ
![wsl_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/30dfbb10-405b-088d-278f-c1ff1410fe79.png)
インストールボタンをクリックしてインストールする。
Mircrosoftのログイン画面が表示されるけど、ログインしなくてもいいので、ログイン画面は閉じる。
インストールが終わったら、次の画面で「起動」ボタンをクリックしてWSLを起動する。
![wsl_run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/7f024782-9a0f-3f1b-3428-900602f29aa9.png)
起動後、しばらく待つとユーザー作成画面が表示されるので、好みのユーザー名でユーザーを作成する
![wsl_createuser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/967d697a-1be0-dc18-b9df-5893443d33ef.png)
ユーザー作成が終わって、以下の画面みたいに表示されたら、WSL使用が可能になる。
![wsl_createuserend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557274/8744d36e-400a-c51c-a7df-ebc7e8fda510.png)

###●Kubernetesの初期設定
ここからの作業はすべて設置したWSLにてroot権限で行う

```
#root権限に変更
sudo su -

# 一応、最新に更新
root@wsl:~# apt-get update

# cliでjqが使いたいので、jqインストール
root@wsl:~# apt-get -y install jq

# kubectlコマンドのリンク作成
# Docker Desktop設置時にkubectlコマンドも設置されるので、windowsのkubectlを使う
root@wsl:~# ln -s /mnt/c/'Program Files'/Docker/Docker/resources/bin/kubectl.exe /usr/local/bin/kubectl

# dockerイメージ作成もしたいので、dockerコマンドのリンク作成
# Docker Desktop設置時にdockerコマンドも設置されるので、windowsのdockerを使う
root@wsl:~# ln -s /mnt/c/'Program Files'/Docker/Docker/resources/docker.exe  /usr/local/bin/docker

# kubectlのバージョン確認
root@wsl:~# kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.8", GitCommit:"9f2892aab98fe339f3bd70e3c470144299398ace", GitTreeState:"clean", BuildDate:"2020-08-13T16:12:48Z", GoVersion:"go1.1
3.15", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.8", GitCommit:"9f2892aab98fe339f3bd70e3c470144299398ace", GitTreeState:"clean", BuildDate:"2020-08-13T16:04:18Z", GoVersion:"go1.1
3.15", Compiler:"gc", Platform:"linux/amd64"}

root@wsl:~# kubectl get all -A
NAMESPACE     NAME                                         READY   STATUS    RESTARTS   AGE
kube-system   pod/coredns-66bff467f8-rcb9z                 1/1     Running   1          116m
kube-system   pod/coredns-66bff467f8-xlvmg                 1/1     Running   1          116m
kube-system   pod/etcd-docker-desktop                      1/1     Running   1          115m
kube-system   pod/kube-apiserver-docker-desktop            1/1     Running   1          115m
kube-system   pod/kube-controller-manager-docker-desktop   1/1     Running   1          114m
kube-system   pod/kube-proxy-pzsrk                         1/1     Running   1          116m
kube-system   pod/kube-scheduler-docker-desktop            1/1     Running   1          115m
kube-system   pod/storage-provisioner                      1/1     Running   2          114m
kube-system   pod/vpnkit-controller                        1/1     Running   1          114m

NAMESPACE     NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP                  116m
kube-system   service/kube-dns     ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   116m

NAMESPACE     NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-system   daemonset.apps/kube-proxy   1         1         1       1            1           kubernetes.io/os=linux   116m

NAMESPACE     NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/coredns   2/2     2            2           116m

NAMESPACE     NAME                                 DESIRED   CURRENT   READY   AGE
kube-system   replicaset.apps/coredns-66bff467f8   2         2         2       116m

# nginx ingressを使うため、nginx ingress controller設置
root@wsl:~# kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/cloud/deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
configmap/ingress-nginx-controller created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
service/ingress-nginx-controller-admission created
service/ingress-nginx-controller created
deployment.apps/ingress-nginx-controller created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
serviceaccount/ingress-nginx-admission created

# nginx ingress controller配置確認
root@wsl:~# kubectl get all -n ingress-nginx
NAME                                           READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-97cx2       0/1     Completed   0          80s
pod/ingress-nginx-admission-patch-ccrd4        0/1     Completed   0          80s
pod/ingress-nginx-controller-c96557986-bjkcd   0/1     Running     0          90s

NAME                                         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             LoadBalancer   10.102.159.223   localhost     80:31924/TCP,443:31964/TCP   90s
service/ingress-nginx-controller-admission   ClusterIP      10.108.94.107    <none>        443/TCP                      90s

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   0/1     1            0           90s

NAME                                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-c96557986   1         1         0       90s

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           21s        90s
job.batch/ingress-nginx-admission-patch    1/1           26s        90s
root@wsl:~#

```

これで、環境構築は完了！
デプロイしたいアプリケーションに合わせてDocker Imageやyamlを作成してデプロイしてみよう！