Kubernetes 的版本更新迭代算是频繁的了,每个三个月发布一个小版本。为了使集群中一直跟随着版本前进,如果一直不更新,会导致新功能无法使用,落后新版本太多版本,不方便升级。
升级策略
需要考虑的问题
落后2个大版本以上的,需要考虑支持的功能以及参数,Kubernetes 会将一些功能删除,或者更改资源名称。类似这样的情况,Kubernetes 其实也是给了使用者很好的兼容方式的,每个大版本会兼容前两个大版本中的功能,如 1.19 可以兼容 1.17 和 1.18 ,并不兼容 1.16,如果从 1.16 直接升级到 1.19,很有可能有些功能或者参数在 1.19 已经不支持了。
如果已经落后版本太多,还想要升级也是有办法的,需要递归升级,如 1.12 先升级到 1.14 ,1.14 再升级到 1.16,以此类推。
升级流程
升级管理节点 —> 升级其余管理节点 —> 升级worker节点
注意事项:升级前必须备份所有组件及数据,例如 etcd
升级操作
升级管理节点
查看所有已有版本
升级之前要清楚版本有哪些
$ yum list --showduplicates kubeadm --disableexcludes=kubernetes
Installed Packages
kubeadm.x86_64 1.21.1-0 @kubernetes
Available Packages
kubeadm.x86_64 1.6.0-0 kubernetes
kubeadm.x86_64 1.6.1-0 kubernetes
...
kubeadm.x86_64 1.20.8-0 kubernetes
kubeadm.x86_64 1.21.0-0 kubernetes
kubeadm.x86_64 1.21.1-0 kubernetes
kubeadm.x86_64 1.21.2-0 kubernetes
可以看到已安装的是 1.21.1-0,最新版是 1.21.2-0,这里跨的版本是相当小了。
升级 kubeadm
yum -y install kubeadm-1.21.2-0 --disableexcludes=kubernetes
驱逐 node 上的 pod
因为在升级过程中可能会重启 kubelet 服务,导致 pod 的故障
kubectl drain <节点名称> --ignore-daemonsets
检查集群是否可以升级
$ kubeadm upgrade plan
...
You can now apply the upgrade by executing the following command:
kubeadm upgrade apply v1.21.2
_____________________________________________________________________
The table below shows the current state of component configs as understood by this version of kubeadm.
Configs that have a "yes" mark in the "MANUAL UPGRADE REQUIRED" column require manual config upgrade or
resetting to kubeadm defaults before a successful upgrade can be performed. The version to manually
upgrade to is denoted in the "PREFERRED VERSION" column.
API GROUP CURRENT VERSION PREFERRED VERSION MANUAL UPGRADE REQUIRED
kubeproxy.config.k8s.io v1alpha1 v1alpha1 no
kubelet.config.k8s.io v1beta1 v1beta1 no
_____________________________________________________________________
如上 kubeadm upgrade apply v1.21.2
即可升级
执行升级
如果是要升级最新版本,复制命令执行即可,如果非最新版本,切记看好版本再升级,要和 kubeadm 的版本绝对对应的。
$ kubeadm upgrade apply v1.21.2
...
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.21.2". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
# 这一步操作升级好的组件有:
# apiserver,controller-manager,coredns,scheduler
取消不可调度
kubectl uncordon <节点名称>
升级 kubelet 和 kubectl
yum -y install kubelet-1.21.2-0 kubectl-1.21.2-0 --disableexcludes=kubernetes
重启 kubelet
systemctl daemon-reload && systemctl restart kubelet
验证版本
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
feiyi Ready control-plane,master 37d v1.21.2
升级 worker 节点
升级 kubeadm
yum -y install kubeadm-1.21.2-0 --disableexcludes=kubernetes
驱逐 node 上的 pod
在 master 节点操作
kubectl drain <节点名称> --ignore-daemonsets
升级 kubelet 配置
kubectl upgrade node
升级 kubelet 和 kubectl
yum -y install kubelet-1.21.2-0 kubectl-1.21.2-0 --disableexcludes=kubernetes
重启 kubelet
systemctl daemon-reload && systemctl restart kubelet
取消不可调度
在 master 操作
kubectl uncordon <节点名称>