はじめに
最近、自宅のラボ環境(VMware Workstation)でKubernetesの検証をしようと思ったのですが、ネット上の記事が古かったり、手順通りにやってもエラーが出たりして、かなり時間を溶かしてしまいました…。
特に v1.24以降の変更(dockershim廃止) や v1.30系の最新手順 がまとまっている記事が少なかったので、「これをコピペすれば絶対動く!」という自分用の完全メモを残しておくことにしました。
こんな人におすすめです
- CKA/CKADの勉強用に、手元で壊せるクラスタが欲しい人
- VMware Workstationなど、オンプレミス環境で構築したい人
kubeadmを使った標準的な構築手順を知りたい人
📌 前提環境とバージョン方針
- 仮想化ソフト: VMware Workstation(ネットワークはブリッジモード推奨)
- OS: Ubuntu Server(インストール直後のまっさらな状態)
- コンテナランタイム: containerd(Dockerではありません)
- Kubernetesバージョン: v1.30系(※URLの数値を書き換えればv1.29等も対応可)
1. 初期セットアップ
まずはOSの足回りを整えます。ここをサボると後で謎のエラーに悩まされるので、しっかりやっておきましょう。
パッケージ更新と必須ツールの導入
# まずはシステムを最新の状態へ
sudo apt-get update
sudo apt-get -y upgrade
# 必要なツール群を一括インストール
sudo apt-get install -y ca-certificates curl gnupg lsb-release apt-transport-https software-properties-common vim git
時刻同期の設定(超重要)
Kubernetesは証明書の有効期限を厳密に管理するため、時刻がズレていると正常に動作しません。必ずJST(日本時間)に合わせて同期を有効化しておきます。
# タイムゾーンを東京に設定
sudo timedatectl set-timezone Asia/Tokyo
# 同期サービスを有効化
sudo systemctl enable --now systemd-timesyncd
# 確認
timedatectl
2. カーネルとネットワークの調整
ここがKubernetes構築の最大の「ハマりポイント」です。
Swapの完全無効化
Kubernetesは、パフォーマンスの予測可能性を保つためにSwapの使用を禁止しています。これを忘れると kubelet が起動しません。
# 一時的に無効化
sudo swapoff -a
# 再起動後も無効化されるようにfstabから削除
sudo sed -i.bak '/\sswap\s/d' /etc/fstab
ネットワーク設定(iptablesとフォワーディング)
Pod間の通信ができるように、カーネルモジュールとパラメータを設定します。
# 必要なモジュールをロード
cat <<'EOF' | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# カーネルパラメータの設定
cat <<'EOF' | sudo tee /etc/sysctl.d/99-kubernetes.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 設定を即時反映
sudo sysctl --system
3. コンテナランタイム(containerd)の準備
現在はDockerではなく、containerd を直接使用するのが標準です。Docker公式リポジトリから安定版をインストールします。
# 1. GPGキーの追加
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 2. リポジトリの追加
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 3. インストール実行
sudo apt-get update
sudo apt-get install -y containerd.io
Cgroup設定の変更(忘れずに!)
デフォルト設定のままだと、Kubernetesの管理するCgroupと競合して不安定になります。SystemdCgroup を true に変更するのが鉄則です。
# デフォルト設定ファイルを生成
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
# SystemdCgroupをtrueに書き換え
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 反映と再起動
sudo systemctl enable --now containerd
sudo systemctl restart containerd
4. Kubernetesコンポーネントのインストール
いよいよ本丸、kubelet、kubeadm、kubectl を入れます。
# 1. リポジトリキーの追加 (v1.30の場合)
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 2. リポジトリリストの作成
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /" | \
sudo tee /etc/apt/sources.list.d/kubernetes.list > /dev/null
# 3. インストール
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
# 4. バージョンの固定 (勝手にアップデートされるのを防ぐ)
apt-mark hold kubelet kubeadm kubectl
# 5. サービスの有効化
sudo systemctl enable kubelet
5. クラスタの初期化 (kubeadm init)
準備が整ったので、コントロールプレーンを立ち上げます。
# CIDRは環境に合わせて調整してください
# 自宅LANと被らないように注意 (例: 10.0.0.0/8 または 10.244.0.0/16)
sudo kubeadm init --pod-network-cidr=10.0.0.0/8
初期化が成功したら、管理者権限なしで kubectl を叩けるように設定ファイルをコピーします。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
6. ネットワークプラグイン (Cilium) の導入
CNI(Container Network Interface)には、最近のデファクトスタンダードである Cilium を採用しました。Helmを使ってインストールします。
# 1. Helmのインストール
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
# 2. Ciliumリポジトリの追加
helm repo add cilium https://helm.cilium.io/
helm repo update
# 3. Ciliumのインストール
# ※ k8sServiceHost のIPアドレスは、ご自身のAPI ServerのIP(kubectl cluster-infoで確認可)に書き換えてください!
helm install cilium cilium/cilium --version 1.15.2 \
--namespace kube-system \
--set kubeProxyReplacement=true \
--set k8sServiceHost=192.168.2.14 \
--set k8sServicePort=6443
7. 動作確認
最後に、すべてのPodが Running 状態になっているか確認します。
kubectl get pods -A
💡 運用のためのTips
- リソース割り当て: 最低でも 2CPU / 4GB RAM は割り当てましょう。快適に動かすなら4CPU/8GB推奨です。
- ファイアウォール: 通信できない場合は、ポート 6443 (API), 10250 (kubelet) がブロックされていないか確認してください。
- スナップショット: 初期構築が完了したこのタイミングで、VMwareのスナップショットを取得しておくことを強く推奨します!
最後に
以上で、VMware上のUbuntu ServerにKubernetes環境が構築できました。
ここまで構築できれば、あとはPodを立てたりServiceを公開したり、自由に検証が可能です。
もし手順通りにいかない場合は、Swapの設定やIPアドレス周りをもう一度確認してみてください。良いKubernetesライフを!