NewMainKubelet

kubelet源码分析(二)之 NewMainKubelet

以下代码分析基于 kubernetes v1.12.0 版本。

本文主要分析 https://github.com/kubernetes/kubernetes/tree/v1.12.0/pkg/kubelet 部分的代码。

本文主要分析kubelet中的NewMainKubelet部分。

NewMainKubelet主要用来初始化和构造一个kubelet结构体,kubelet结构体定义参考:https://github.com/kubernetes/kubernetes/blob/v1.12.0/pkg/kubelet/kubelet.go#L888

// NewMainKubelet instantiates a new Kubelet object along with all the required internal modules.
// No initialization of Kubelet and its modules should happen here.
func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
	kubeDeps *Dependencies,
	crOptions *config.ContainerRuntimeOptions,
	containerRuntime string,
	runtimeCgroups string,
	hostnameOverride string,
	nodeIP string,
	providerID string,
	cloudProvider string,
	certDirectory string,
	rootDirectory string,
	registerNode bool,
	registerWithTaints []api.Taint,
	allowedUnsafeSysctls []string,
	remoteRuntimeEndpoint string,
	remoteImageEndpoint string,
	experimentalMounterPath string,
	experimentalKernelMemcgNotification bool,
	experimentalCheckNodeCapabilitiesBeforeMount bool,
	experimentalNodeAllocatableIgnoreEvictionThreshold bool,
	minimumGCAge metav1.Duration,
	maxPerPodContainerCount int32,
	maxContainerCount int32,
	masterServiceNamespace string,
	registerSchedulable bool,
	nonMasqueradeCIDR string,
	keepTerminatedPodVolumes bool,
	nodeLabels map[string]string,
	seccompProfileRoot string,
	bootstrapCheckpointPath string,
	nodeStatusMaxImages int32) (*Kubelet, error) {
    ...
}    

1.1. PodConfig

通过makePodSourceConfig生成Pod config。

1.1.1. makePodSourceConfig

1.1.2. NewPodConfig

1.1.3. NewSourceApiserver

1.2. Lister

serviceListernodeLister分别通过List-Watch机制监听servicenode的列表变化。

1.2.1. serviceLister

1.2.2. nodeLister

1.3. 各种Manager

1.3.1. containerRefManager

1.3.2. oomWatcher

1.3.3. dnsConfigurer

1.3.4. secretManager & configMapManager

1.3.5. livenessManager

1.3.6. podManager

1.3.7. resourceAnalyzer

1.3.8. containerGC

1.3.9. imageManager

1.3.10. statusManager

1.3.11. probeManager

1.3.12. tokenManager

1.3.13. volumePluginMgr

1.3.14. volumeManager

1.3.15. evictionManager

1.4. containerRuntime

目前pod所使用的runtime只有dockerremote两种,rkt已经废弃。

runtimedocker的时候,会执行docker相关操作。

1.4.1. NewDockerService

1.4.2. NewDockerServer

1.4.3. DockerServer.Start

1.5. podWorker

构造podWorkersworkQueue

1.5.1. PodWorkers接口

podWorker主要用来对pod相应事件进行处理和同步,包含以下三个方法:UpdatePodForgetNonExistingPodWorkersForgetWorker

2. 总结

  1. NewMainKubelet主要用来构造kubelet结构体,其中kubelet除了包含必要的配置和client(例如:kubeClient、csiClient等)外,最主要的包含各种manager来管理不同的任务。

  2. 核心的manager有以下几种:

    • oomWatcher:监控pod内存是否发生OOM。

    • podManager:管理pod的生命周期,包括对pod的增删改查操作等。

    • containerGC:对死亡容器进行垃圾回收。

    • imageManager:对容器镜像进行垃圾回收。

    • statusManager:与apiserver同步pod状态,同时也作状态缓存。

    • volumeManager:对pod的volume进行attached/detached/mounted/unmounted操作。

    • evictionManager:保证节点稳定,必要时对pod进行驱逐(例如资源不足的情况下)。

  3. NewMainKubelet还包含了serviceListernodeLister来监听servicenode的列表变化。

  4. kubelet使用到的containerRuntime目前主要是docker,其中rkt已废弃。NewMainKubelet启动了dockershim grpc server来执行docker相关操作。

  5. 构建了podWorker来对pod相关的更新逻辑进行处理。

参考文章:

  • https://github.com/kubernetes/kubernetes/tree/v1.12.0

  • https://github.com/kubernetes/kubernetes/tree/v1.12.0/pkg/kubelet

最后更新于

这有帮助吗?