- 一、環境
- 二、注意事項
- 1、備份資料
- 2、跨版本升級
- 3、支援的版本偏差
- 3.1、kube-apiserver
- 3.2、kubeklet
- 3.3、kube-proxy
- 3.4、kube-controller-manager、kube-scheduler 和 cloud-controller-manager
- 3.5、kubectl
- 4、升級流程
- 三、版本升級(補丁版本升級)
- 1、檢視當前版本
- 2、確定要升級到的版本
- 3、升級 master 節點
- 3.1、升級 kubeadm
- 3.2、驗證下載的 kubeadm 版本是否正確
- 3.3、驗證升級計劃
- 3.4、根據提示,選擇合適版本升級
- 3.5、設定 master 節點進入維護狀態
- 3.6、升級 kubelet 和 kubectl
- 3.7、過載重啟 kubelet
- 3.8、解除對 master 節點的隔離狀態
- 3.9、驗證 master 節點升級情況
- 4、升級 Worker 節點
- 4.1、升級 kubeadm
- 4.2、升級 kubelet 的配置
- 4.3、設定 worker 節點為維護狀態
- 4.4、升級 kubelet 和 kubectl
- 4.5、過載重啟 kubelet
- 4.6、解除對 worker 節點的隔離狀態
- 5、最終結果
- 四、版本升級(次要版本升級)
- 1、檢視當前版本
- 2、升級 master 節點
- 2.1、升級 kubeadm
- 2.1.1、下載的 kubeadm 版本超過了當前叢集可以升級的版本怎麼辦
- 2.2、驗證下載的 kubeadm 版本是否正確
- 2.3、驗證升級計劃
- 2.4、根據提示,選擇合適版本升級
- 2.5、設定 master 節點進入維護狀態
- 2.6、升級 kubelet 和 kubectl
- 2.7、過載重啟 kubelet
- 2.8、解除對 master 節點的隔離狀態
- 2.9、驗證 master 節點升級情況
- 2.1、升級 kubeadm
- 3、升級 Worker 節點
- 3.1、升級 kubeadm
- 3.2、升級 kubelet 的配置
- 3.3、設定 worker 節點為維護狀態
- 3.4、升級 kubelet 和 kubectl
- 3.5、過載重啟 kubelet
- 3.6、解除對 worker 節點的隔離狀態
- 4、驗證
- 五、工作原理
- 1、kubeadm upgrade apply 做了以下工作:
- 2、kubeadm upgrade node 在其他控制平節點上執行以下操作:
- 3、kubeadm upgrade node 在工作節點上完成以下工作:
一、環境
作業系統 | CentOS Linux release 7.9.2009 (Core) |
---|---|
Kubernetes 部署工具 | kubeadm |
叢集架構 | 一個主節點(Master Node)和兩個工作節點(Worker Nodes) |
部署環境 | Vmware Workstation 16 Pro |
網路外掛 | Flannel |
二、注意事項
1、備份資料
升級前最好備份所有元件及資料,例如etcd
2、跨版本升級
不要跨兩個大版本進行升級,可能會存在版本bug
Kubernetes 版本以 x.y.z
表示,其中 x 是主要版本
, y 是次要版本
,z 是補丁版本
-
1.22.2 --> 1.22.16 可以
-
1.22.2 --> 1.23.2 可以
-
1.22.2 --> 1.25.2 不可以
-
跨多個版本的可以逐個版本進行升級。
3、支援的版本偏差
3.1、kube-apiserver
在高可用性(HA)叢集中, 最新版和最老版的 kube-apiserver
例項版本偏差最多為一個次要版本。
例如:
- 最新的
kube-apiserver
例項處於 1.31 版本 - 其他
kube-apiserver
例項支援 1.31 和 1.30 版本
3.2、kubeklet
kubelet
版本不能比kube-apiserver
版本新。kubelet
可以比kube-apiserver
低三個次要版本(如果kubelet
< 1.25,則只能比kube-apiserver
低兩個次要版本)。
例如:
kube-apiserver
處於 1.31 版本kubelet
支援 1.31、1.30、1.29 和 1.28 版本
如果 HA 叢集中的
kube-apiserver
例項之間存在版本偏差,這會縮小允許的kubelet
版本範圍。
例如:
kube-apiserver
例項處於 1.31 和 1.30 版本kubelet
支援 1.30、1.29 和 1.28 版本(不支援 1.31 版本,因為這將比kube-apiserver
1.30 版本的例項新)
3.3、kube-proxy
kube-proxy
不能比kube-apiserver
新。kube-proxy
最多可以比kube-apiserver
舊三個小版本(kube-proxy
< 1.25 最多隻能比kube-apiserver
舊兩個小版本)。kube-proxy
可能比它旁邊執行的kubelet
例項舊或新最多三個次要版本(kube-proxy
< 1.25 最多隻能是比它並行執行的kubelet
例項舊或新的兩個次要版本)。
例如:
kube-apiserver
的版本是 1.31kube-proxy
支援的版本是 1.31、 1.30 、1.29 和 1.28
如果在 HA 叢集中的
kube-apiserver
例項之間存在版本偏差, 所允許的kube-proxy
版本範圍會被縮小。
例如:
kube-apiserver
例項的版本是 1.31 和 1.30kube-proxy
版本為 1.30、 1.29 和 1.28(1.31 將不被支援, 因為該版本將比 1.30 的 kube-apiserver 例項更新)
3.4、kube-controller-manager、kube-scheduler 和 cloud-controller-manager
kube-controller-manager
、kube-scheduler
和 cloud-controller-manager
不能比與它們通訊的 kube-apiserver
例項新。 它們應該與 kube-apiserver
次要版本相匹配,但可能最多舊一個次要版本(允許實時升級)。
例如:
kube-apiserver
處於 1.31 版本kube-controller-manager
、kube-scheduler
和cloud-controller-manager
支援 1.31 和 1.30 版本
如果 HA 叢集中的
kube-apiserver
例項之間存在版本偏差, 並且這些元件可以與叢集中的任何kube-apiserver
例項通訊(例如,透過負載均衡器),這會縮小這些元件所允許的版本範圍。
例如:
kube-apiserver
例項處於 1.31 和 1.30 版本kube-controller-manager
、kube-scheduler
和cloud-controller-manager
與可以路由到任何kube-apiserver
例項的負載均衡器通訊kube-controller-manager
、kube-scheduler
和cloud-controller-manager
支援 1.30 版本(不支援 1.31 版本,因為它比 1.30 版本的kube-apiserver
例項新)
3.5、kubectl
kubectl
在 kube-apiserver
的一個次要版本(較舊或較新)中支援。
例如:
kube-apiserver
處於 1.31 版本kubectl
支援 1.32、1.31 和 1.30 版本
如果 HA 叢集中的
kube-apiserver
例項之間存在版本偏差,這會縮小支援的kubectl
版本範圍。
例如:
kube-apiserver
例項處於 1.31 和 1.30 版本kubectl
支援 1.31 和 1.30 版本(其他版本將與kube-apiserver
元件之一相差不止一個的次要版本)
4、升級流程
- 升級主控制平面節點
- 升級其他控制平面節點
- 升級工作節點
三、版本升級(補丁版本升級)
目標:v1.22.2 --> v1.22.16
1、檢視當前版本
kubectl get nodes
2、確定要升級到的版本
當前我們的版本在1.22.2,我們需要升級到1.22.16(屬於補丁版本升級)
查詢版本,會列出當前所有的正式版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes
3、升級 master 節點
控制面上的升級過程應該每次處理一個節點。 首先選擇一個要先行升級的控制面節點。該節點上必須擁有 /etc/kubernetes/admin.conf
檔案。 即管理員使用的 kubeconfig 證書檔案
3.1、升級 kubeadm
yum install -y kubeadm-1.22.16-0 --disableexcludes=kubernetes
3.2、驗證下載的 kubeadm 版本是否正確
kubeadm version
3.3、驗證升級計劃
檢查你的叢集是否可被升級,並取回你要升級的目標版本。 命令也會顯示一個包含元件配置版本狀態的表格。
kubeadm upgrade plan
在列印資訊中可以看到,升級叢集每個元件對應的當前版本和升級後的版本。而且升級的元件只包括kube-apiserver,kube-controller-manager,kube-scheduler,kube-proxy,CoreDNS,etcd。
不包括kubectl,kubelet,docker和網路元件flannel等
3.4、根據提示,選擇合適版本升級
kubeadm upgrade apply v1.22.16
過程中會互動式的詢問你是否繼續升級 |
---|
輸入 y 確認繼續後進入到映象預拉取階段,可以提前輸入 kubeadm config images pull 拉取必須映象減少升級時間 |
成功出現 SUCCESS! 即可 |
3.5、設定 master 節點進入維護狀態
透過將 master 節點標記為不可排程並騰空節點為 master 節點作升級準備
kubectl drain k8s-master1 --ignore-daemonsets
3.6、升級 kubelet 和 kubectl
同樣的,把 kubelet 和 kubectl 都升級到 1.22.16 版本
yum install -y kubelet-1.22.16-0 kubectl-1.22.16-0 --disableexcludes=kubernetes
3.7、過載重啟 kubelet
systemctl daemon-reload && systemctl restart kubelet
3.8、解除對 master 節點的隔離狀態
kubectl uncordon k8s-master1
3.9、驗證 master 節點升級情況
已成功升級到 1.22.16 版本
kubectl get nodes
4、升級 Worker 節點
工作節點上的升級過程最好一次執行一個節點,一次執行幾個節點也行
4.1、升級 kubeadm
yum install -y kubeadm-1.22.16-0 --disableexcludes=kubernetes
4.2、升級 kubelet 的配置
kubeadm upgrade node
4.3、設定 worker 節點為維護狀態
kubectl drain k8s-node1 --ignore-daemonsets
4.4、升級 kubelet 和 kubectl
yum install -y kubelet-1.22.16-0 kubectl-1.22.16-0 --disableexcludes=kubernetes
4.5、過載重啟 kubelet
systemctl daemon-reload && systemctl restart kubelet
4.6、解除對 worker 節點的隔離狀態
剩下的節點也是重複
4、升級 Worker 節點
的操作即可
kubectl uncordon k8s-node1
5、最終結果
done
kubectl get nodes
四、版本升級(次要版本升級)
目標:v1.22.16 --> v1.23.16
1、檢視當前版本
kubectl get nodes
2、升級 master 節點
2.1、升級 kubeadm
yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes
2.1.1、下載的 kubeadm 版本超過了當前叢集可以升級的版本怎麼辦
- 解除安裝當前版本的
kubeadm
- 清理快取
- 重新安裝指定 kubeadm 版本
yum remove kubeadm
yum clean all
yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes
2.2、驗證下載的 kubeadm 版本是否正確
kubeadm version
2.3、驗證升級計劃
kubeadm upgrade plan
2.4、根據提示,選擇合適版本升級
kubeadm upgrade apply v1.23.16
2.5、設定 master 節點進入維護狀態
kubectl drain k8s-master1 --ignore-daemonsets
2.6、升級 kubelet 和 kubectl
同樣的,把 kubelet 和 kubectl 都升級到 1.23.16 版本
yum install -y kubelet-1.23.16-0 kubectl-1.23.16-0 --disableexcludes=kubernetes
2.7、過載重啟 kubelet
systemctl daemon-reload && systemctl restart kubelet
2.8、解除對 master 節點的隔離狀態
kubectl uncordon k8s-master1
2.9、驗證 master 節點升級情況
kubectl get nodes
3、升級 Worker 節點
3.1、升級 kubeadm
ansible 的執行升級操作
ansible k8s-node -m shell -a 'yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes'
3.2、升級 kubelet 的配置
ansible k8s-node -m shell -a 'kubeadm upgrade node'
3.3、設定 worker 節點為維護狀態
kubectl drain k8s-node1 --ignore-daemonsets
kubectl drain k8s-node2 --ignore-daemonsets
3.4、升級 kubelet 和 kubectl
ansible k8s-node -m shell -a 'yum install -y kubelet-1.23.16-0 kubectl-1.23.16-0 --disableexcludes=kubernetes'
3.5、過載重啟 kubelet
ansible k8s-node -m shell -a 'systemctl daemon-reload && systemctl restart kubelet'
3.6、解除對 worker 節點的隔離狀態
kubectl uncordon k8s-node1
kubectl uncordon k8s-node2
4、驗證
kubectl get nodes
五、工作原理
1、kubeadm upgrade apply 做了以下工作:
kubeadm upgrade apply
做了以下工作:
- 檢查你的叢集是否處於可升級狀態:
- API 伺服器是可訪問的
- 所有節點處於
Ready
狀態 - 控制面是健康的
- 強制執行版本偏差策略。
- 確保控制面的映象是可用的或可拉取到伺服器上。
- 如果元件配置要求版本升級,則生成替代配置與/或使用使用者提供的覆蓋版本配置。
- 升級控制面元件或回滾(如果其中任何一個元件無法啟動)。
- 應用新的
CoreDNS
和kube-proxy
清單,並強制建立所有必需的 RBAC 規則。 - 如果舊檔案在 180 天后過期,將建立 API 伺服器的新證書和金鑰檔案並備份舊檔案。
2、kubeadm upgrade node 在其他控制平節點上執行以下操作:
- 從叢集中獲取 kubeadm
ClusterConfiguration
。 - (可選操作)備份 kube-apiserver 證書。
- 升級控制平面元件的靜態 Pod 清單。
- 為本節點升級 kubelet 配置
3、kubeadm upgrade node 在工作節點上完成以下工作:
- 從叢集取回 kubeadm
ClusterConfiguration
。 - 為本節點升級 kubelet 配置。