こんにちは!クラウド事業部の牧瀬です。
最近 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 requirekubectl
, but you will not be able to perform some of the examples in our docs without it. To installkubectl
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/
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。