容器化技術興起后,k8s無疑成為了容器編排技術的事實標準。各行各業軟件領域的廣泛應用,進一步促進了k8s的快速發展,對應版本的更新也層出不窮。實際項目使用過程中,可能會遇到框架層面的bug在新版本中得到修復,高版本的一些特性剛好滿足新的業務需求,這時候就需要在原有k8s集群上進行升級。如何快速、平滑的實現k8s的版本更新?本文將向大家分享k8s常規在線升級過程,希望對大家有所幫助和參考。
升級緣由
本人測試環境centos 7 ,k8s 版本1.18.2,k8s集群基于官方推薦KubeAdm安裝。
升級原因:
centos 7 系統下實現k8s service kube-proxy ipvs模式,配置負載均衡時報如下錯誤。
E0326 15:20:23.159364 1 proxier.go:1950] Failed to list IPVS destinations, error: parseIP Error ip=[10 96 0 10 0 0 0 0 0 0 0 0 0 0 0 0]
E0326 15:20:23.159388 1 proxier.go:1192] Failed to sync endpoint for service: 10.8.0.10:53/UPD, err: parseIP Error ip=[10 96 0 16 0 0 0 0 0 0 0 0 0 0 0 0]
網上分析這個錯誤是k8s ipvs 依賴的模塊在centos 7 系統內核的ipvs中找不到,換句話說:k8s當前ipvs依賴版本高于centos 7 中的ipvs版本,兩個版本存在兼容問題。
解決方式:
- 升級centos 7 lvs內核版本。
- 升級k8s版本1.18.3+。
這里選擇升級k8s版本來解決問題。
在通過kubeadm安裝k8s集群時,kubeadm已自帶在線升級功能。所以本文介紹的升級功能僅限于kubeadm的集群安裝方式。rancher之類的k8s集群安裝不包含本文討論范圍內。
k8s內部包含很多組件,如api server、controller manager、Scheduler、kube proxy等。升級也包含了對應組件的版本升級。k8s升級有一個原則:各組件版本要么等于api server版本,要么小于api server一個小版本。版本號規則x.y.z,其中x為大版本,y小版本,z缺陷修復版本。比如:api server當前版本為1.18.2,kube proxy版本可以為1.18.*或者1.17.*。為便于維護,最好統一為同一版本。
本文示例版本號從1.18.3升級到1.18.6。
升級環境
- centos 7
- k8s kubeadm安裝集群
- 1個master節點,2個worker節點
版本升級
kubernetes 狀態檢查
master節點執行,查看當前狀態:
kubectl get node

檢查當前版本和升級方案
kubeadm upgrade plan

上圖可知:當前的集群cluster版本、kubeadm版本,可升級最近可用穩定版本。
升級前保證kubeadm等工具先升級到目標版本,這里是1.18.6。未選擇最新版本1.18.8,考慮版本太新國內鏡像未及時更新對應版本,升級時很容易timeout鏡像下載失敗。
yum -y install kubeadm-1.18.6 kubelet-1.18.6 kubectl-1.18.6

執行組件版本更新
kubeadm upgrade Apply v1.18.6
systemctl daemon-reload
systemctl restart kubelet

保證網絡暢通,耐心等待一段時間。出現以上提示信息,master節點升級成功。
其他master和worker節點執行以下操作
yum -y install kubeadm-1.18.6 kubelet-1.18.6 kubectl-1.18.6
systemctl daemon-reload
systemctl restart kubelet
master節點查看當前版本
kubectl version

上圖顯示server端對應版本1.18.6,升級成功。
總結
本文介紹了k8s集群的版本升級。了解到kubeadm的升級方案查看,版本選擇,升級執行命令使用。整個過程,不停機,應用無感知,保證集群的平滑更新。
由于環境所限,未有全面測試。若有所疏漏請多多指正。
對技術有熱情,請關注我!堅持原創,共同進步!謝謝。