pkg/kubelet/kubelet_node_status.go
defaultNodeStatusFuncs 构造setNodeStatus函数,设置node状态

Ready状态

pkg/kubelet/nodestatus/setters.go

ReadyCondition函数 更新v1.NodeReady condition

  1. nowFunc
  2. runtimeErrorsFunc: 检查容器运行时 _Kubelet.runtimeState.runtimeErrors,对应_healthChecks和_CRI接口中定义的_RuntimeReady;healthChecks是PLEG模块
  3. networkErrorsFunc: _Kubelet.runtimeState.networkErrors 对应CRI接口中定义的_NetworkReady
  4. storageErrorsFunc: Kubelet.runtimeState.storageErrors
  5. appArmorValidateHostFunc: linux的AppArmor
  6. cmStatusFunc
  7. recordEventFunc


Memory状态

pkg/kubelet/nodestatus/setters.go
MemoryPressureCondition 函数 更新v1.NodeMemoryPressure

pressureFunc: kl.evictionManager.IsUnderMemoryPressure,这个实现是查询eviction_manager的内部状态。如果出现memoryPressure,eviction_manager的nodeConditions就会增加该condition

eviction_manager

pkg/kubelet/eviction/eviction_manager.go
synchronize 方法:强制执行eviction 阈值,返回被kill的Pod;同时会更新managerImpl.nodeConditions;kubelet的condition大部分是从eviction_manager同步的(condition和eviction threshold是对应的)

-》m.summaryProvider.Get(updateStats) 获取机器状态
-》makeSignalObservations 函数:根据机器状态,设置eviction signal的状态
-》thresholdsMet 函数:判断 eviction signal是否已经达到对应 threshold

eviction_manager 的synchronize两种方式驱动的

  1. 对于memory状态触发,eviction_manager内部是通过memory_threshold_notifier实现。pkg/kubelet/eviction/memory_threshold_notifier.go 内部通过cgroup.event_control 实现
  2. 周期性执行,evictionMonitoringPeriod = time.Second * 10