点击上方“K8S中文社区”,选择“置顶公众号”
关键时刻,第一时间送达!
图片纯属娱乐,本文主要内容,kubelet版本升级引起的容器重启机制与参考解决方案;
背景
k8s能够帮助我们的服务实现服务高可用,其提供的副本机制能够有效的保证运行实例的副本数,从而当某个实例异常后服务可以重新被自动唤起,但在我们的生产环境中,某些特殊的服务(如广告资金服务或计费服务)因服务重启期间而导致的业务中断,对业务请求的延时响应也是不可忽略的问题;而在kubelet的部分版本升级中,也可能会因版本的升级进而导致已经运行的容器服务发生重启;而在特殊的生产环境中类似的操作直接引起的服务重启是需要我们尽可能去规避的;
此篇内容即是对kubelet版本升级与container自动重启这一关联过程原因分析以及供参考方案的简单介绍。
环境基本信息:
操作系统: CentOS 7
kubelet当前版本:1.7.4
目标kubelet版本:1.9.1
现象
当前kubelet版本1.7.4中已持续运行一些容器服务,在对kubelet版本升级1.9.1后,所升级机器上已持续运行多天的container服务出现自动重启,重启之后继续提供服务
原因
因为container的自动重启发生在kubelet版本升级后,所以需要沿kubelet启动后的接口函数调用链进行定位,以确认container重启的根本原因.
总体调用链关系图:(右下角computePodActions() 函数中containerChanged()函数即为决定container服务是否重启的判断逻辑)
清无码图下载(https://pan.baidu.com/s/1dtMmbO)
链路跟踪过程:(整体kubelet调用关系比较复杂,后面仅针对问题的场景关键链路进行分析)
@kubernetes-1.9.1/cmd/kubelet/kubelet.go (@表示所处的源码文件,后面意义相同)