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 の指示に従い必要に応じて再起動を行います。
※ 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 が選択可能です。
次に 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つのワーカーノードが作成されます。
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 などの内容は後続の記事にまとめていく予定です。