Kubernetes クラスター構築手順
公式ドキュメントに従って Kubernetes クラスターを構築します。
事前準備
cf. https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/_print/
マシン
VirtualBox 上で仮想マシンを立てて構築します。ドキュメントに記載されている最低条件ギリギリです。
- メモリ: 2GB
- CPU: 2 コア
- HDD: 32GB
- OS: Ubuntu 20.04.3
エラー回避のための設定
swap を無効化します。
sudo swapoff -a
ただし、上記の方法だとノードを再起動すると swap が再度有効化されてしまいます。永続的に無効化したい場合は/etc/fstabファイルの swap に関する行をコメントアウトしてリブートします。
コントロールプレーン構築
cf. https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
コンテナランタイムのインストール
必要な設定を追加します。
cat | sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 必要なカーネルパラメータの設定をします。これらの設定値は再起動後も永続化されます。
cat | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system
containerd のインストール
cf. https://github.com/containerd/containerd/blob/main/docs/getting-started.md
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
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
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# containerdのインストール
sudo apt-get update
sudo apt-get install -y containerd.io
# containerdの設定
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
Ubuntu 22.04 あたりから、上記 config.toml の [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] について、SystemdCgroup = true に書き換えないといけなくなったようです。
# SystemdCgroup設定書き換え
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# containerdの再起動
sudo systemctl restart containerd
kubeadm, kubelet, kubectl のインストール
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/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.33/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
コントロールプレーンの起動
コントロールプレーンノードを初期化します。kubeadm joinコマンドを控えておいてください。
sudo kubeadm config images pull
export APISERVER_ADVERTISE_ADDRESS=`hostname -I | awk '{print $1}'`
sudo kubeadm init \
--pod-network-cidr=10.20.0.0/16 \
--apiserver-advertise-address=${APISERVER_ADVERTISE_ADDRESS}
一般ユーザでもkubectlコマンドを叩けるようにします。
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
CNI のインストール
CNI プラグインを適用します。これが無いとkubectl get nodeで確認した際のノードの Status がNotReadyのまま動きません。各 CNI については下記を参照ください:
cf. https://kubernetes.io/ja/docs/concepts/cluster-administration/addons/#networking-and-network-policy
flannel のマニフェストをダウンロードします:
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
net-conf.json内のNetworkを先に設定した pod の cidr に合わせます:
sudo sed -i 's/"Network": "10.244.0.0\/16"/"Network": "10.20.0.0\/16"/' kube-flannel.yml
flannel のリソースを作成します:
kubectl apply -f kube-flannel.yml
flannel のリソースが作成されることを確認します:
watch kubectl get pods -n kube-flannel
ノードのステータスがReadyになっていれば完了です。
kubectl get nodes
ワーカーノード構築
kubeXXX インストール
コントロールプレーン構築の「コンテナランタイムのインストール」および「kubeadm, kubelet, kubectl のインストール」と同様の手順を踏んでください。
ノードをクラスターに参加させる
先に控えたkubeadm joinコマンドを叩きます。しばらく経ってからkubectl get nodesするとノードの Status がReadyになります。