<div class="content" id="articleContent">
<span id="OSC_h1_1"></span>
<h1>前言</h1>
<p>Kube-controller-manager组件最终启动了很多controller,其中跟node有关的有node-ipam-controller和node-lifecycle-controller(注:Kubernetes 1.10前的版本只有node-controller,1.10版本开始将node-controller解耦为node-ipam-controller和node-lifecycle-controller),关于node-ipam-controller的源码阅读可以看我之前的博客<a href="https://my.oschina.net/u/3797264/blog/2874685">Kubernetes 1.12.0 Kube-controller-manager之node-lifecycle-controller源码阅读分析</a>,本文将对node-lifecycle-controller的源码阅读分析。</p>
<span id="OSC_h1_2"></span>
<h1>startNodeLifecycleController函数</h1>
<p>startNodeLifecycleController函数是Kube-controller-manager启动node-lifecycle-controller的入口,可以看到该函数就两个步骤。</p>
<ul><li>调用lifecyclecontroller.NewNodeLifecycleController函数生成node-lifecycle-controller的实例</li><li>调用lifecycleController.Run方法,执行node-lifecycle-controller</li></ul>
<pre class="blockcode">k8s.io/kubernetes/cmd/kube-controller-manager/app/core.go<span style="color:#1abc9c;">:122</span>
func startNodeLifecycleController(ctx ControllerContext) (http.Handler, bool, error) {
lifecycleController, err := lifecyclecontroller.NewNodeLifecycleController(
ctx.InformerFactory.Core().V1().Pods(),
ctx.InformerFactory.Core().V1().Nodes(),
ctx.InformerFactory.Extensions().V1beta1().DaemonSets(),
ctx.Cloud,
ctx.ClientBuilder.ClientOrDie("node-controller"),
ctx.ComponentConfig.KubeCloudShared.NodeMonitorPeriod.Duration,
ctx.ComponentConfig.NodeLifecycleController.NodeStartupGracePeriod.Duration,
ctx.ComponentConfig.NodeLifecycleController.NodeMonitorGracePeriod.Duration,
ctx.ComponentConfig.NodeLifecycleController.PodEvictionTimeout.Duration,
ctx.ComponentConfig.NodeLifecycleController.NodeEvictionRate,
ctx.ComponentConfig.NodeLifecycleController.SecondaryNodeEvictionRate,
ctx.ComponentConfig.NodeLifecycleController.LargeClusterSizeThreshold,
ctx.ComponentConfig.NodeLifecycleController.UnhealthyZoneThreshold,
ctx.ComponentConfig.NodeLifecycleController.EnableTaintManager,
utilfeature.DefaultFeatureGate.Enabled(features.TaintBasedEvictions),
utilfeature.DefaultFeatureGate.Enabled(features.TaintNodesByCondition),
)
if err != nil {
return nil, true, err
}
go lifecycleController.Run(ctx.Stop)
return nil, true, nil
}</pre>
<span id="OSC_h1_3"></span>
<h1>Node-Lifecycle-Controller的定义</h1>
<p>先来看看node-lifecycle-controller结构体的定义,先重点关注与Kube-controller-manager配置有关的变量。</p>
<ul><li>nodeMonitorPeriod:通过--node-monitor-period设置,默认值5s,是Controller同步NodeStatus的周期</li><li>nodeStartupGracePeriod:通过--node-startup-grace-period设置,默认值60s,是Controller允许新启动的节点不响应的时间,如果超过这个时间Node仍然未响应,则标记Node为unhealthy</li><li>nodeMonitorGracePeriod:通过--node-monitor-grace-period设置,默认值40s,是Controller标识Node为unhealthy之前,允许Node不响应的时间,该值必须是kubelet nodeStatusUpdateFrequency参数的N倍,其中N表示允许kubelet传递节点状态的重试次数。</li><li>podEvictionTimeout:通过--pod-eviction-timeout设置,默认值5m0s,是Controller在失败节点删除pod的宽限期</li><li>evictionLimiterQPS:通过--node-eviction-rate设置,默认值0.1,是Controller在健康的zone中node失败时,每秒删除节点上POD的百分比,即默认10s删除完一个失败node上所有的pod。</li><li>secondaryEvictionLimiterQPS:通过--secondary-node-eviction-rate设置,默认值0.01,zone不健康时,当节点失败,Controller每秒删除节点上pod的百分比,即默认100s删除完一个node上的所有pod。如果zone规模小于--large-cluster-size-threshold,则该值将隐式重写为0。</li><li>largeClusterThreshold:通过--large-cluster-size-threshold设置,默认值50,NodeLifecycleController将集群当做大集群的nodes数量,主要目的驱逐的逻辑。对于该size或者更小size的集群,隐式的将--secondary-node-eviction-rate重写为0.</li><li>unhealthyZoneThreshold:通过--unhealthy-zone-threshold设置,默认值0.55,zone被视为不健康时,Not Ready 节点的比例。</li><li>runTaintManager:通过--enable-taint-manager设置,默认值为true,Beta功能,如果set true,则启用Noexecute Taints,并且驱逐Node上所有没有toleration Noexecute Taint的pod。</li><li>useTaintBasedEvictions:通过feature gate的TaintBasedEvictions设置,默认值为false,Alpha功能。如果为true,则表示将通过Taint Nodes的方式来Evict Pods。</li><li>taintNodeByCondition:通过feature gate的TaintNodesByCondition设置,默认值为true,Beta功能。如果为true,则表示NodeLifecycleController将会根据Node的condition(i.e 'Net |
|