升級 kubeadm 部署的 k8s 叢集

misakivv發表於2024-08-17

目錄
  • 一、環境
  • 二、注意事項
    • 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 節點升級情況
    • 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

image-20240816222113474

二、注意事項

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.311.30 版本

3.2、kubeklet

  • kubelet 版本不能比 kube-apiserver 版本新。
  • kubelet 可以比 kube-apiserver 低三個次要版本(如果 kubelet < 1.25,則只能比 kube-apiserver 低兩個次要版本)。

例如:

  • kube-apiserver 處於 1.31 版本
  • kubelet 支援 1.311.301.291.28 版本

如果 HA 叢集中的 kube-apiserver 例項之間存在版本偏差,這會縮小允許的 kubelet 版本範圍。

例如:

  • kube-apiserver 例項處於 1.311.30 版本
  • kubelet 支援 1.301.291.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.31
  • kube-proxy 支援的版本是 1.311.301.291.28

如果在 HA 叢集中的 kube-apiserver 例項之間存在版本偏差, 所允許的 kube-proxy 版本範圍會被縮小。

例如:

  • kube-apiserver 例項的版本是 1.311.30
  • kube-proxy 版本為 1.301.291.281.31 將不被支援, 因為該版本將比 1.30 的 kube-apiserver 例項更新)

3.4、kube-controller-manager、kube-scheduler 和 cloud-controller-manager

kube-controller-managerkube-schedulercloud-controller-manager 不能比與它們通訊的 kube-apiserver 例項新。 它們應該與 kube-apiserver 次要版本相匹配,但可能最多舊一個次要版本(允許實時升級)。

例如:

  • kube-apiserver 處於 1.31 版本
  • kube-controller-managerkube-schedulercloud-controller-manager 支援 1.311.30 版本

如果 HA 叢集中的 kube-apiserver 例項之間存在版本偏差, 並且這些元件可以與叢集中的任何 kube-apiserver 例項通訊(例如,透過負載均衡器),這會縮小這些元件所允許的版本範圍。

例如:

  • kube-apiserver 例項處於 1.311.30 版本
  • kube-controller-managerkube-schedulercloud-controller-manager 與可以路由到任何 kube-apiserver 例項的負載均衡器通訊
  • kube-controller-managerkube-schedulercloud-controller-manager 支援 1.30 版本(不支援 1.31 版本,因為它比 1.30 版本的 kube-apiserver 例項新)

3.5、kubectl

kubectlkube-apiserver 的一個次要版本(較舊或較新)中支援。

例如:

  • kube-apiserver 處於 1.31 版本
  • kubectl 支援 1.321.311.30 版本

如果 HA 叢集中的 kube-apiserver 例項之間存在版本偏差,這會縮小支援的 kubectl 版本範圍。

例如:

  • kube-apiserver 例項處於 1.311.30 版本
  • kubectl 支援 1.311.30 版本(其他版本將與 kube-apiserver 元件之一相差不止一個的次要版本)

4、升級流程

  1. 升級主控制平面節點
  2. 升級其他控制平面節點
  3. 升級工作節點

三、版本升級(補丁版本升級)

目標:v1.22.2 --> v1.22.16

1、檢視當前版本

kubectl get nodes

image-20240816224832825

2、確定要升級到的版本

當前我們的版本在1.22.2,我們需要升級到1.22.16(屬於補丁版本升級)

查詢版本,會列出當前所有的正式版本

yum list --showduplicates kubeadm --disableexcludes=kubernetes

image-20240816225137148

image-20240816225416947

3、升級 master 節點

控制面上的升級過程應該每次處理一個節點。 首先選擇一個要先行升級的控制面節點。該節點上必須擁有 /etc/kubernetes/admin.conf 檔案。 即管理員使用的 kubeconfig 證書檔案

3.1、升級 kubeadm

yum install -y kubeadm-1.22.16-0 --disableexcludes=kubernetes

image-20240816230623694

3.2、驗證下載的 kubeadm 版本是否正確

kubeadm version

image-20240816230955944

3.3、驗證升級計劃

檢查你的叢集是否可被升級,並取回你要升級的目標版本。 命令也會顯示一個包含元件配置版本狀態的表格。

kubeadm upgrade plan

在列印資訊中可以看到,升級叢集每個元件對應的當前版本和升級後的版本。而且升級的元件只包括kube-apiserver,kube-controller-manager,kube-scheduler,kube-proxy,CoreDNS,etcd。

不包括kubectl,kubelet,docker和網路元件flannel等

image-20240816231419740

3.4、根據提示,選擇合適版本升級

