Chuyển đến nội dung chính

第2課:叢集升級(kubeadm)

使用 kubeadm 升級叢集的步驟。控制平面與工作節點的逐步升級。 版本偏差政策、drain/uncordon。

kubeadm 叢集升級流程 — 控制平面與工作節點

1. 版本偏差政策

元件允許的版本差異
kube-apiserver基準版本(例:1.30)
controller-manager, schedulerapiserver ± 1(例:1.29–1.30)
kubeletapiserver -2 ~ apiserver(例:1.28–1.30)
kubectlapiserver ± 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 NODEcordon + 驅逐現有 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 的順序升級。跳版本可能造成不可預期的相容性問題。