k8为实现容器探活工人的管理构建了一个经理组件,该组件负责底层探活工人的管理,并且缓存当前的容器的状态,并对外同步容器的当前状态,今天我们就来分析下其部分核心组件
1。核心原理实现
//管理器实现。 类型管理器结构{//保护缓存 sync.RWMutex//容器ID→探测结果 缓存地图[kubecontainer.ContainerID]的结果//更新管道 陈更新更新 } 代码> >之前
2.2更新缓存通知事件
更新缓存的时候回通过对比前后状态来进行是否发布变更事件,从而通知到外部订阅容器变更的kubelet核心流程
<代码类=" language-go "> func (m *经理)(id kubecontainer设置。ContainerID,结果的结果,pod * v1.Pod) {//修改内部状态 如果m。setInternal (id、结果){//同步更新事件 m。更新& lt; -更新{id,因此,pod.UID} } }代码>
内部状态修改与判断是否进行同步实现
<代码类=" language-go ">//如果之前的缓存不存在,或者前后状态不一致则会返回真正触发更新 func (m *经理)setInternal kubecontainer (id。ContainerID,结果结果)bool { m.Lock () 推迟m.Unlock () 上一页,存在:=m.cache (id) 如果存在! | |上一页!={结果 m。缓存(id)=结果 还真 } 返回假 }代码>
2.3对外更新管道
<代码类=" language-go "> func (m *经理)更新()& lt;脚板更新{ 返回m.updates }代码>
3。探测管理器
探测管理器是指的探测器/探测器)经理的经理组件,其负责当前kubelet上面探活组件的管理,并且进行探测状态结果的缓存与同步,并且内部还通过statusManager来进行apiserver状态的同步
3.1容器探测关键/h3>
每个探测关键包含要探测的目标信息:豆荚的ID,容器名,探测类型
<代码类=" language-go "> probeKey struct类型{ podUID types.UID containerName字符串 probeType probeType } 代码> >之前3.2核心数据结构
statusManager组件在后续章节里面会进行详细分析,说下livenessManager该组件即探活的结果,所以当一个容器探测失败,则会由kubelet本地先进行处理,而readlinessManager和startupManager则需要通过statusManager同步给apiserver进行同步
<代码类=" language-go ">类型管理器结构{//探测关键与工人映射 工人地图[probeKey] *工人//读写锁 workerLock sync.RWMutex//statusManager缓存为探测提供pod IP和容器id。 statusManager status.Manager//存储准备探测结果 readinessManager results.Manager//存储活性探测结果 livenessManager results.Manager//存储启动探测结果 startupManager results.Manager//执行探测操作 探测器*探测器 }代码>3.3同步启动探测结果
<代码类=" language-go "> func (m *经理)updateStartup () {//从管道获取数据进行同步 更新:=& lt; -m.startupManager.Updates () 开始:=更新。结果==results.Success m.statusManager.SetContainerStartup(更新。PodUID、更新。ContainerID开始) }代码>3.4同步准备探测结果
<代码类=" language-go "> func (m *经理)updateReadiness () { 更新:=& lt; -m.readinessManager.Updates () 准备:=更新。结果==results.Success m.statusManager.SetContainerReadiness(更新。PodUID、更新。ContainerID,准备) }代码>3.5启动同步探测结果后台任务
<代码类=" language-go "> func (m *经理)开始(){//同步准备开始。 wait.Forever (m。updateReadiness, 0)//开始同步启动。 wait.Forever (m。updateStartup, 0) }#这明星不是梦#图解kubernetes容器探活机制核