[kubernetes]-kubeadm升級1.14.2到1.18.2

爺來辣發表於2021-01-04
導語:測試環境版本比較低1.14.2 需要升級到1.18 記錄一下自己大致的升級過程。給自己做筆記,中間可能有漏步驟,下次升級再來補唄。

此次升級是kubeadm安裝的k8s

kubbernetes版本相容性

在升級之前你需要了解各版本間的關係:

  1. kubernetes版本命名方式表示為XYZ,其中X表示主要版本,Y表示次要版本,Z表示補丁版本。
    比如 1.16.0
  2. K8s所有元件 kube-controller,kube-scheduler,kubelet的版本號不得高於kube-apiserver的版本號。
  3. 這些元件的版本號可低於kube-apiserver的1個次要版本,比如kube-apierver是1.16.0,其它元件的版本可以為1.16.x和1.15.x。
  4. 在一個HA叢集中,多個kube-apiserver間的版本號最多隻能相差一個次版本號,比如 1.16和1.15。
  5. 最好所有元件與kube-apiserver版本號完全一致。
  6. 因此升級Kubernetes叢集時,最先升級的核心元件就是kube-apiserver。
  7. 且只能向上升級為一個次要版本。
  8. kubectl版本最多隻能比kube-apiserver高或低一個次版本號。

巨集觀升級流程

  1. 升級主控制平面節點。
  2. 升級其他控制平面節點。
  3. 升級Node節點。

升級注意事項

  1. 確定升級前的的kubeadm叢集版本。
  2. kubeadm upgrade不會影響到工作負載,僅涉及k8s內部的元件,但是備份etcd資料庫是最佳實踐。
  3. 升級後,所有容器都會重啟動,因為容器的hash值已更改。
  4. 由於版本的相容性,只能從一個次要版本升級到另外一個次要版本,不能跳躍升級。
  5. 叢集控制平面應使用靜態Pod和etcd pod或外部etcd。

kubeadm upgrade 叢集升級命令詳解

通過查詢命令列幫助:

$ kubeadm upgrade -h

Upgrade your cluster smoothly to a newer version with this command.

Usage:
  kubeadm upgrade [flags]
  kubeadm upgrade [command]
`

Available Commands:
  apply       Upgrade your Kubernetes cluster to the specified version.
  diff        Show what differences would be applied to existing static pod manifests. See also: kubeadm upgrade apply --dry-run
  node        Upgrade commands for a node in the cluster. Currently only supports upgrading the configuration, not the kubelet itself.
  plan        Check which versions are available to upgrade to and validate whether your current cluster is upgradeable. To skip the internet check, pass in the optional [version] parameter.

命令解析:

  • apply: 升級Kubernetes叢集到指定版本。
  • diff: 即將執行的靜態Pod檔案清單與當前正執行的靜態Pod清單檔案的差異。
  • node: 升級叢集中的node,當前(v1.16)僅支援升級kubelet的配置檔案(/var/lib/kubelet/config.yaml),而非kubelet本身。
  • plan: 檢測當前叢集是否可升級,並支援升級到哪些版本。

其中node子命令又支援如下子命令和選項:

$ kubeadm upgrade node  -h
Upgrade commands for a node in the cluster. Currently only supports upgrading the configuration, not the kubelet itself.

Usage:
  kubeadm upgrade node [flags]
  kubeadm upgrade node [command]

Available Commands:
  config                     Downloads the kubelet configuration from the cluster ConfigMap kubelet-config-1.X, where X is the minor version of the kubelet.
  experimental-control-plane Upgrades the control plane instance deployed on this node. IMPORTANT. This command should be executed after executing `kubeadm upgrade apply` on another control plane instance

Flags:
  -h, --help   help for node

Global Flags:
      --log-file string   If non-empty, use this log file
      --rootfs string     [EXPERIMENTAL] The path to the 'real' host root filesystem.
      --skip-headers      If true, avoid header prefixes in the log messages
  -v, --v Level           number for the log level verbosity

命令解析:

  • config: 從叢集configmap中下載kubelet的配置檔案kubelet-config-1.x,其中x是kubelet的次要版本。
  • experimental-control-plane: 升級部署在此節點的控制平面各元件, 通常在第一個控制平面例項上執行"kubeadm upgrade apply"後,應執行此命令。

開始升級

想直接升級到1.18 炸了

kubectl get nodes
kubectl version

升級CNI外掛。

這一步是可選的,查詢CNI外掛是否可以升級。

yum list --showduplicates kubeadm --disableexcludes=kubernetes 

#  升級kubeadm版本
yum install  kubeadm-1.18.13-0 kubelet-1.18.13-0  kubectl-1.18.13-0
# 安裝完成之後 確認一下各個元件的版本 確保是你想要的
kubelet --version
kubectl version
kubeadm version

# 升級檢查和方案
kubeadm upgrade plan

老老實實一個個版本升級

1.14.2 >1.15.2
1.15.2 > 1.16.2
1.16.2 > 1.17.2
1.17.2 > 1.18.2
# 刪除剛剛裝的1.18
yum remove -y  kubectl-1.18.13
yum -y remove kubelet-1.18.13-0.x86_64

yum install  kubeadm-1.15.2-0 kubelet-1.15.2-0  kubectl-1.15.2-0 -y

kubeadm upgrade plan

檢視 kubeadm 的配置
kubeadm config view > /tmp/kubeadm-config.yaml
升級1.15.2
kubeadm upgrade apply v1.15.2

這樣子升級好kubectl版本就一致了

繼續升級

報錯了 ERROR CoreDNSUnsupportedPlugins]: there are unsupported plugins in the CoreDNS Corefile

網上說是因為coredns裡的host模組的問題 需要註釋掉

# edit configmap 並註釋
kubectl edit cm coredns -n kube-system

繼續嘗試升級 依舊報錯

there are NotReady control-planes in the cluster: [op-k8s-m001]

此時檢視node狀態會發現master 是notready

檢視報錯

journalctl -u kubelet | tail -n 300

臨時解決的辦法是給 /etc/cni/net.d/10-flannel.conflist 新增cniVersion欄位

重啟Node後將需要重做,終極辦法是在Master上更新Flannel(新的版本帶有cniVersion欄位)或者修改Flannel的ConfigMap kubectl edit cm kube-flannel-cfg -n kube-system,因為這個配置是Node加入時讀取的。

繼續升級

報錯There are kubelets in this cluster that are too old that have these versions [v1.14.2]

升級node的kubelet

yum install  kubelet-1.15.2-0 -y
systemctl daemon-reload
systemctl restart kubelet
systemctl status  kubelet

繼續升級

master成功升級到1.16.2

升級node到1.16.2

yum install  kubelet-1.16.2-0 -y
systemctl daemon-reload
systemctl restart kubelet
systemctl status  kubelet

升級master到1.17.2

yum install  kubeadm-1.17.2-0 kubelet-1.17.2-0  kubectl-1.17.2-0 -y
kubeadm upgrade plan
kubeadm upgrade apply v1.17.2

升級node到1.17.2

yum install  kubelet-1.17.2-0 -y
systemctl daemon-reload
systemctl restart kubelet
systemctl status  kubelet

升級到1.18.2

master

yum install  kubeadm-1.18.2-0 kubelet-1.18.2-0  kubectl-1.18.2-0 -y
kubeadm upgrade plan
kubeadm upgrade apply v1.18.2

升級node到1.18.2

yum install  kubelet-1.18.2-0 -y
systemctl daemon-reload
systemctl restart kubelet
systemctl status  kubelet

升級完成

相關文章