kubeadm upgrade apply v1.22.16
過程中會互動式的詢問你是否繼續升級
image-20240816232106747
輸入 y 確認繼續後進入到映象預拉取階段,可以提前輸入 kubeadm config images pull 拉取必須映象減少升級時間
image-20240816232434350
成功出現 SUCCESS! 即可
image-20240816232717075

3.5、設定 master 節點進入維護狀態

透過將 master 節點標記為不可排程並騰空節點為 master 節點作升級準備

kubectl drain k8s-master1 --ignore-daemonsets

image-20240816233244694

3.6、升級 kubelet 和 kubectl

同樣的,把 kubelet 和 kubectl 都升級到 1.22.16 版本

yum install -y kubelet-1.22.16-0 kubectl-1.22.16-0 --disableexcludes=kubernetes

image-20240816233704346

3.7、過載重啟 kubelet

systemctl daemon-reload && systemctl restart kubelet

3.8、解除對 master 節點的隔離狀態

kubectl uncordon k8s-master1

image-20240816234007684

3.9、驗證 master 節點升級情況

已成功升級到 1.22.16 版本

kubectl get nodes

image-20240816234111917

4、升級 Worker 節點

工作節點上的升級過程最好一次執行一個節點,一次執行幾個節點也行

4.1、升級 kubeadm

yum install -y kubeadm-1.22.16-0 --disableexcludes=kubernetes

4.2、升級 kubelet 的配置

kubeadm upgrade node

image-20240816235318868

4.3、設定 worker 節點為維護狀態

kubectl drain k8s-node1 --ignore-daemonsets

image-20240816235605499

4.4、升級 kubelet 和 kubectl

yum install -y kubelet-1.22.16-0 kubectl-1.22.16-0 --disableexcludes=kubernetes

image-20240816235851005

4.5、過載重啟 kubelet

systemctl daemon-reload && systemctl restart kubelet

4.6、解除對 worker 節點的隔離狀態

剩下的節點也是重複 4、升級 Worker 節點 的操作即可

kubectl uncordon k8s-node1

image-20240817000130904

5、最終結果

done

kubectl get nodes

image-20240817001149416

四、版本升級(次要版本升級)

目標:v1.22.16 --> v1.23.16

1、檢視當前版本

kubectl get nodes

image-20240817003538157

2、升級 master 節點

2.1、升級 kubeadm

yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes

image-20240817005552826

2.1.1、下載的 kubeadm 版本超過了當前叢集可以升級的版本怎麼辦

  • 解除安裝當前版本的 kubeadm
  • 清理快取
  • 重新安裝指定 kubeadm 版本
yum remove kubeadm
yum clean all
yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes

image-20240817005214570

2.2、驗證下載的 kubeadm 版本是否正確

kubeadm version

image-20240817005634121

2.3、驗證升級計劃

kubeadm upgrade plan

2.4、根據提示,選擇合適版本升級

kubeadm upgrade apply v1.23.16

image-20240817010743778

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

image-20240817011335616

2.7、過載重啟 kubelet

systemctl daemon-reload && systemctl restart kubelet

2.8、解除對 master 節點的隔離狀態

kubectl uncordon k8s-master1

2.9、驗證 master 節點升級情況

kubectl get nodes

image-20240817011606122

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

image-20240817014701797

五、工作原理

1、kubeadm upgrade apply 做了以下工作:

kubeadm upgrade apply 做了以下工作:

  • 檢查你的叢集是否處於可升級狀態:
    • API 伺服器是可訪問的
    • 所有節點處於 Ready 狀態
    • 控制面是健康的
  • 強制執行版本偏差策略。
  • 確保控制面的映象是可用的或可拉取到伺服器上。
  • 如果元件配置要求版本升級,則生成替代配置與/或使用使用者提供的覆蓋版本配置。
  • 升級控制面元件或回滾(如果其中任何一個元件無法啟動)。
  • 應用新的 CoreDNSkube-proxy 清單,並強制建立所有必需的 RBAC 規則。
  • 如果舊檔案在 180 天后過期,將建立 API 伺服器的新證書和金鑰檔案並備份舊檔案。

2、kubeadm upgrade node 在其他控制平節點上執行以下操作:

  • 從叢集中獲取 kubeadm ClusterConfiguration
  • (可選操作)備份 kube-apiserver 證書。
  • 升級控制平面元件的靜態 Pod 清單。
  • 為本節點升級 kubelet 配置

3、kubeadm upgrade node 在工作節點上完成以下工作:

  • 從叢集取回 kubeadm ClusterConfiguration
  • 為本節點升級 kubelet 配置。

相關文章