容器化技术兴起后,k8s无疑成为了容器编排技术的事实标准。各行各业软件领域的广泛应用,进一步促进了k8s的快速发展,对应版本的更新也层出不穷。实际项目使用过程中,可能会遇到框架层面的bug在新版本中得到修复,高版本的一些特性刚好满足新的业务需求,这时候就需要在原有k8s集群上进行升级。如何快速、平滑的实现k8s的版本更新?本文将向大家分享k8s常规在线升级过程,希望对大家有所帮助和参考。

升级缘由

本人测试环境centos 7 ,k8s 版本1.18.2,k8s集群基于官方推荐KubeAdm安装。

升级原因:

centos 7 系统下实现k8s service kube-proxy ipvs模式,配置负载均衡时报如下错误。

E0326 15:20:23.159364  1 proxier.go:1950] Failed to list IPVS destinations, error: parseIP Error ip=[10 96 0 10 0 0 0 0 0 0 0 0 0 0 0 0]E0326 15:20:23.159388  1 proxier.go:1192] Failed to sync endpoint for service: 10.8.0.10:53/UPD, err: parseIP Error ip=[10 96 0 16 0 0 0 0 0 0 0 0 0 0 0 0]

网上分析这个错误是k8s ipvs 依赖的模块在centos 7 系统内核的ipvs中找不到,换句话说:k8s当前ipvs依赖版本高于centos 7 中的ipvs版本,两个版本存在兼容问题。

解决方式:

  1. 升级centos 7 lvs内核版本。
  2. 升级k8s版本1.18.3+。

这里选择升级k8s版本来解决问题。

在通过kubeadm安装k8s集群时,kubeadm已自带在线升级功能。所以本文介绍的升级功能仅限于kubeadm的集群安装方式。rancher之类的k8s集群安装不包含本文讨论范围内。

k8s内部包含很多组件,如api server、controller manager、Scheduler、kube proxy等。升级也包含了对应组件的版本升级。k8s升级有一个原则:各组件版本要么等于api server版本,要么小于api server一个小版本。版本号规则x.y.z,其中x为大版本,y小版本,z缺陷修复版本。比如:api server当前版本为1.18.2,kube proxy版本可以为1.18.*或者1.17.*。为便于维护,最好统一为同一版本。

本文示例版本号从1.18.3升级到1.18.6

升级环境

  • centos 7
  • k8s kubeadm安装集群
  • 1个master节点,2个worker节点

版本升级

kubernetes 状态检查

master节点执行,查看当前状态:

kubectl get node




k8s中镜像没有更新 k8s 镜像版本升级_centos


检查当前版本和升级方案

kubeadm upgrade plan


k8s中镜像没有更新 k8s 镜像版本升级_k8s中镜像没有更新_02


上图可知:当前的集群cluster版本、kubeadm版本,可升级最近可用稳定版本。

升级前保证kubeadm等工具先升级到目标版本,这里是1.18.6。未选择最新版本1.18.8,考虑版本太新国内镜像未及时更新对应版本,升级时很容易timeout镜像下载失败。

yum -y install kubeadm-1.18.6 kubelet-1.18.6 kubectl-1.18.6


k8s中镜像没有更新 k8s 镜像版本升级_对应版本_03


执行组件版本更新

kubeadm upgrade apply v1.18.6systemctl daemon-reloadsystemctl restart kubelet


k8s中镜像没有更新 k8s 镜像版本升级_centos_04


保证网络畅通,耐心等待一段时间。出现以上提示信息,master节点升级成功。

其他master和worker节点执行以下操作

yum -y install kubeadm-1.18.6 kubelet-1.18.6 kubectl-1.18.6systemctl daemon-reloadsystemctl restart kubelet

master节点查看当前版本

kubectl version


k8s中镜像没有更新 k8s 镜像版本升级_k8s中镜像没有更新_05


上图显示server端对应版本1.18.6,升级成功。

总结

本文介绍了k8s集群的版本升级。了解到kubeadm的升级方案查看,版本选择,升级执行命令使用。整个过程,不停机,应用无感知,保证集群的平滑更新。

由于环境所限,未有全面测试。若有所疏漏请多多指正。