這是 2026 年在 Ubuntu 上「使用 Docker」執行 Kubernetes 的主流方式:containerd 作為執行環境(Docker 在底層使用的相同引擎),您以 Docker 建置的映像檔可原封不動地執行。這是在 Ubuntu 24.04 (Noble) 上使用 kubeadm 設定節點的簡潔教學,並特別指出容易踩到的雷點。
請以 root 身份或使用
sudo執行以下所有指令。本文設定單一控制平面節點;加入工作者節點請使用最後輸出的kubeadm join指令。
1. 核心先決條件
Kubernetes 需要讓橋接流量通過 iptables,並啟用 IP 轉發:
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 --system
進入全螢幕模式 離開全螢幕模式
停用 swap — kubelet 預設不會在 swap 啟用的情況下啟動:
sudo swapoff -a
sudo sed -i.bak '/\bswap\b/s/^/#/' /etc/fstab
進入全螢幕模式 離開全螢幕模式
2. 安裝 containerd
sudo apt-get update
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null
進入全螢幕模式 離開全螢幕模式
在 Ubuntu 上最重要的修改。 Ubuntu 22.04+ 使用 cgroup v2,因此 containerd 與 kubelet 必須都使用 systemd cgroup 驅動程式,否則節點會在 Ready/NotReady 之間不斷切換:
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
進入全螢幕模式 離開全螢幕模式
(此不相容問題相當常見,因此我在本系列後續文章中特別撰文說明。)
3. 安裝 kubeadm、kubelet、kubectl
舊的 apt.kubernetes.io 套件庫已停止使用 — 請改用 pkgs.k8s.io。請鎖定您想要的小版本(下方以 1.30 為例):
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
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
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # 避免無人值守升級跳過小版本
進入全螢幕模式 離開全螢幕模式
4. 初始化控制平面
選擇符合您 CNI 的 Pod CIDR。本文使用 Flannel 的預設值:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# 為您的使用者設定 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
進入全螢幕模式 離開全螢幕模式
5. 安裝 CNI,然後驗證
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
kubectl get nodes -o wide
# STATUS 應在一分鐘內變為 Ready;CONTAINER-RUNTIME 會顯示 containerd://1.7.x
進入全螢幕模式 離開全螢幕模式
若為單節點實驗室,請允許工作負載排程到控制平面:
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
進入全螢幕模式 離開全螢幕模式
6. 驗證 Docker 映像檔可執行
kubectl create deployment web --image=nginx:1.27
kubectl expose deployment web --port=80
kubectl get pods -o wide # 執行中,位於您的 containerd 節點上
進入全螢幕模式 離開全螢幕模式
該 nginx 映像檔是由 Docker 建置的。它可在 containerd 上執行而無需轉譯,因為它是 OCI 映像檔 — 這正是本系列的重點。
當它無法啟動時
第一個節點常見的失敗原因是 kubelet 無法啟動(幾乎都是 swap 或 cgroup 驅動程式問題),或是 Pod 卡在 Pending 狀態(尚未安裝 CNI)。我將具體的修正方法整理在此:Kubernetes Pod 啟動錯誤 以及 Kubernetes 疑難排解堆疊。
下一步:如果您特別需要 Docker Engine 作為執行環境而非單純的 containerd,請使用 cri-dockerd。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.