はじめに
本記事では、WSL2上のUbuntuにKubernetes v1.34.2とDockerを使った開発環境を構築する手順を紹介します。
検証環境
- OS: WSL2 Ubuntu 22.04.5 LTS
- Kubernetes: v1.34.2
- cri-dockerd: v0.3.23
- Docker: 28.2.2
- コンテナランタイム: Docker + cri-dockerd
アーキテクチャ概要
Kubernetes v1.24以降、Dockershimが削除されたため、Dockerをコンテナランタイムとして使用する場合はcri-dockerdが必要です。
Kubernetes (kubelet) → cri-dockerd → Docker Engine
事前準備:Dockerのインストール
まず、Dockerをインストールします。
bash
# システムアップデート
sudo apt-get update
# Docker GPGキーの追加
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Dockerリポジトリの追加
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] 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のインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
ステップ1:システム環境の設定
1.1 必要なパッケージのインストール
bash
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl apt-transport-https ca-certificates gnupg lsb-release wget
1.2 Swapの無効化
Kubernetesは、パフォーマンスの理由からSwapの無効化を要求します。
bash
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 確認(Swapが0になっていることを確認)
free -h
1.3 カーネルモジュールの読み込み
bash
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 確認
lsmod | grep -E "overlay|br_netfilter"
1.4 ネットワークパラメータの設定
bash
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
ステップ2:cri-dockerd のインストール
cri-dockerdは、KubernetesとDockerの間の橋渡しをするアダプターです。
bash
cd /tmp
# 最新版をダウンロード(v0.3.23)
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.23/cri-dockerd_0.3.23.3-0.ubuntu-$(lsb_release -cs)_amd64.deb
# インストール
sudo dpkg -i cri-dockerd_0.3.23.3-0.ubuntu-$(lsb_release -cs)_amd64.deb
sudo apt-get install -f -y
cri-dockerdの設定
公式イメージリポジトリを使用するための設定を行います。
bash
sudo mkdir -p /etc/systemd/system/cri-docker.service.d/
cat <<EOF | sudo tee /etc/systemd/system/cri-docker.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=registry.k8s.io/pause:3.10
EOF
# サービスの再起動
sudo systemctl daemon-reload
sudo systemctl enable cri-docker.service
sudo systemctl restart cri-docker.service
# バージョン確認
cri-dockerd --version
ステップ3:Kubernetes v1.34.2 のインストール
3.1 Kubernetes公式リポジトリの追加
bash
# GPGキーの追加
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# リポジトリの追加
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
3.2 Kubernetesコンポーネントのインストール
bash
# v1.34.2 をインストール
sudo apt install -y kubelet=1.34.2-1.1 kubeadm=1.34.2-1.1 kubectl=1.34.2-1.1
# バージョンを固定(自動アップデートを防ぐ)
sudo apt-mark hold kubelet kubeadm kubectl
# バージョン確認
kubeadm version
kubectl version --client
ステップ4:Kubernetesクラスタの初期化
4.1 必要なイメージの事前取得
bash
# 必要なイメージリストの確認
kubeadm config images list --kubernetes-version=v1.34.2
出力例:
registry.k8s.io/kube-apiserver:v1.34.2
registry.k8s.io/kube-controller-manager:v1.34.2
registry.k8s.io/kube-scheduler:v1.34.2
registry.k8s.io/kube-proxy:v1.34.2
registry.k8s.io/coredns/coredns:v1.12.1
registry.k8s.io/pause:3.10.1
registry.k8s.io/etcd:3.6.5-0
bash
# イメージの取得
sudo kubeadm config images pull \
--kubernetes-version=v1.34.2 \
--cri-socket=unix:///var/run/cri-dockerd.sock
4.2 Masterノードの初期化
bash
# WSLのIPアドレスを取得
IP_ADDR=$(hostname -I | awk '{print $1}')
# クラスタの初期化
sudo kubeadm init \
--apiserver-advertise-address=$IP_ADDR \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--kubernetes-version=v1.34.2 \
--cri-socket=unix:///var/run/cri-dockerd.sock
:::note info
初期化には数分かかります。成功すると、Worker nodeを追加するためのjoinコマンドが表示されます。
:::
4.3 kubectlの設定
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# クラスタ情報の確認
kubectl cluster-info
出力例:
Kubernetes control plane is running at https://172.23.188.81:6443
CoreDNS is running at https://172.23.188.81:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
ステップ5:ネットワークプラグインのインストール
Kubernetesクラスタには、Pod間通信のためにCNI(Container Network Interface)プラグインが必要です。
Flannelのインストール
bash
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
:::note warn
Flannelを使用する場合、初期化時に--pod-network-cidr=10.244.0.0/16を指定する必要があります。
:::
ステップ6:シングルノード構成の設定
開発環境では、Masterノードでもアプリケーションポッドを実行できるようにします。
bash
# Masterノードのtaintを削除
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
# ノードの状態確認
kubectl get nodes -o wide
出力例:
NAME STATUS ROLES AGE VERSION INTERNAL-IP
thinkpad-pc Ready control-plane 48s v1.34.2 172.23.188.81
bash
# 全ポッドの状態確認
kubectl get pods --all-namespaces
ステップ7:動作確認
テストアプリケーションのデプロイ
bash
# Nginxデプロイメントの作成
kubectl create deployment nginx --image=nginx:alpine --replicas=2
# NodePortサービスの公開
kubectl expose deployment nginx --port=80 --type=NodePort
# リソースの確認
kubectl get pods,svc
出力例:
NAME READY STATUS RESTARTS AGE
pod/nginx-7977cdf8f5-kjfm2 1/1 Running 0 20s
pod/nginx-7977cdf8f5-sppmw 1/1 Running 0 20s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP
service/nginx NodePort 10.110.205.52 <none> 80:30486/TCP
アクセステスト
bash
# Nginxへのアクセス
curl http://localhost:$(kubectl get svc nginx -o jsonpath='{.spec.ports[0].nodePort}')
正常に動作していれば、Nginxのウェルカムページが表示されます。
html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
クリーンアップ
bash
# テストリソースの削除
kubectl delete deployment nginx
kubectl delete svc nginx
よく使うコマンド集
クラスタの状態確認
bash
# ノード一覧
kubectl get nodes
# 全ポッド一覧
kubectl get pods -A
Dockerイメージの確認
bash
# Kubernetesが使用しているイメージ
docker images | grep registry.k8s.io
出力例:
registry.k8s.io/kube-apiserver v1.34.2 a5f569d49a97 2 months ago 88MB
registry.k8s.io/kube-controller-manager v1.34.2 01e8bacf0f50 2 months ago 74.9MB
registry.k8s.io/kube-scheduler v1.34.2 88320b5498ff 2 months ago 52.8MB
registry.k8s.io/kube-proxy v1.34.2 8aa150647e88 2 months ago 71.9MB
registry.k8s.io/coredns/coredns v1.12.1 52546a367cc9 10 months ago 75MB
registry.k8s.io/etcd 3.6.5-0 a3e246e9556e 4 months ago 62.5MB
registry.k8s.io/pause 3.10.1 cd073f4c5f6a 7 months ago 736kB
ログの確認
bash
# kubeletのログ
sudo journalctl -u kubelet -f
# 特定のポッドのログ
kubectl logs <pod-name> -n <namespace>
# 前回実行時のログ
kubectl logs <pod-name> --previous
トラブルシューティング
bash
# ポッドの詳細情報
kubectl describe pod <pod-name>
# イベントの確認
kubectl get events --sort-by='.lastTimestamp'
# クラスタのリセット(再構築が必要な場合)
sudo kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sock
sudo rm -rf /etc/cni/net.d
sudo rm -rf $HOME/.kube/config
まとめ
本記事では、WSL2 Ubuntu上にKubernetes v1.34.2とDockerを使った開発環境を構築する手順を紹介しました。
ポイント
- ✅ 公式イメージリポジトリ(registry.k8s.io)を使用
- ✅ cri-dockerdでDockerとKubernetesを連携
- ✅ シングルノード構成で開発環境として利用可能
- ✅ Flannel/CalicoでPod間ネットワーキングを実現
次のステップ
- Helmのインストール
- Ingressコントローラーの設定
- 永続ボリュームの設定
- マルチノードクラスタへの拡張
参考資料
この記事が、Kubernetes環境構築の参考になれば幸いです。