一个正常的k8s集群,由至少一个控制节点与多个工作节点组成,我们的容器pod运行在各个节点之中。
情况就是这个情况,处于某种不可抗的情况下,我们需要将k8s集群中的控制平面节点组件,从v1.23.1版本升级到v1.23.2,更新一个小版本。主要是更新kubeadm、kubelet、kubectl。
需要先将控制节点腾空,设置停止调度并且驱逐节点上的pod;其次按顺序更新kubeadm\kubelet\kubectl。并且控制节点的所有升级,都是在联通外网的条件下进行,避免很多不必要的麻烦。
1.将所需要升级的控制节点腾空
// 多个集群情况下,我们需要手动切换到所需要更新的集群中
student@node01:~$ kubectl config use-context k8s-dep
// cordon 停止调度,将node调为SchedulingDisabled。新pod不会被调度到该node,但在该node的旧pod不受影响。
student@node01:~$ kubectl cordon master01 node/master01 cordoned
// drain 驱逐节点。首先,驱逐该node上的pod,并在其他节点重新创建。
student@node01:~$ kubectl drain master01 --ignore-daemonsets node/master01 already cordoned WARNING: ignoring DaemonSet-managed Pods: kube-system/kube-flannel-ds-vmd6h, kube-system/kube-proxy-wgj54 evicting pod kube-system/coredns-6d8c4cb4d-t5n94 evicting pod kube-system/coredns-6d8c4cb4d-p68v8 pod/coredns-6d8c4cb4d-p68v8 evicted pod/coredns-6d8c4cb4d-t5n94 evicted node/master01 drained
//接着,将节点调为 SchedulingDisabled。现在检查节点是schedulingdisabled状态
student@node01:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready,SchedulingDisabled control-plane,master 127d v1.23.1
2.更新控制平面节点中的kubeadm
//检查kubeadm 版本
root@master01:~# apt-cache show kubeadm | grep 1.23.2 Version: 1.23.2-00
//更新kubeadm版本
root@master01:~# apt-get update root@master01:~# apt-get install kubeadm=1.23.2-00
//检查版本
root@master01:~# kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.2", GitCommit:"9d142434e3af351a628bffee3939e64c681afa4d", GitTreeState:"clean", BuildDate:"2022-01-19T17:34:34Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"}
//更新节点版本,指定版本号
root@master01:~# kubeadm upgrade apply v1.23.2 --etcd-upgrade=true
当我们执行更新kubeadm upgrade apply 这条命令时,upgrade会检查集群是否可升级;检查API Server是否可访问;集群下的所有节点是否正常;我们指定的更新版本是否有偏差;更新所需要拉的镜像是否可用;更新集群内的证书时间,执行续约。
3.更新控制平面节点中的kubelet与kubectl
//更新kubelet版本
root@master01:~# apt-get install kubelet=1.23.2-00 root@master01:~# kubelet --version Kubernetes v1.23.2
//更新kubectl版本
root@master01:~# apt-get install kubectl=1.23.2-00 root@master01:~# kubectl version
4.修改恢复节点状态
//退回到node操作节点
root@master01:~# exit logout student@master01:~$ exit logout Connection to master01 closed.
//将master节点状态改回
student@node01:~$ kubectl uncordon master01 node/master01 uncordoned student@node01:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready control-plane,master 127d v1.23.2
最后验证效果如图,VERSION显示v1.23.2,小版本升级完成