APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【kind in WSL2】k8sことはじめ【Docker Desktop 回避策】

こんにちは!クラウド事業部の牧瀬です。

最近 Kubernetes にデビューしました。
本記事では WSL2 で kind (Kubernetes in Docker) を設定する方法を紹介します。

目次

どんなひとに読んで欲しい

  • Kubernetes を無料でとりあえず試したい
  • kind × Docker Desktop 環境から引っ越したい
  • 有料のクラウドマネージドサービスを使いたくない

背景

新しいツールを使い始めるとき、意外とハマりがちなのが環境構築ですよね。
とくに Kubernetes は、コンポーネントが複雑で関連ツールの種類も幅広いです。
構築ツールもローカルの選択肢だけで、Minikube、k3d、kubeadm、など選択肢が多く、Kubernetes を始める前に環境構築で疲弊します。

Kubernetes 自体の機能を試すなら、マルチノードクラスタを構築できる kind(Kubernetes in Docker) というツールがおすすめです。

Windows なら kind × Docker Desktop でお手軽に構築できますが、 Docker Desktop は 2021 年 9 月から商用利用が有料化されました。
個人使用か商用利用か明確に線引きできないなら、利用は避けたいところ。
参照: Docker Desktopの料金を支払う必要があるのは誰ですか? - Dockerに関するよくある質問

Docker Desktop の代替ツールとして有力なのは Rancher Desktop ですね。
当初は kind × Rancher Desktop の環境構築にトライしていましたが、kind クラスタが作成できないという致命的な欠点が。。
再インストールしたり、Rancher Desktop の kubernetes 機能をオフにしたりといろいろ試しましたが、どうしてもうまくいかず...。いつかリベンジします。

PS > kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.29.2) 🖼
 ✓ Preparing nodes 📦
 ✗ Writing configuration 📜
Deleted nodes: ["kind-control-plane"]
ERROR: failed to create cluster: failed to generate kubeadm config content: failed to get kubernetes version from node: failed to get file: command "docker exec --privileged kind-control-plane cat /kind/version" failed with error: exit status 1
Command Output: Error response from daemon: container ae7443331052fd72c2f5e6ad737bcfa00e09636f144ed0a2c99b1555f4e1f895 iPS
- 

最終的に WSL2 に Linux を入れて、そこで kind を動かす方法に落ち着きました。
WSL2 はホスト環境と完全分離できないデメリットがありますが、ハイパーバイザー上で動かすため、オーバーヘッドが少なく軽量に Kubernetes を動かせます。
また、比較的簡単に Linux 環境がセットアップできるので、サクッと Kubernetes を始められます。

前提

Docker Desktop はアンインストール済み

WSL2 のセットアップ

WSL2 を Windows 10 で実行する場合の要件は以下です。Windows11 ならバージョンによらず WSL2 が使えます。

  • x64 システムの場合: バージョン 1903 以降 (ビルド 18362.1049 以降)
  • ARM64 システムの場合: バージョン 2004 以降 (ビルド 19041 以降)

参照: 手順 2 - WSL 2 の実行に関する要件を確認する-Microsoft

WSL2 実行のため「Linux 用 Windows サブシステム」と「仮想マシン プラットフォーム」を有効にします。

Powershell を管理者権限で起動し、以下のコマンドを実行します。ローカル PC を再起動して、設定を反映させます。

