Kubernetes的更新週期是三個月,也就是每三個月會推出新版本。記得當初我第一次開始用Kubernetes的時候,版本是v1.16.2,而到今日已經是v1.25.2了。
每個版本都有它的支援週期,像是此時AWS的EKS已不再支援v1.20以前的版本了。所以集群的更新在大部分的情況都是非常重要的,除非刻意保留在某個版本,接下來我們來看看集群要如何更新~
當集群上的Node變成NotReady,系統預設會在5分鐘後才會開始將這個Node上的Pod,在剩下Ready狀態的Node上重建。那為了直接跳過這個過程,我們可以使用drain。
# 將這個Node上的所有Pod驅逐,並且把這個Node變成Unschedulable
kubectl drain node1
# 讓這個Node變成Unschedulable
kubectl cordon node1
# 解除cordon,讓Node變成Schedulable
kubectl uncordon node1
Kubernetes的版本v1.25.2可以分為三個部分:1、25、2,我們分別稱為Major、Minor、Patch。
而Kubernetes的各個元件,如:kube-apiserver、Controller-manager等,彼此的版本都有相依性,也就是版本不能相差太多。
但目前無論是on Premise或是Cloud,除非是自己下載各個元件並組成集群,不然這些都是透過如kubeadm等工具來自動化完成。而CKA考試是考使用kubeadm來更新,所以我們不會討論它們彼此的相依性。
更新集群主要有三種策略,三者的共通點是必須先更新Master Node:
3和2的主要差別是加入新的Node來取代舊的Node,3是EKS目前的更新方式。
更新Kubernetes集群不支援跨Minor版本,也就是不能從1.23直接升到1.25,必須先從1.23升1.24,再升到1.25。
接下來我們來討論更新集群的步驟:
第一步:檢查可以更新到哪個版本,輸入下面的指令kubeadm會告訴你目前可以升級到什麼版本。
kubeadm upgrade plan
第二步:先將kubeadm更新到我們目標的版本,每種OS的更新方式都不同,可以參考升级 kubeadm 集群。
第三步:更新Cluster,後面的版本是在第一步得知和第二步所指定的版本。
kubeadm upgrade apply v1.25.x
第四步:如果現在我們使用kubectl get node去檢查目前Node的版本,會發現還是舊的版本,所以我們要幫這個Node的kubelet更新,而更新方法類似於第二步,也是需要根據OS版本來應對。
第五步:重啟kubelet,使其更新生效。
systemctl daemon-reload
systemctl restart kubelet
第六步:檢查是否更新成功,若是成功,再依據更新的策略來更新其他Node。
這些更新的過程可以搭配一開始提到的drain和cordon來避免服務中斷,明天我們會來討論ETCD的備份與還原~
Certified Kubernetes Administrator (CKA) with Practice Tests