一.升级策略
- 始终保持最新
- 每半年升级一次,这样会落后社区1~2个小版本
- 一年升级一次,或者更长,落后版本太多
二.注意事项
升级前必须备份所有组件及数据,例如etcd
千万不要跨多个小版本进行升级,例如从1.20升级到1.22(比如现在有1.20,1.21,1.22,不要从1.20到1.22,因为官方对每个API版本的改动只兼容两个小版本,比如从1.20到1.22跨越多个版本,那么可能导致在1.22里面弃用了某个api,或者某个参数,那么原先在1.20当中可以使用的功能在1.22当中导致不可以使用)所以建议一个一个小版本升级,如1.20-->1.21,1.21可以正常使用再到1.22
三.升級master節點
1.备份 etcd
mkdir etcd-backup
cd etcd-backup
etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --endpoints=10.210.51.110:2379 snapshot save `hostname`-etcd_`date +%Y%m%d%H%M`.db
2.验证备份数据
etcdctl snapshot status k8s-master-01-etcd_202311140836.db --write-out=table
Master 节点都执行一下备份,恢复备份只需恢复其中一个节点的数据即可。
3.查看当前版本
[root@k8s-master-02 yum.repos.d]# kubectl get node
4.查找最新版本号 查看kubeadm工具
yum list --showduplicates kubeadm --disableexcludes=kubernetes
5.升级kubeadm工具
yum install -y kubeadm-1.20.15-0 --disableexcludes=kubernetes
6.驱逐node上的pod,且不可调度(除了demosets之外的pod都会驱逐)
kubectl drain k8s-master-02 --ignore-daemonsets
出現以下報錯
解決方法:加-delete-emptydir-data 參數
kubectl drain k8s-master-02 --ignore-daemonsets --delete-emptydir-data
可能出現這種報錯:
error when evicting pods/"activator-546897c9dd-c2w5s" -n "knative-serving" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.
報錯解決方法參考大神博客:https://juejin.cn/post/7257333598470586426
可以看到节点为不可调度,pod不会分配到该节点
7.检查集群是否可以升级,并获取可以升级的版本
kubeadm upgrade plan
8.执行升级
kubeadm upgrade apply v1.20.15
9.取消不可调度
[root@k8s-master-02 ~]# kubectl uncordon k8s-master-02
node/k8s-master-02 uncordoned
10.升级kubelet和kubectl
yum install -y kubelet-1.20.15 kubectl-1.20.15 --disableexcludes=kubernetes
11.重启kubelet
[root@k8s-master-02 ~]# systemctl daemon-reload
[root@k8s-master-02 ~]# systemctl restart kubelet
12.驗證升級結果
kubectl get node
四.升级工作节点
1.升级kubeadm (所有node節點上執行)
[root@k8s-node-01 ~]# yum install -y kubeadm-1.20.15-0 --disableexcludes=kubernetes
2.驱逐node上的pod,且不可调度(master節點上執行)
[root@k8s-master-01 ~]# kubectl drain k8s-node-01 --ignore-daemonsets --delete-local-data
驅逐所有節點上的pod
3.升级kubelet配置
kubeadm upgrade node
4.升级kubelet和kubectl (所有node節點)
yum install -y kubelet-1.20.15 kubectl-1.20.15 --disableexcludes=kubernetes
5. 重启kubelet
[root@k8s-node-01 ~]# systemctl daemon-reload
[root@k8s-node-01 ~]# systemctl restart kubelet
6.取消不可调度,节点重新上线(在master節點對所有節點執行)
[root@k8s-master-01 ~]# kubectl uncordon k8s-node-01
node/k8s-node-01 uncordoned
[root@k8s-master-01 ~]# kubectl uncordon k8s-node-02
node/k8s-node-02 uncordoned
[root@k8s-master-01 ~]# kubectl uncordon k8s-node-03
node/k8s-node-03 uncordoned
7.驗證集群版本
kubectl get node
已成功升級到1.20.15,從1.20.15版本升級到1.21.14版本重新按照以上步驟執行升級即可,升級的順序:
1.20.14——>1.20.15——>1.21.14——>1.22.17——>1.23.17