今天來記錄版本升級的做法(z版號),Kubernetes的版本更新的很快,所以版本升級是每個管理者所必須要會的必備技能,建議版本升級之前要先去確認升級路徑,不是每個版本號都能一次升級到你需要的版本。
升級順序是Master => Worker
那就開始吧!
[master]# kubectl get nodes
在進行任何Cluste層級的操作之前,務必在狀態正常的情況下才開始執行,不然可能會直接導致任何不可預期的後果。
在確認完狀態之後,接下來就進入升級的實務操作。
#----------------------------------------------------------
# S2-1. 確認目前版本號
#----------------------------------------------------------
[master01]# kubeadm version -o json
#---------------------------------------------------
# S2-2. 使用指令來確認要升級的版本
#---------------------------------------------------
[master01]# kubeadm upgrade plan
#-------------------------------------------------
# S2-3. 安裝kubeadm (all master nodes)
#-------------------------------------------------
[master01]# yum list --showduplicates kubeadm --disableexcludes=kubernetes
[master01]# yum install kubeadm-1.25.12-0
#--------------------------------------------------
# S2-4. Drain workload
# 排空master: 將節點標記為不可調度並驅逐負載來讓節點進入維護模式,
# 將Pod優雅中止
#--------------------------------------------------
[master01]# kubectl drain <master-node> --ignore-daemonsets
※註:如果有Pod吃到local-storage時會出現錯誤,如果不需要,可以加上"--delete-local-data"
#-------------------------------------------------
# S2-5. 執行升級
#-------------------------------------------------
[master01]# kubeadm upgrade apply v1.25.12
[master01]# kubeadm version -o json
※ 到其他master node執行
# kubeadm upgrade node
#-----------------------------------------------
# S2-6. 升級kubectl與kubelet (all masters)
#-----------------------------------------------
[master01]# yum list --showduplicates kubelet --disableexcludes=kubernetes
[master01]# yum install -y kubelet-1.25.12-0 kubectl-1.25.12-0 --disableexcludeds=kubernetes
[master01]# systemctl daemon-reload; systemctl restart kubelet
※ 全部完成後
[master01]# kubectl get nodes
#-------------------------------------------------
# S2-7. Uncordon workload (all masters)
#-------------------------------------------------
[master01]# kubectl uncordon master01.test.example.poc
[master01]# kubectl uncordon master02.test.example.poc
[master01]# kubectl uncordon master03.test.example.poc
※ Upgrade過程中,kubeadm會將etcd相關備份在節點的以下位置
[master01]# cd /etc/kubernetes/tmp
[master01]# ls -al
#-----------------------------------------------
# S3-1. 更新kubeadm (workers)
#-----------------------------------------------
[worker01]# yum install kubeadm-1.25.12-0
[worker02]# yum install kubeadm-1.25.12-0
#-----------------------------------------------
# S3-2. Drain workload
#-----------------------------------------------
[master01]# kubectl drain <worker-node> --ignore-daemonsets
[master01]# kubectl get nodes
#-------------------------------------------------
# S3-3. upgrade nodes (workers)
#-------------------------------------------------
[worker01]# kubeadm upgrade node
#----------------------------------------------
# S3-4. 升級kubectl與kubelet (all workers)
#----------------------------------------------
[worker01]# yum list --showduplicates kubelet --disableexcludes=kubernetes
[worker01]# yum install -y kubelet-1.25.12-0 kubectl-1.25.12-0 --disableexcludes=kubernetes
[worker01]# systemctl daemon-reload ; systemctl restart kubelet
※全部完成後
[master01]# kubectl get nodes
#-----------------------------------------------
# S3-5. uncordon workload (all workers)
#-----------------------------------------------
[master01]# kubectl uncordon worker01.test.example.poc
[master01]# kubectl uncordon worker02.test.example.poc
#------------------------------------------------
# S3-6. 確認Cluster狀態
#------------------------------------------------
[master01]# kubectl get --raw='/readyz?verbose'
#------------------------------------------------
# S3-7. 確認Pod狀態
#------------------------------------------------
[master01]# kubectl get po -n kube-system
以上就完成了小版本號的升級,通常這類型的升級比較可能發生在有Critical的問題需要修正的時候,因為每次升級都可能會影響應用服務,升級前務必要確認影響程度再執行。
至於y版本的升級基本上類似,只要注意升級路徑與影響即可。
最後,做任何升級動作前,一定要做:
備份! 備份! 備份!
備份的部份未來將在其他文章再進行分享,如果不知道要選擇什麼第三方工具時,至少也要做到官方所提到的ETCD備份。
Reference: