Kubernetes CKA課程筆記 72

Upgrade K8s Cluster —How Cluster Upgrade works

ZONGRU Li
7 min readDec 2, 2021

Kubernetes 可能因應暴露的風險修正或是功能的改善,釋出了新的版本

接著管理者就必須肩負起將既有的Kubernetes Cluster升版

並且在升版過程中,為了應用系統盡量不中斷的議題

必須要最小化應用程式downtime!

一般升版執行流程:

  1. 先升級Control Plane Node
  2. 才升Work Nodes

1.當升級Control Plane Node時:

  • 亦即Control Plane(Master Node)功能將暫停
  • 但是這不表示已經運行於Worker Nodes上的Pods會停止運作
  • 也就是Worker Nodes上既有的Pods(含裡面的應用程式)會持續運作
  • 但是過程中因為缺少API Server,將無法新增或刪除K8s元件
  • 並且若Worker Nodes上的某個Pod運行中斷而結束
  • 由於沒有Master NodeController ManagerScheduler的指揮
  • 中斷結束的Pod將不會自動重建

考量到今天有複數個Control Plane Nodes的狀況:

  • 執行升級的方式將會是ONE BY ONE:

Control Plane Components & its versions:

  • 在做Control Plane Node版本升級時,其實就是針對其運行元件升級,如以下
  1. kube-apiserver(v1.20.1)
  2. kube-scheduler(v1.20.1)
  3. kube-proxy(v1.20.1)
  4. controller-manager(v1.20.1)
  5. kubelet(v1.20.1)
  6. kubectl(v1.20.1)

以上運行元件都會是同一個版本

另外可能尚有:

  1. etcd(可能v3.4.0,但是這個將由kubeadm安裝)
  2. coredns(可能v1.7.0,但是這個將由kubeadm安裝)
  3. weave-net(可能v2.2.14,另外安裝)

綜上所述,當提到Control Plane Node升級即代表:

左邊途中的元件就是Master Node升級要升的元件
  • 如上圖示,雖然weave是裝在一起,但是升級時weave並不一起執行
  • 並且針對藍色框相同版本的元件部分,是否一定要維持同一版!?
  • 亦即藍色框相同版本的元件部分是否可以分別升即?甚至保持不同版本?
  • 答案如下圖:
  • 如上圖內說明,i.e. 這些運行元件使用不同版本其實是允許的!
  • 另外上圖省略的kubectl元件部分
  • 由於是直接跟API-Server溝通的Client端元件
  • 所以kubectl元件版本相對於API-Server可以允許新或舊一版或同版
  • 為了維運方便,或比較通常情況下
  • 一般都會將上述運行元件維持同版本
  • 並且也比較方便安裝

如何升級上述各種運行元件?

  • 如同建置過程使用kubeadm執行init來完成一樣
  • K8s升級也將使用kubeadm來做升級
  • 並且透過kubeadm升級將會把上述各種元件盡量維持同一版本!
  • 也就是說,升級上述元件前,其實要先把kubeadm軟體進行升級!
  • kubeadm軟體完成升級後,即可執行類似如下指令,進行"部分"元件升級:

kubeadm upgrade apply 1.21.0

  • 上述指令連同前面圖中不同版的etcd,coredns元件也會一併升級對應版本
  • 並且注意!過程還會執行憑證(Cluster certificates)更新!!!
  • 但是也僅僅是將Pod型式的元件完成升級而已
  • 我們還有另外的非Pod軟體(kubelet與kubectl)要另外升級
  • 亦即kubelet與kubectl要分開升級

kubelet與kubectl分開升級:

  • 先考慮到kubelet,該元件是控制安排Node上運行的Pod
  • 所以在執行kubelet升級前要先把該Node上的Pod清除
  • 亦即將Node轉為Maintain Mode(維護狀態),該動作又稱drain node,如下:

kubectl drain master

  • 也就是Node內的Pods會被安全地移除(evict)
  • 並且Node將被註記為"unschedulable",也就是不能起新的Pod
  • (下篇demo筆記會看到)
  • 此時才分別將kubelet與kubectl分別升級
  • 接著才恢復Node的狀態註記調整回為"schedulable",例如執行:

kubectl uncordon master

  • 此時才真的完成master的升級(該升級的運行元件都完成升級!)

如何升級Worker Nodes?

  • 完成master node升級後,接著就是執行worker node的升級
  • 過程也是一台台輪流完成,順序如下
  • 1.依樣先升級kubeadm
  • 2.驅動升級後的kubeadm來升級kubelet的設定
  • 3.執行drain node(暫時排除所有Pod)
  • 此時上面的Pod會被deployment等機制重建到其他Worker Node
  • 4.趕緊升級kubelet
  • 5.回復Node的狀態註記調整回為"schedulable"
  • 以上流程即完成一台worker node該做的升級動作!!
  • 並且過程中只要有兩台以上worker node,並且定義Pod至少兩個Replica
  • 就可以實現無downTime了!!!

關於上面講述的Draining Node:

  • 例如執行以下指令:

kubectl drain worker1

  • 上述指令效果是,將該node註記為"unschedulable"
  • 並(Evict)排除上面既有的Pods
  • 但是還有一種指令只單純做該node註記為”unschedulable”,如下執行:

kubectl cordon worker1

  • 上述指令並不會排除既有的Pods
  • 原則上就是做一些不用動到運行中的Pod的處理才用
  • 接著就是上面有提到的恢復Node狀態的指令,執行:

kubectl uncordon worker1

  • Node狀態恢復為"schedulable"
  • 通常就是升即作業完成後就可以做了!!

何時該執行升級(升級頻率)?

  • 考量到若有運行上的問題,若新版有修正,即當執行升即
  • 並且普遍來說都應該將K8s Cluster保持在最新版本
  • 假設目前有K8s Cluster版本v1.18,由於運作需求大,沒空升級
  • 但是當下已經出到v1.21版
  • Kubernetes官方僅會支援近三代的版本(如下圖)
官方僅支援最新的近三代版本
  • 也就是此時v1.18已經不支援了!
  • 此時能夠直接將自己的K8s Cluster v1.18直接升級v1.21嗎?

→NO! 沒辦法這樣升

  • 升級過程只能一版一版進行,i.e. 先升級到v1.19,才到v1.20最後v1.21
只能一版一版升級!

參考課程(reference)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet