Windows10 home WSL2でKubernetes

Docker DesktopとWSLの連携

Windows10のWSLで気軽にKubernetesを試せるようにしてみました。 Docker DesktopとWSLを連携して使う形を想定しています。

何かのタイミングでUbuntu-20.04を入れていたようので、こちらを使っています。

WSL+Docker: Kubernetes on the Windows Desktop | Kubernetesを参考に動作確認を始めたのですが、Dockerは最初から使えるもののKubernetesが使えませんでした。 調べてみるとWSL1のままだったので、まずWSL2に変更します。


Docker Desktopの設定画面でWSL2のDistributionが無いと言われています。 f:id:tworks55:20210417113547p:plain

以下WindowsコマンドプロンプトでVersionを確認してからVersionを変更。

C:\Users\tworks55>wsl --list --verbose
  NAME                   STATE           VERSION
* Ubuntu-20.04           Running         1
  docker-desktop         Running         2
  docker-desktop-data    Running         2

C:\Users\tworks55>wsl --set-version Ubuntu-20.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。

C:\Users\tworks55>wsl --list --verbose
  NAME                   STATE           VERSION
* Ubuntu-20.04           Stopped         2
  docker-desktop         Running         2
  docker-desktop-data    Running         2

以下はWSL1の時にWLS上のUbuntuからdockerとkubectlの動作確認をした履歴です。 WSL1から2に変更したタイミングでインスタンスが強制終了されています。

tworks55@DESKTOP:~$ docker version
Client:
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.13.8
 Git commit:        afacb8b7f0
 Built:             Tue Jun 23 22:26:12 2020
 OS/Arch:           linux/amd64
 Experimental:      false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
tworks55@DESKTOP:~$ kubectl version
kubectl: command not found
tworks55@DESKTOP:~$ Linux 用 Windows サブシステム インスタンスが強制終了されました。
Press any key to continue...

ここからはWSL2に変更されてからの履歴です。 Docker DesktopでインストールされているDistributionが選択できるようになっています。 Ubuntu-20.04しかインストールされていないので、こちらをONにしてApply&Restartをクリック。 f:id:tworks55:20210417114111p:plain

そして最初と同じようにdockerとkubectlの動作確認をしたところ、両方とも使えるようになっていました。

tworks55@DESKTOP:~$ docker version
Client:
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.13.8
 Git commit:        afacb8b7f0
 Built:             Tue Jun 23 22:26:12 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          20.10.5
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       363e9a8
  Built:            Tue Mar  2 20:15:47 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.4
  GitCommit:        05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc:
  Version:          1.0.0-rc93
  GitCommit:        12644e614e25b05da6fd08a38ffa0cfe1903fdec
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
tworks55@DESKTOP:~$ kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.7", GitCommit:"1dd5338295409edcfff11505e7bb246f0d325d15", GitTreeState:"clean", BuildDate:"2021-01-13T13:23:52Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.7", GitCommit:"1dd5338295409edcfff11505e7bb246f0d325d15", GitTreeState:"clean", BuildDate:"2021-01-13T13:15:20Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}

KubernetesHello world

Hello Minikube | Kubernetesを参考にHelloWorldをやってみます。

Deploymentの作成
tworks55@DESKTOP:~/k8s$ kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
deployment.apps/hello-node created
Serviceの作成
tworks55@DESKTOP:~/k8s$ kubectl expose deployment hello-node --type=LoadBalancer --port=8080
service/hello-node exposed
作成されたServiceの情報を確認
tworks55@DESKTOP:~/k8s$ kubectl get services
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
hello-node   LoadBalancer   10.106.118.4   localhost     8080:31279/TCP   10s
kubernetes   ClusterIP      10.96.0.1      <none>        443/TCP          10h

ブラウザでhttp://localhost:8080にアクセスする。 そうすると以下のようなレスポンスが表示されます。

CLIENT VALUES:
client_address=192.168.65.3
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://localhost:8080/

SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001

HEADERS RECEIVED:
accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding=gzip, deflate, br
accept-language=ja,en-US;q=0.9,en;q=0.8
connection=keep-alive
host=localhost:8080
sec-ch-ua="Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"
sec-ch-ua-mobile=?0
sec-fetch-dest=document
sec-fetch-mode=navigate
sec-fetch-site=none
sec-fetch-user=?1
upgrade-insecure-requests=1
user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36
BODY:
-no body in request-

クリーンアップ

以下のコマンドを実行し作成されたServiceなどを削除します。

tworks55@DESKTOP:~/k8s$ kubectl delete service hello-node
l delete deployment hello-nodeservice "hello-node" deleted
tworks55@DESKTOP:~/k8s$ kubectl delete deployment hello-node
deployment.apps "hello-node" deleted

実際にやってみると基本的な環境構築はそんなに難しいものではないことがわかりますね。 MacじゃなくてもWindowsで結構いろいろな作業はできそうなことがわかりました。