目录
升级主控制平面节点
确定要升级到哪个版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes
# 在列表中查找最新的 1.23 版本
# 它看起来应该是 1.23.x-0,其中 x 是最新的补丁版本
升级第一个控制面节点
如果你的集群是使用 kubeadm 安装工具部署而来, 那么需要先安装要升级的 kubeadm 版本
[root@server1 ~]# yum install -y kubeadm-1.22.2-0 #安装预升级把版本
[root@server1 ~]# kubeadm version #验证下载操作正常,并且 kubeadm 版本正确
[root@server1 ~]# kubeadm upgrade plan #验证升级计划
kubeadm upgrade 也会自动对 kubeadm 在节点上所管理的证书执行续约操作。 如果需要略过证书续约操作,可以使用标志 --certificate-renewal=false
如果 kubeadm upgrade plan 给出任何需要手动升级的组件配置,用户必须 通过 --config 命令行标志向 kubeadm upgrade apply 命令提供替代的配置文件。 如果不这样做,kubeadm upgrade apply 会出错并退出,不再执行升级操作。
[root@server1 ~]# kubeadm upgrade apply v1.22.2 #此时他会下载你的控制器 apiserver, scheduler ,但是无法升级 etcd ,可以把 --etcd-upgrade 改为 false
一旦该命令结束,你应该会看到:
腾空节点
此时 node 中版本还未升级,但 pod 版本已经升级,pod 中 apiserver 时间运行已经更新
[root@server1 ~]# kubectl drain server1 --ignore-daemonsets #腾空 server1 节点
[root@server1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
server1 Ready,SchedulingDisabled control-plane,master 27h v1.22.1
server2 Ready <none> 27h v1.22.1
server3 Ready <none> 27h v1.22.1
## server1 节点调度已经被驱离
升级 kubelet 和 kubectl
[root@server1 ~]# yum install -y kubelet-1.22.2-0 kubectl-1.22.2-0
[root@server1 ~]# systemctl daemon-reload
[root@server1 ~]# systemctl restart kubelet.service
[root@server1 ~]# kubectl uncordon server1 ##解除保护
[root@server1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
server1 Ready control-plane,master 27h v1.22.2
server2 Ready <none> 27h v1.22.1
server3 Ready <none> 27h v1.22.1
升级工作节点
[root@server2 ~]# yum install -y kubeadm-1.22.2-0 --disableexcludes=kubernetes
[root@server3 ~]# yum install -y kubeadm-1.22.2-0 --disableexcludes=kubernetes
[root@server2 ~]# kubeadm upgrade node #升级本地的 kubelet 配置
腾空节点, 升级 kubelet 和 kubectl
注意:不能同时驱离所有节
[root@server1 ~]# kubectl drain server2 --ignore-daemonsets
[root@server2 ~]# yum install -y kubelet-1.22.2-0 kubectl-1.22.2-0
[root@server3 ~]# yum install -y kubelet-1.22.2-0 kubectl-1.22.2-0
[root@server2 ~]# systemctl daemon-reload
[root@server2 ~]# systemctl restart kubelet.service
[root@server1 ~]# kubectl uncordon server2
[root@server1 ~]# kubectl drain server3 --ignore-daemonsets
[root@server3 ~]# systemctl daemon-reload
[root@server3 ~]# systemctl restart kubelet.service