Author: [email protected]
摘要:我认为,Node Controller是Kubernetes几十个Controller中最为重要的Controller之一,其重要程度在Top3,然而这可能也是最为复杂的一个Controller,因此对其的源码分析,我将做一个系列文章,希望能帮助自己有一个深入的理解。本博文主要对Node Controller的创建流程进行源码分析。
NewNodeController入口
Controller Manager在启动时,会启动一系列的Controller,Node Controller也是在Controller Manager启动时StartControllers方法中启动的Controller之一,其对应的创建代码如下。
cmd/kube-controller-manager/app/controllermanager.go:455
nodeController, err := nodecontroller.NewNodeController(
sharedInformers.Core().V1().Pods(),
sharedInformers.Core().V1().Nodes(),
sharedInformers.Extensions().V1beta1().DaemonSets(),
cloud,
clientBuilder.ClientOrDie("node-controller"),
s.PodEvictionTimeout.Duration,
s.NodeEvictionRate,
s.SecondaryNodeEvictionRate,
s.LargeClusterSizeThreshold,
s.UnhealthyZoneThreshold,
s.NodeMonitorGracePeriod.Duration,
s.NodeStartupGracePeriod.Duration,
s.NodeMonitorPeriod.Duration,
clusterCIDR,
serviceCIDR,
int(s.NodeCIDRMaskSize),
s.AllocateNodeCIDRs,
s.EnableTaintManager,
utilfeature.DefaultFeatureGate.Enabled(features.TaintBasedEvictions),
)
可见,Node Controller主要是ListWatch sharedInformers中的如下对象:
- Pods
- Nodes
- DaemonSets
另外,需要注意:
- s.EnableTaintManager的默认值为true,即表示默认开启Taint Manager,可通过
--enable-taint-manager
进行设置。 - DefaultFeatureGate.Enabled(features.TaintBasedEvictions)的默认值为false,可通过
--feature-gates
中添加TaintBasedEvictions=true
修改为true,true即表示Node上的Pods Eviction Operation通过TaintManager来进行。
补充:关于Kubernetes的Default FeaturesGate的设置见如下代码:
pkg/features/kube_features.go:100
var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureSpec{
ExternalTrafficLocalOnly: {
Default: true, PreRelease: utilfeature.Beta},
AppArmor: {
Default: true, PreRelease: utilfeature.Beta},
DynamicKubeletConfig: {
Default: false, PreRelease: utilfeature.Alpha},
DynamicVolumeProvisioning: {
Default: true, PreRelease: utilfeature.Alpha},
ExperimentalHostUserNamespaceDefaultingGate: {
Default: false, PreRelease: utilfeature.Beta},
ExperimentalCriticalPodAnnotation: {
Default: false, PreRelease: utilfeature.Alpha},
AffinityInAnnotations: {
Default: false, PreRelease: utilfeature.Alpha},
Accelerators: