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サブシステムを有効化する。
(再起動を求められるので、再起動しましょ)

●vmcompute.exeのCFG設定

ローカルPCにてスタートボタンをクリックし、設定画面を開いて以下に移動する
「更新とセキュリティ」⇒「Windowsセキュリティ」⇒「アプリとブラウザの制御」⇒「Exploit protection の設定」⇒「プログラム設定」
vmcompute.exeの編集画面から「制御フローガード(CFG)」⇒「厳密なCFGを使用する」のチェックを外す。

(再起動を求められるので、再起動しましょ)

ここまで出来たら、次にDocker DesktopとWSLをインストールする。

●Docker Desktopインストール

今回はKubernetes1.18を使いたいので、1.18が対応されているDocker Desktop 2.4.0.0をダウンロードしてインストールしよう
ダウンロード:Docker Desktop2.4.0.0
インストールの時やインストール後、バージョンアップ画面が出たら、Skipをする。
Docker Desktopバージョンによって対応されているkubernetesのバージョンが異なるので、アップデートしたらダメ!

インストール時に以下の画面が出たら、「Install required Windows compomnets for WSL 2」を外してインストールする。
そもそもWindows 10 Pro(Edition:1909)でWSL2は使えない。
WSL2を使うためにはbuild editionが2004以上のものにアップデートしないといけないし、
WSL2を使ってみたけど、なんか怪しい気がするのでここでWSL2は使わない。

次の画面が出たら、インストール完了~

インストール完了後、勝手にDocker Desktopが起動されるはずだが、
じゃない場合はデスクトップからDocker Desktopアイコンをクリックして起動させる。
kubernetes使用のため、次の画面でSettingsボタンをクリックして諸々設定を行う。

General画面で以下の項目のチェックを外す。
●automatically check for updates
●Use the WSL 2 based engine

Kubernetes画面で以下の項目のチェックを入れる。
●Enable Kubernetes

「Apply & Restart」をクリックして、以下の画面が出たら、installをクリックしてkubernetesをインストールする。

Kubernetes初期化のため、Docker Desktopが色々頑張っているので、終わるまで待つ!

以下の画面のように「Start a Kubernetes single-node cluster when starting Docker Desktop.」が表示されたら、終わり~

●WSLインストール

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

デスクトップの検索バーにてstoreを検索してMicrosoft Storeを実行する。
Store画面にて検索バーから「wsl」を検索する。

ここではUbuntu 18.04 LTSを使うので、該当画面をクリックしよ

インストールボタンをクリックしてインストールする。
Mircrosoftのログイン画面が表示されるけど、ログインしなくてもいいので、ログイン画面は閉じる。
インストールが終わったら、次の画面で「起動」ボタンをクリックしてWSLを起動する。

起動後、しばらく待つとユーザー作成画面が表示されるので、好みのユーザー名でユーザーを作成する

ユーザー作成が終わって、以下の画面みたいに表示されたら、WSL使用が可能になる。

●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を作成してデプロイしてみよう!