Kubernetes 的版本更新迭代算是频繁的了,每个三个月发布一个小版本。为了使集群中一直跟随着版本前进,如果一直不更新,会导致新功能无法使用,落后新版本太多版本,不方便升级。
升级策略
- 始终保持最新
- 每半年升级一次,资源会落后社区1~2个小版本(推荐)
- 一年升级一次,或者更长,落后版本太多
需要考虑的问题
落后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
升级操作
升级管理节点 查看所有已有版本 升级之前要清楚版本有哪些
代码语言:javascript复制$ 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
代码语言:javascript复制yum -y install kubeadm-1.21.2-0 --disableexcludes=kubernetes
驱逐 node 上的 pod 因为在升级过程中可能会重启 kubelet 服务,导致 pod 的故障
代码语言:javascript复制kubectl drain <节点名称> --ignore-daemonsets
检查集群是否可以升级
代码语言:javascript复制$ 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 的版本绝对对应的。
代码语言:javascript复制$ 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
取消不可调度
代码语言:javascript复制 kubectl uncordon <节点名称>
升级 kubelet 和 kubectl
代码语言:javascript复制yum -y install kubelet-1.21.2-0 kubectl-1.21.2-0 --disableexcludes=kubernetes
重启 kubelet
代码语言:javascript复制systemctl daemon-reload && systemctl restart kubelet
验证版本
代码语言:javascript复制$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
feiyi Ready control-plane,master 37d v1.21.2
升级 worker 节点 升级 kubeadm
代码语言:javascript复制yum -y install kubeadm-1.21.2-0 --disableexcludes=kubernetes
驱逐 node 上的 pod 在 master 节点操作
代码语言:javascript复制kubectl drain <节点名称> --ignore-daemonsets
升级 kubelet 配置
代码语言:javascript复制kubectl upgrade node
升级 kubelet 和 kubectl
代码语言:javascript复制yum -y install kubelet-1.21.2-0 kubectl-1.21.2-0 --disableexcludes=kubernetes
重启 kubelet
代码语言:javascript复制systemctl daemon-reload && systemctl restart kubelet
取消不可调度 在 master 操作
代码语言:javascript复制 kubectl uncordon <节点名称>