#这明星不是梦#图解kubernetes容器探活机制核

  

k8为实现容器探活工人的管理构建了一个经理组件,该组件负责底层探活工人的管理,并且缓存当前的容器的状态,并对外同步容器的当前状态,今天我们就来分析下其部分核心组件

  

1。核心原理实现

  

 #明星不是梦#图解kubernetes容器探活机制核”> <br/>经理缓存的状态主要是会被kubelet,状态组件消费,并且在Pod同步状态的时候,会通过当前经理里面的探测状态来更新Pod的容器的就绪与启动状态的更新,让我们一起看看经理自身的一些关键实现吧</p>
  <h2> 2。探活结果管理</h2>
  <p>即探测器/结果/results_manager组件,其主要作用是:存储探测结果和通知探测结果</p>
  <h3> 2.1核心数据结构</h3>
  <p>缓存负责容器的探测结果的保存,更新则负责对外更新状态的订阅,其通过新的结果和缓存中的状态进行对比,从而决定是否对外通知</p>
  <pre> <代码类=//管理器实现。   类型管理器结构{//保护缓存   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容器探活机制核