自架 Ubuntu 24 Kubernetes 叢集

Posted by blueskyson on June 1, 2025

在本教學中,我們將會在 Ubuntu 24.04 Server 上安裝並架設一個四節點的 Kubernetes 叢集(包含一個控制節點與三個工作節點)。

Kubernetes 叢集由控制節點(Control Plane)與工作節點(Worker Nodes)所組成。控制節點負責整體叢集的管理與調度,而工作節點則實際執行應用程式容器(Pods)。本篇將逐步帶你完成所有必要設定,從系統安裝、節點配置,到基本應用部署。

首先,我們需要準備兩台 Ubuntu 24.04 的 VM,作為 Master Node 與 Worker Node。每台 VM 至少需要 2GB 的記憶體與 2 個 CPU 核心。

節點類型 CPU 記憶體 磁碟空間 OS NAT DHCP IP
Master 2 2GB 15GB Ubuntu 24.04 192.168.122.11
Worker 2 2GB 15GB Ubuntu 24.04 192.168.122.12

Master Node 設定

系統更新與基本設定

首先登入 Master Node 並更新系統套件:

$ sudo apt update

把 swap 關閉:

$ sudo swapoff -a

啟用 Kernal IP Forwarding:

$ echo "net.ipv4.ip_forward=1" | sudo tee -a  /etc/sysctl.conf
$ sudo sysctl -p

啟用 overlay 與 br_netfilter 模組,並用 lsmod 確認模組已載入:

$ 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/k8s.conf 
net.bridge.bridge-nf-call-iptables = 1 
net.bridge.bridge-nf-call-ip6tables = 1 
net.ipv4.ip_forward = 1 
EOF

$ sudo sysctl -p
$ lsmod | grep br_netfilter 
$ lsmod | grep overlay

安裝 kubelet kubeadm kubectl

參考 官方文件 透過 APT 安裝 Kubernetes 工具。(筆者當下用的版本為 V1.33,後續版本的 curl -fsSL 網址可能有差異,建議去官往查看完整指令,不要直接複製貼上)

$ sudo apt-get install -y apt-transport-https ca-certificates curl gnupg
$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
$ sudo chmod 644 /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 chmod 644 /etc/apt/sources.list.d/kubernetes.list

接著更新 APT 並安裝各個工具:

$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl

安裝 containerd

使用 containerd 作為容器執行環境。參考官方文件 加入 Docker 的 APT 存儲庫:

$ 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
$ 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

接著更新 APT 並安裝 containerd:

$ sudo apt-get update
$ sudo apt-get install -y containerd.io

編輯 /etc/containerd/config.toml 檔案,啟用 SystemdCgroup 並註解掉 disabled_plugins = ["cri"]

$ sudo vim /etc/containerd/config.toml
1
2
# disabled_plugins = ["cri"]
SystemdCgroup = true

重新啟動 containerd 服務:

$ sudo systemctl restart containerd

kubeadm 初始化

使用 kubeadm 初始化 Kubernetes 叢集。--pod-network-cidr 用來劃出 Pod 網路的 IP 範圍,控制平面會自動為每個節點分配一個 CIDR(Classless Inter-Domain Routing 區塊)。萬一 10.100.0.0/26 剛好跟你的網路設定衝突,請選擇其他 CIDR 範圍。

$ sudo kubeadm init --pod-network-cidr=10.100.0.0/16
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果此時透過 sudo crictl ps 指令查看容器狀態,發現 etcd、kube-apiserver 等一直重啟,可以試試把 CgroupV2 改成 CgroupV1。實際錯誤原因我不清楚,但這是我在 qemu/kvm 虛擬機上遇到的問題。

$ sudo vim /etc/default/grub

修改 GRUB_CMDLINE_LINUX_DEFAULT

1
GRUB_CMDLINE_LINUX_DEFAULT="systemd.unified_cgroup_hierarchy=0"

更新 GRUB 並重新啟動 VM。

$ sudo update-grub

最後一步,安裝 Flannel 作為 Pod 網路插件。Flannel 是一個輕量級的網路解決方案,適合用於 Kubernetes 叢集。

$ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

Worker Node 設定

參考前面 Master Node 的步驟,更新系統、關閉 swap、啟用 Kernal IP Forwarding、安裝 kubelet、kubeadm、kubectl 以及 containerd,但是不要做 kubeadm init 的步驟。

在 Master Node 上執行以下指令,取得加入叢集的指令:

$ kubeadm token create --print-join-command

在 Worker Node 上執行上述指令,即可加入叢集。

驗證叢集狀態

在 Master Node 上執行以下指令,檢查叢集狀態:

$ kubectl get nodes