背景・前編について
本記事は、前編の続きとなっており、2台の物理サーバー上に仮想マシンを作成し、最終的にKubernetesクラスタを構築するというのがゴールになっています。
研究室にあった物理サーバーを2台使用して、4台の仮想マシンを作成しました。
ネットワークの設定も行い相互に通信できる状態にできたので、これらを使ってMaster Node1台、Worker Node3台のKubernetesクラスタをkubeadmを用いて構築していこうと思います。
環境について
- Node
- Master Node(4vCPU, 4G RAM)
- Worker Node 3台(3vCPU, 3G RAM)
- OS
- Ubuntu 22.04.5 LTS
- Kubernetes
- v1.30(後半でv1.31にアップグレードします)
- コンテナランタイム
- containerd v1.7.28
- CNI
- Flannel v0.27.4
Kubernetesクラスタ構築
全VMでの共通設定
swap無効化
kubeletは、swapが有効だと動作しません。
sudo swapoff -a
sudo vim /etc/fstab # /swap.imgの行をコメントアウト
カーネルモジュール&sysctl
Podネットワーク通信やiptables経由のパケット制御を可能にするためです。
参考:
cat <<'EOF' | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<'EOF' | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
containerd
Kubernetesがコンテナを動かすための基盤となるコンテナランタイムとして、containerdを導入します。
sudo apt-get update
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sed 's/SystemdCgroup = false/SystemdCgroup = true/' | sudo tee /etc/containerd/config.toml >/dev/null
sudo systemctl restart containerd
sudo systemctl enable containerd
kubeadm, kubelet, kubectlインストール
Kubernetesクラスタの構築・管理に必要な3つのツールをインストールします。
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
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
sudo apt-get update -y
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Master NodeのVMでの設定
kubeadm init
Master Node上でクラスタを初期化し、APIサーバやコントロールプレーンを構築します。
echo 'KUBELET_EXTRA_ARGS=--node-ip=192.168.80.101' | sudo tee /etc/default/kubelet
sudo systemctl restart kubelet
sudo kubeadm init \
--apiserver-advertise-address=192.168.80.101 \
--pod-network-cidr=10.244.0.0/16
CNIの導入(Flannelを利用)
Pod間通信を実現するネットワークプラグインの一つである、Flannelを導入します。
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.27.4/Documentation/kube-flannel.yml
Worker NodeのVMでの設定
kubeadm join
各WorkerノードをMasterが管理するクラスタに参加させます。
まず、ブリッジのNICのIPを、kubelet の使用する IP を固定することで、各NodeのIPが指定されたアドレスになります。
# それぞれBridgedの自IPを kubelet に固定
# k8s-worker-1
echo 'KUBELET_EXTRA_ARGS=--node-ip=192.168.80.103' | sudo tee /etc/default/kubelet
sudo systemctl restart kubelet
# k8s-worker-2
echo 'KUBELET_EXTRA_ARGS=--node-ip=192.168.80.105' | sudo tee /etc/default/kubelet
sudo systemctl restart kubelet
# k8s-worker-3
echo 'KUBELET_EXTRA_ARGS=--node-ip=192.168.80.107' | sudo tee /etc/default/kubelet
sudo systemctl restart kubelet
sudo systemctl restart kubelet
# k8s-masterで出力されたjoinを実行
sudo kubeadm join 192.168.80.101:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
ローカル設定
動作確認
Kubernetesクラスタの認証情報ファイル(admin.conf)を、Master Nodeからローカルの~/.kube/config にコピーすることで、ローカルPCからkubectlコマンドでmasterクラスタへアクセスできるようになります。
そして、以下のように正しいkubeconfigを参照するようにします。
chmod 600 ~/.kube/kubeconfig-master.yaml
export KUBECONFIG=~/.kube/kubeconfig-master.yaml
Nodeの確認
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 35m v1.30.14
k8s-worker-1 Ready <none> 31m v1.30.14
k8s-worker-2 Ready <none> 18m v1.30.14
k8s-worker-3 Ready <none> 13m v1.30.14
[サブトピック] Kubernetesアップグレード
概要
せっかくなので、Kubernetesのアップグレードもやってみようと思います。v1.30をインストールしていたので、v1.31にアップグレードしてみます。
参考:
全VM(Node)での共通作業
パッケージリポジトリの切り替え
sudo sed -i 's/v1.30/v1.31/' /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
kubeadmのアップグレード
sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm='1.31.x-*' && \
sudo apt-mark hold kubeadm
kubelet, kubectlのアップグレード(ノードアップグレードの後に実行)
sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && sudo apt-get install -y kubelet='1.31.x-*' kubectl='1.31.x-*' && \
sudo apt-mark hold kubelet kubectl
Control Planeのアップグレード
plan
sudo kubeadm upgrade plan
You can now apply the upgrade by executing the following command:
kubeadm upgrade apply v1.31.13
アップグレードの実行
sudo kubeadm upgrade apply v1.31.13
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.31.13". Enjoy!
動作確認(Master Nodeがv1.31にアップグレードされている)
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 2d21h v1.31.13
k8s-worker-1 Ready <none> 2d21h v1.30.14
k8s-worker-2 Ready <none> 2d20h v1.30.14
k8s-worker-3 Ready <none> 2d20h v1.30.14
Worker Nodeのアップグレード
Master Nodeにて各Worker NodeのDrainを行う
kubectl drain k8s-worker-1 --ignore-daemonsets --delete-emptydir-data
実行後、以下のようにDrainしたNodeがSchedulingDisabledになることを確認
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 2d21h v1.31.13
k8s-worker-1 Ready,SchedulingDisabled <none> 2d21h v1.30.14
k8s-worker-2 Ready <none> 2d20h v1.30.14
k8s-worker-3 Ready <none> 2d20h v1.30.14
Nodeのアップグレードを行う
sudo kubeadm upgrade node
Master NodeにてUncordonを行う
kubectl uncordon k8s-worker-1
同様の操作を、k8s-worker-2, k8s-worker-3でも行い、アップグレードを完了させる。
そして、以下のように全Nodeがv1.31にアップグレードされたことを確認する。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 2d21h v1.31.13
k8s-worker-1 Ready <none> 2d21h v1.31.13
k8s-worker-2 Ready <none> 2d21h v1.31.13
k8s-worker-3 Ready <none> 2d21h v1.31.13
今後の展望
前編と後編に分けるほど長くなってしまいましたが、物理サーバーにUbuntuだけが入っている状態から、VirtualBoxにより仮想マシンを作成し、最終的にはKubernetesクラスタを構築しアップグレード作業も行うことができました。
自分専用のKubernetesクラスタを構築したは良いもののこれといった用途があるわけではありません。今後何か検証したい技術が出てきた時に使用する環境としての役割を果たすと思います。