PS > Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform, Microsoft-Windows-Subsystem-Linux
この操作を完了するために、今すぐコンピューターを再起動しますか?
[Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"): Y

ローカル PC を再起動後、Powershell を管理者権限で起動します。最新の WSL にアップデートします。

PS > wsl --update

WSL の既定のバージョンを 2 にしておきます。WSL バージョン 2.1.5.0 が使われているようです。

PS > wsl --set-default-version 2
PS > wsl --status
既定のバージョン: 2
PS > wsl --version
WSL バージョン: 2.1.5.0
カーネル バージョン: 5.15.146.1-2
WSLg バージョン: 1.0.60
MSRDC バージョン: 1.2.5105
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.19045.4291

次に Linux ディストリビューションをインストールします。インストール可能なディストリビューションは以下でした。

PS > wsl --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl.exe --install <Distro>' を使用してインストールします。

NAME                                   FRIENDLY NAME
Ubuntu                                 Ubuntu
Debian                                 Debian GNU/Linux
kali-linux                             Kali Linux Rolling
Ubuntu-18.04                           Ubuntu 18.04 LTS
Ubuntu-20.04                           Ubuntu 20.04 LTS
Ubuntu-22.04                           Ubuntu 22.04 LTS
OracleLinux_7_9                        Oracle Linux 7.9
OracleLinux_8_7                        Oracle Linux 8.7
OracleLinux_9_1                        Oracle Linux 9.1
openSUSE-Leap-15.5                     openSUSE Leap 15.5
SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4
SUSE-Linux-Enterprise-15-SP5           SUSE Linux Enterprise 15 SP5
openSUSE-Tumbleweed                    openSUSE Tumbleweed

Ubuntu-22.04 をインストールします。数分待機したのち、Linux の一般ユーザ名とパスワードを入力するだけで Ubuntu のインストールは完了です。簡単!

PS > wsl --install Ubuntu-22.04
インストール中: Ubuntu 22.04 LTS
Ubuntu 22.04 LTS がインストールされました。
Ubuntu 22.04 LTS を起動しています...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: linuxuser
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.146.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


This message is shown once a day. To disable it please create the
/home/linuxuser/.hushlogin file.
~$

kind のセットアップ

インストールは kind 公式を参照します。
参照: kind

If you have go 1.16+ and docker, podman or nerdctl installed go install sigs.k8s.io/kind@v0.22.0 && kind create cluster is all you need!

go 経由で kind をインストールする場合は、 go バージョン 1.16 以上と Docker, Podman, nerdctl のいずれかが必要なようです。

また、kubectl も入れておいたよさそうです。
参照: Quick Start - kind

NOTE: kind does not require kubectl, but you will not be able to perform some of the examples in our docs without it. To install kubectl see the upstream kubectl installation docs.

go インストール

Ubuntu に go をインストールします。アーカイブファイルは以下のリンク先から配布されています。
参照: All releases - go

~$ wget https://go.dev/dl/go1.22.2.linux-amd64.tar.gz
~$ tar zxvf go1.22.2.linux-amd64.tar.gz
~$ sudo mv go /usr/local/
~$ rm -rf go1.22.2.linux-amd64.tar.gz

パスを通しておきます。go バージョン 1.22.2 がインストールされました。

~$ cat << "EOF" >> ~/.bashrc
export PATH=$PATH:/usr/local/go/bin
EOF
~$ /bin/bash
~$ go version
go version go1.22.2 linux/amd64

Docker インストール

Docker は apt 経由でインストールします。公式の指示通り進めます。
参照: Docker Engine インストール(Ubuntu 向け - docker docs)

リポジトリのセットアップ

~$ sudo apt-get update
~$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

Docker の公式 GPG 鍵を追加します。

~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

以下のコマンドを使って安定版(stable)リポジトリをセットアップします。

~$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
~$ cat /etc/apt/sources.list.d/docker.list
deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu   jammy stable

Docker Engine をインストールします。

~$ sudo apt-get update
~$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Hello World できるか確認します。

~$ sudo docker run hello-world

Docker サービスはすでに自動起動設定が有効になっていました。

~$ systemctl is-enabled docker.service
enabled
~$ systemctl is-enabled containerd.servicd
enabled

Docker はデフォルトでは root 権限で実行する必要がありますが、 sudo を付けずに実行できるようにしておきましょう。
参照: Linux インストール後の作業 - docker docs

~$ docker ps
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.45/containers/json": dial unix /var/run/docker.sock: connect: permission denied

docker グループに、一般ユーザを追加します。

~$ cat /etc/group | grep docker
docker:x:999:
~$ sudo usermod -aG docker $USER

Ubuntu-22.04 に再ログインします。既定が Ubuntu-22.04 なら wsl と実行するだけですぐに Ubuntu に入れます。

~$ exit
logout
PS > wsl -l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-22.04 (既定)
/mnt/c/Users/windows_user$ cd ~
~$

Hello World してみます。sudo なしでもエラーなく実行できると思います。

~$ docker run hello-world

kubectl インストール

kubectl 公式を参照してインストールしていきます。
参照: Install and Set Up kubectl on Linux - kubernetes

kubectl 最新版をダウンロードします。

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

チェックサムを取って正当性を確認します。kubectl: okと表示されたので正常にダウンロードできてます。

~$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
~$ ls
kubectl  kubectl.sha256
~$ echo "$(cat kubectl.sha256)  kubectl" | sha256sum --check
kubectl: OK

kubectl をインストールします。kubectl バージョン 1.30.0 がインストールされました。

~$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
~$ kubectl version --client
Client Version: v1.30.0
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3

kind インストール

go を使ってインストールします。go のパスに kind のバイナリファイル等を配置します。kind バージョン 0.22.0 がインストールされます。

~$ GOPATH=/usr/local/go/ go install sigs.k8s.io/kind@v0.22.0
~$ which kind
/usr/local/go/bin/kind
~$ kind --version
kind version 0.22.0

kind の推奨では Docker Desktop を使う場合は、少なくとも 6 GB の RAM(推奨 8 GB)が必要です。Docker Desktop は WSL2 を利用するので、今回のケースの参考にして、メモリ 8 GB を設定しておきます。
参照: Settings for Docker Desktop - kind

If you are building Kubernetes (for example - kind build node-image) on MacOS or Windows then you need a minimum of 6GB of RAM dedicated to the virtual machine (VM) running the Docker engine. 8GB is recommended.

WSL2 のグローバル設定は .wslconfig ファイルで制御します。.wslconfig ファイルにより、Ubuntu に 8 GB のメモリを割り当てます。デフォルトではホストマシン の 50% が割り当てられるため、ホストマシン の物理メモリが 16 GB 以上なら、 .wslconfig の設定はしなくてよいかもです。
参照: .wslconfig - Microsoft

Powershell でホームディレクトリに移動して、.wslconig ファイルを作成します。

PS > cd ~
PS > New-Item .wslconfig

.wslconfig ファイルを開いて編集します。

PS > Invoke-Item .\.wslconfig

# 以下を記載します
[wsl2]
memory=8GB

.wslconfig の設定は Ubuntu を再起動して反映します。(--shutdownといいつつ、挙動は再起動です。)

PS > wsl --shutdown

kind の動作確認

Ubuntu にログインし、 create コマンドで kind クラスタを起動してみます。

~$ kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.29.2) 🖼
 ✓ 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

