1. 版本偏差政策
| 元件 | 允許的版本差異 |
|---|---|
| kube-apiserver | 基準版本(例:1.30) |
| controller-manager, scheduler | apiserver ± 1(例:1.29–1.30) |
| kubelet | apiserver -2 ~ apiserver(例:1.28–1.30) |
| kubectl | apiserver ± 1 |
考試重點:必須一次升級一個次版本(例:1.29 → 1.30 → 1.31)。不支援跳版本升級。
2. 控制平面升級
# 步驟1:升級 kubeadm
sudo apt-get update
sudo apt-get install -y kubeadm=1.30.0-00
kubeadm version # 確認
# 步驟2:確認升級計劃
sudo kubeadm upgrade plan
# 步驟3:套用控制平面升級
sudo kubeadm upgrade apply v1.30.0
# 步驟4:Drain 節點
kubectl drain controlplane --ignore-daemonsets
# 步驟5:升級 kubelet & kubectl
sudo apt-get install -y kubelet=1.30.0-00 kubectl=1.30.0-00
sudo systemctl daemon-reload
sudo systemctl restart kubelet
# 步驟6:Uncordon
kubectl uncordon controlplane
3. 工作節點升級
# 從控制平面執行 drain
kubectl drain worker1 --ignore-daemonsets --delete-emptydir-data
# SSH 到工作節點
ssh worker1
# 升級 kubeadm
sudo apt-get update
sudo apt-get install -y kubeadm=1.30.0-00
# 升級節點設定
sudo kubeadm upgrade node
# 升級 kubelet
sudo apt-get install -y kubelet=1.30.0-00
sudo systemctl daemon-reload
sudo systemctl restart kubelet
# 回到控制平面執行 uncordon
exit
kubectl uncordon worker1
4. drain & cordon
| 指令 | 行為 |
|---|---|
kubectl cordon NODE | 停止排程新 Pod(現有 Pod 保持不變) |
kubectl drain NODE | cordon + 驅逐現有 Pod |
kubectl uncordon NODE | 恢復排程功能 |
5. 速查表
| 任務 | 指令 |
|---|---|
| 確認升級計劃 | kubeadm upgrade plan |
| 套用控制平面升級 | kubeadm upgrade apply v1.30.0 |
| 更新工作節點設定 | kubeadm upgrade node |
| Drain 節點 | kubectl drain NODE --ignore-daemonsets |
| Uncordon 節點 | kubectl uncordon NODE |
6. 練習題
Q1:控制平面升級的正確順序是?
- A) kubelet → kubeadm → kubectl
- B) kubeadm → kubeadm upgrade apply → drain → kubelet/kubectl → uncordon ✓
- C) kubectl → kubeadm → kubelet
- D) drain → kubeadm → kubelet → uncordon → kubeadm upgrade
解析:正確順序是先升級 kubeadm 套件,執行 kubeadm upgrade apply,drain 節點,升級 kubelet 和 kubectl,最後 uncordon。
Q2:kubectl drain node1 不使用 --ignore-daemonsets 旗標時會發生什麼?
- A) DaemonSet 的 Pod 會被刪除
- B) drain 會因錯誤而失敗 — DaemonSet 的 Pod 無法驅逐 ✓
- C) 所有 Pod 會正常驅逐
- D) DaemonSet 會自動縮減
解析:DaemonSet 的 Pod 設計為每個節點各一個。嘗試驅逐會產生錯誤。--ignore-daemonsets 旗標會忽略 DaemonSet 的 Pod 繼續執行 drain。
Q3:可以將 Kubernetes v1.29 的叢集直接升級到 v1.31 嗎?
- A) 可以,直接執行 kubeadm upgrade apply v1.31.0
- B) 不可以,必須先升級到 v1.30 再升級到 v1.31 ✓
- C) 可以,使用 --skip-version 旗標
- D) 不可以,需要重建叢集
解析:Kubernetes 升級必須逐次版本進行。按照 v1.29 → v1.30 → v1.31 的順序升級。跳版本可能造成不可預期的相容性問題。