WSL上でkindを使用したKubernetes環境構築


- 概要

  - Windows 10 HomeでWSL2環境にてMulti-nodeのKubernetes検証用の環境構築する
  - kubectlコマンドが使えるようにする
  - 必要なモジュールはバイナリファイルを使用する

## 前提条件

- WSLが有効になっていること

## 事前準備

- 使用しているWSLのLinux環境の確認する

```bash
cat /etc/os-release
```

- 実行結果
```bash
PRETTY_NAME="Ubuntu 24.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.1 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
```

- パッケージのアップデートをする

```bash
sudo apt update && sudo apt upgrade -y
```

- cgroup v2が有効になっているか確認する

```bash
stat -fc %T /sys/fs/cgroup/
```

実行結果
```bash
tmpfs
```

- .wslconfigを作成してcgroup v2が有効になるようにKernelパラメータを設定する

```bash
echo -e "[wsl2]\nkernelCommandLine = cgroup_no_v1=all systemd.unified_cgroup_hierarchy=1" | tee .wslconfig
```

実行結果
```bash
[wsl2]
kernelCommandLine = cgroup_no_v1=all systemd.unified_cgroup_hierarchy=1
```

- 設定を反映するためにWSLから一旦抜ける

```bash
exit
```

- WSLのOSを停止する

```bash
wsl --shutdown
```

- 再度、WSL環境にログインする

```bash
wsl
```

- cgroup v2が有効になっているか、再度確認する

```bash
stat -fc %T /sys/fs/cgroup/
```

実行結果
```bash
cgroup2fs
```

## Go言語をインストール

- Kindをインストールする際の要件にgo 1.16以上と記載があったためGo言語をインストールする

- 作業ディレクトリを作成し、作業ディレクトリに移動する

```bash
cd ~ && mkdir work && cd work/
```

- 2025年1月18日現在、Go言語の最新版が1.23.5をインストールする


- Go言語バイナリファイルをダウンロードする

```bash
wget https://go.dev/dl/go1.23.5.linux-amd64.tar.gz
```

- ダウンロードしたファイルが破損等していないか確認する

```bash
sha256sum go1.23.5.linux-amd64.tar.gz
```

- SHA256 Checksumの結果をGo言語のダウンロードページに記載されている値と比較する

実行結果
```bash
cbcad4a6482107c7c7926df1608106c189417163428200ce357695cc7e01d091  go1.23.5.linux-amd64.tar.gz
```

- Go言語のアーカイブファイルを/usr/local/src/に展開する

```bash
sudo tar Cxzvf /usr/local/src/ go1.23.5.linux-amd64.tar.gz
```

- Go言語のコマンドを使用するためにPATHを通す

```bash
echo 'export PATH=$PATH:/usr/local/src/go/bin' | tee -a ~/.bashrc
```

- .bashrcに設定が反映されているか確認する

```bash
tail -n1 ~/.bashrc
```

- 現在使用しているシェルに環境変数を反映する

```bash
source ~/.bashrc
```

- インストールされているGo言語のバージョン確認する

```bash
go version
```

実行結果
```
go version go1.23.5 linux/amd64
```

## nerdctlのインストール

- kindのインストール条件に、docker、podmanまたはnerdctlの記載があるため、今回はnerdctlをインストールする

- 今回はnerdctlのnerdctl-fullバイナリファイルをダウンロードする

```bash
wget https://github.com/containerd/nerdctl/releases/download/v2.0.2/nerdctl-full-2.0.2-linux-amd64.tar.gz
```

- SHA256SUMSを確認するファイルをダウンロードする

```bash
wget https://github.com/containerd/nerdctl/releases/download/v2.0.2/SHA256SUMS
```

- sha256sumコマンドを使用してダウンロードしたファイルが破損していないか確認する

```bash
echo "$(grep nerdctl-full-2.0.2-linux-amd64.tar.gz SHA256SUMS)" | sha256sum --check
```

実行結果
```bash
nerdctl-full-2.0.2-linux-amd64.tar.gz: OK
```

- nerdctlに記載しているあるインストール手順でアーカイブファイルを展開する

```bash
sudo tar Cxzvvf /usr/local nerdctl-full-2.0.2-linux-amd64.tar.gz
```

- 今回はrootlessでインストールする

```bash
containerd-rootless-setuptool.sh install
```

- "newuidmap"パッケージがないとインストールが失敗した

```bash
[INFO] Checking RootlessKit functionality
[rootlesskit:parent] error: failed to setup UID/GID map: newuidmap 513 [0 1000 1 1 100000 65536] failed: : exec: "newuidmap": executable file not found in $PATH
[ERROR] RootlessKit failed, see the error messages and https://rootlesscontaine.rs/getting-started/common/ .
```