Have a nice day! 👋

デフォルトではコントロールプレーンが 1 台起動するようです。

~$ kind get nodes
kind-control-plane

docker コマンド、kubectl コマンドもちゃんと使えているようです。
ホストマシン の localhost (127.0.0.1) をそのまま使うので、煩わしいネットワーク設定を気にせずに済むのも WSL2 の魅力ですね。

~$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                       NAMES
600382a75d20   kindest/node:v1.29.2   "/usr/local/bin/entr…"   11 minutes ago   Up 43 seconds   127.0.0.1:33865->6443/tcp   kind-control-plane
~$ kubectl get nodes
NAME                  STATUS   ROLES           AGE     VERSION
kind-control-plane    Ready    control-plane   6m38s   v1.29.2

delete コマンドでクラスタを削除します。

~$ kind delete cluster
Deleting cluster "kind" ...
Deleted nodes: ["kind-control-plane"]

クラスタのコンフィグファイル (kind.yaml) を使って、マルチノードクラスタを起動してみます。

kind.yaml

# a cluster with 3 control-plane nodes and 3 workers
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker

マルチノードクラスタ起動

~$ kind create cluster --config ./kind.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.29.2) 🖼
 ✓ Preparing nodes 📦 📦 📦 📦 📦 📦
 ✓ Configuring the external load balancer ⚖️
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining more control-plane nodes 🎮
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂

コントロールプレーンの冗長構成のために使われる HAProxy も起動しているようですね。

~$ docker ps
CONTAINER ID   IMAGE                                COMMAND                  CREATED         STATUS         PORTS
   NAMES
7bb4cb716c80   kindest/haproxy:v20230606-42a2262b   "haproxy -W -db -f /…"   7 minutes ago   Up 7 minutes   127.0.0.1:37813->6443/tcp   kind-external-load-balancer
c564c25f7ff6   kindest/node:v1.29.2                 "/usr/local/bin/entr…"   8 minutes ago   Up 7 minutes   127.0.0.1:45509->6443/tcp   kind-control-plane2
3f67255334d4   kindest/node:v1.29.2                 "/usr/local/bin/entr…"   8 minutes ago   Up 7 minutes   127.0.0.1:43799->6443/tcp   kind-control-plane
8c8fd62bb130   kindest/node:v1.29.2                 "/usr/local/bin/entr…"   8 minutes ago   Up 7 minutes
   kind-worker
a97f74e930d2   kindest/node:v1.29.2                 "/usr/local/bin/entr…"   8 minutes ago   Up 7 minutes   127.0.0.1:43677->6443/tcp   kind-control-plane3
7e6b61ac118c   kindest/node:v1.29.2                 "/usr/local/bin/entr…"   8 minutes ago   Up 7 minutes
   kind-worker2
e10312b6eab3   kindest/node:v1.29.2                 "/usr/local/bin/entr…"   8 minutes ago   Up 7 minutes
   kind-worker3

クラスタ削除

~$ kind delete cluster --name kind
Deleting cluster "kind" ...
Deleted nodes: ["kind-external-load-balancer" "kind-control-plane2" "kind-control-plane" "kind-worker" "kind-control-plane3" "kind-worker2" "kind-worker3"]
~$ kind get nodes
No kind nodes found for cluster "kind".

おわりに

WSL2 と kind を使って Kubernetes の実行環境を構築しました。
Docker Desktop を使わずとも、割と簡単に Kubernetes が始められますね。
とりあえず Kubernetes を始めるという目的なら必要十分な検証環境だと思います。

お知らせ

APCはAWS Advanced Tier Services(アドバンストティアサービスパートナー)認定を受けております。


その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。
www.ap-com.co.jp

https://www.ap-com.co.jp/service/utilize-aws/

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: keitomaki
AWSをメインにインフラ系のご支援を担当しています。