容器化技术兴起后,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版本,两个版本存在兼容问题。
解决方式:
这里选择升级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。
kubernetes 状态检查
master节点执行,查看当前状态:
kubectl get node
检查当前版本和升级方案
kubeadm upgrade plan
上图可知:当前的集群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
执行组件版本更新
kubeadm upgrade Apply v1.18.6
systemctl daemon-reload
systemctl restart kubelet
保证网络畅通,耐心等待一段时间。出现以上提示信息,master节点升级成功。
其他master和worker节点执行以下操作
yum -y install kubeadm-1.18.6 kubelet-1.18.6 kubectl-1.18.6
systemctl daemon-reload
systemctl restart kubelet
master节点查看当前版本
kubectl version
上图显示server端对应版本1.18.6,升级成功。
本文介绍了k8s集群的版本升级。了解到kubeadm的升级方案查看,版本选择,升级执行命令使用。整个过程,不停机,应用无感知,保证集群的平滑更新。
由于环境所限,未有全面测试。若有所疏漏请多多指正。
对技术有热情,请关注我!坚持原创,共同进步!谢谢。