今更ですが Docker Desktop から WSL2 Ubuntu Docker kind に変更してみました（その１）

2023/07/13 Docker、Kubernetes、Kind、kubectl の導入コマンドを最新内容に更新

## Docker Desktop を使っていましたが。。

Docker Desktop の有償化後、漸く会社の Windows パソコンがリフレッシュされる事になり、開発テスト環境を Docker Desktop から WSL2 に変更したので、WSL2 での Ubuntu および Kubernetes 環境の構築手順（インストール・設定、バックアップ・レストア など）をまとめました。
本稿の内容は Ubuntu と Docker、およびコンテナオーケストレーションは kind（https://kind.sigs.k8s.io/ ）を使用した構成になります。kind (Kubernetes in Docker) は名前の通り Kubernetes の各ノードをコンテナで実現する軽量なコンテナオーケストレーション環境であり、開発時の単体テストなどに適したツールです。

WSL の前提は Windows 10 バージョン 2004 以降 (ビルド 19041 以降) または Windows 11 となっています。
今回検証した Windows と Ubuntu のバージョンは、Windows 10 バージョン 21H2（OSビルド 19044.1645）および Ubuntu 20.04.4 LTS です。

## Windows の事前準備
「コントロールパネル - プログラムと機能 - Windows の機能の有効化または無効化」で（コントロール パネルの表示はファイルエクスプローラーに、コントロール パネル と入力）、**「仮想マシン プラットフォーム」および「Linux 用 Windows サブシステム」にチェック**を入れ OS の指示に従い必要に応じて再起動を行います。
![クリップボード01_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475210/a144cf88-d7d7-88f8-027a-3ca0c34aeb88.jpeg)
**※ Hyper-V は特に必要ありません。** 私は VMware Workstation Player も使用しているため、Hyper-V は使用しないのと同時に以下の点に注意しています。
・WSL を起動にする前に VMware Workstation Player のゲストOS の電源を切る
・上記の逆で、VMware を起動する前には WSL をシャットダウンする
・VMware Workstation Player の設定で「Intel VT-x/EPTまたはAMD-V/RVIを仮想化」のチェックを外す

## Ubuntu のインストールとWSL の設定
Microsoft Store で Ubuntu を検索して入手します。**インストール完了後もまだ開始しないでください！**
※ 2022年5月現在で Ubuntu のバージョンは 18.04.5、20.04.4、22.04 が選択可能です。
![クリップボード02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475210/893d320f-b3ca-18d2-8792-6c9ddb8fb452.jpeg)

次に Windows PowerShell を**管理者で起動して** WSL の更新、および Ubuntu が動作する WSL のバージョンを変更します。
```
PS C:\> wsl --update
```
```
PS C:\> wsl --shutdown
```
```
PS C:\> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         1
```
この時点では WSL のバージョンは 1 になっているので、WSL のバージョンを 2 に変更します。
```
PS C:\> wsl --set-version Ubuntu-20.04 2
```
再度 WSL の状態・バージョンを表示して変更された事を確認します。 
```
PS C:\> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2
```
これで WSL2 で Ubuntu を起動する準備が整いました。Windows のメニューに Ubuntu が追加されているので起動して root 以外のユーザー、パスワードを設定します。

## Docker のインストール
起動した Ubuntu に Docker 公式ドキュメント（https://docs.docker.com/engine/install/ubuntu/ ）の手順で Docker をインストールします。
```
まずは更新
$ sudo apt update
```
```
インストールに必要なパッケージ
$ sudo apt-get install ca-certificates curl gnupg
```
```
Docker の公式 GPG キー
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg
```
```
Docker のパッケージリポジトリを追加
$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
```
最新版 Docker のインストール（ Docker Compose は省略 ）
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
```
Docker サービスを起動します。
```
$ sudo service docker start
```
HelloWorld コンテナを run してみます。
```
$ sudo docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
・・・<省略>・・・
Hello from Docker!
This message shows that your installation appears to be working correctly.
・・・<省略>・・・
```
以降 sudo なしで docker コマンドを使用するために Ubuntu 実行ユーザーを docker グループに追加します。
```
$ sudo usermod -aG docker $USER

設定を有効にするため一旦 Ubuntu を exit
$ exit

Ubuntu 再起動後は Docker の起動も忘れずに
```
ここまでの手順で Docker を利用する環境が整いました。続いて kind (Kubernetes in Docker) のインストールを行います。

## kind (Kubernetes in Docker) のインストール
kind に関するコマンドは基本的にこのドキュメント（https://kind.sigs.k8s.io/ ）を参照しています。
kind の前に kubectl を入れておきます。
```
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
```
kind のインストール
```
$ [ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
$ chmod +x ./kind
$ sudo mv ./kind /usr/local/bin/kind
```
## kind クラスター生成
以下 1つのコマンドで（簡単なテスト環境であれば単純な設定YAMLファイルで）クラスター生成が可能です。
以下の例ではコントロールプレーン マスターノードと 1つのワーカーノードが作成されます。
```:YAMLファイルの例：mycluster.yml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
```
```
$ kind create cluster --config mycluster.yml
```
クラスターが作成されたら node や pod を確認してみます。
```
$ kubectl get node -o wide
$ kubectl get pods --all-namespaces -o wide
```
## 動作確認
ここまでの手順で簡易検証用のコンテナオーケストレーション環境が出来た筈なので例によって nginx を動かしてみます。
```
$ kubectl create deployment --image nginx mynginx
```
kind を入れただけではロードバランサーが使えないのでとりあえず NodePort を作成し、アサインされたポートを確認します（この例では 30005 ）。
ロードバランサー（ MetalLB ）については後続の記事で・・
```
$ kubectl expose deployment mynginx --port 80 --type=NodePort
$ kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        56m
mynginx      NodePort    10.96.145.251   <none>        80:30005/TCP   39m
```
ワーカーノードの IPアドレスを確認します。（この例では 172.18.0.2 ）
```
$ kubectl get node -o wide
NAME                 STATUS   ROLES                  AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE       KERNEL-VERSION                       CONTAINER-RUNTIME
kind-control-plane   Ready    control-plane,master   49m   v1.23.4   172.18.0.3    <none>        Ubuntu 21.10   5.10.102.1-microsoft-standard-WSL2   containerd://1.5.10
kind-worker          Ready    <none>                 49m   v1.23.4   172.18.0.2    <none>        Ubuntu 21.10   5.10.102.1-microsoft-standard-WSL2   containerd://1.5.10
```
curl コマンドで nginx の動作を確認します。
```
$ curl -I 172.18.0.2:30005
HTTP/1.1 200 OK
Server: nginx/1.21.6
・・・<省略>・・・
```
## まとめ
Docker Desktop も WSL2 環境からはかなり軽量化されていましたが、本手順で構成した環境はそれよりも更に軽く動作する印象です。kind は開発時などの検証用という位置付けのツールですが、会社のオフィス PC が Windows で私のような「なんちゃって開発者」にとっては、WSL2 Ubuntu 環境は PC を圧迫しない有難い環境と言えそうです。
本稿では書ききれなかった kind 環境でのロードバランサーや、WSL2 のバックアップ・レストア、その他 Hint&tips などの内容は後続の記事にまとめていく予定です。