- Dockerの公式ページを確認したところ、uidmapパッケージが必要と確認できたのでuidmapをインストールする

```bash
sudo apt install uidmap -y
```

- 再度、インストールを実行、スクリプトが正常に終了したことを確認する。実行結果は長いため割愛する

```bash
containerd-rootless-setuptool.sh install
```

- nerdctlを使用してhello-worldコンテナを実行できるか確認する

```bash
nerdctl run hello-world
```

- iptables関連のファイルがないため実行失敗した

```bash
docker.io/library/hello-world:latest:                                             resolved       |++++++++++++++++++++++++++++++++++++++|
index-sha256:1b7a37f2a0e26e55ba2916e0c53bfbe60d9bd43e390e31aacd25cb3581ed74e6:    done           |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:e2fc4e5012d16e7fe466f5291c476431beaa1f9b90a5c2125b493ed28e2aba57: done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a:   done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:c1ec31eb59444d78df06a974d155e597c894ab4cda84f08294145e845394988e:    done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 4.0 s                                                                    total:  12.5 K (3.1 KiB/s)

FATA[0004] failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running createRuntime hook #0: exit status 1, stdout: , stderr: time="2025-01-18T16:45:01+09:00" level=fatal msg="failed to call cni.Setup: plugin type=\"bridge\" failed (add): failed to locate iptables: exec: \"iptables\": executable file not found in $PATH"
```

- iptablesパッケージをインストールする

```bash
sudo apt install iptables -y
```

- containerd.serviceの自動起動確認する

```bash
sudo systemctl is-enabled containerd.service
```

- containerd.serviceを自動起動するように設定変更する

```bash
sudo systemctl enable containerd.service
```

- 再度、実行して"Hello from Docker!"が表示されることを確認する

```bash
nerdctl run hello-world
```

## kubectlのインストール

- kubectlをダウンロードする

```bash
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
```

- SHA256SUMSを確認するファイルをダウンロードする

```bash
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
```

- ダウンロードしたファイルが破損等していないか確認する

```bash
echo "$(cat kubectl.sha256)  kubectl" | sha256sum --check
```

実行結果
```bash
kubectl: OK
```

- kubectlをインストールする

```bash
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
```

- kubectlのバージョンを確認する

```bash
kubectl version --client
```

実行結果
```bash
Client Version: v1.32.1
Kustomize Version: v5.5.0
```

## kindのインストール

- kindをダウンロードする

```bash
wget https://github.com/kubernetes-sigs/kind/releases/download/v0.26.0/kind-linux-amd64
```

- SHA256SUMSを確認するファイルをダウンロードする

```bash
wget https://github.com/kubernetes-sigs/kind/releases/download/v0.26.0/kind-linux-amd64.sha256sum
````

- ファイルが破損していないか確認する

```bash
echo "$(cat kind-linux-amd64.sha256sum)" | sha256sum --check
```

実行結果
```
kind-linux-amd64: OK
```

- kindバイナリファイルに実行権限を付与する

```bash
chmod +x ./kind-linux-amd64
```

- kindバイナリファイルを/usr/local/bin/に移動する

```bash
sudo mv ./kind-linux-amd64 /usr/local/bin/kind
```

- kindのバージョンを確認する

```bash
kind --version
```

実行結果
```bash
kind version 0.26.0
```

- kindコマンドでクラスタを構築する

```bash
kind create cluster
```

実行結果
```bash
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.32.0) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/
```

- kindコマンドでノードを確認する

```bash
kind get nodes
```

実行結果
```bash
kind-control-plane
```

- kubectlコマンドでノードを確認する

```bash
kubectl get nodes
```

実行結果
```bash
NAME                 STATUS   ROLES           AGE    VERSION
kind-control-plane   Ready    control-plane   2m5s   v1.32.0
```

- nerdctl psコマンドで確認する

```bash
nerdctl ps
````

実行結果
```bash
CONTAINER ID    IMAGE                                                                                                     COMMAND                   CREATED               STATUS    PORTS                        NAMES
d016a64b876d    docker.io/kindest/node:v1.32.0@sha256:c48c62eac5da28cdadcf560d1d8616cfa6783b58f0d94cf63ad1bf49600cb027    "/usr/local/bin/entr…"    About a minute ago    Up        127.0.0.1:41419->6443/tcp    kind-control-plane
```

# 参考URL

- WSL関連
  - https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config
  - https://github.com/spurin/wsl-cgroupsv2

- Kubernetes関連
  - https://kubernetes.io/ja/docs/concepts/architecture/cgroups/
  - https://kubernetes.io/ja/docs/tasks/tools/install-kubectl-linux/
  - https://kind.sigs.k8s.io/
  - https://github.com/containerd/nerdctl
  - https://docs.docker.jp/engine/security/rootless.html

- Go言語関連
  - https://go.dev/