kubelet源码分析(二)之 NewMainKubelet
以下代码分析基于
kubernetes v1.12.0
版本。本文主要分析 https://github.com/kubernetes/kubernetes/tree/v1.12.0/pkg/kubelet 部分的代码。
本文主要分析kubelet中的NewMainKubelet
部分。
1. NewMainKubelet
NewMainKubelet
主要用来初始化和构造一个kubelet
结构体,kubelet结构体定义参考:https://github.com/kubernetes/kubernetes/blob/v1.12.0/pkg/kubelet/kubelet.go#L888
1 | // NewMainKubelet instantiates a new Kubelet object along with all the required internal modules. |
1.1. PodConfig
通过makePodSourceConfig
生成Pod config。
1 | if kubeDeps.PodConfig == nil { |
1.1.1. makePodSourceConfig
1 | // makePodSourceConfig creates a config.PodConfig from the given |
1.1.2. NewPodConfig
1 | // NewPodConfig creates an object that can merge many configuration sources into a stream |
1.1.3. NewSourceApiserver
1 | // NewSourceApiserver creates a config source that watches and pulls from the apiserver. |
1.2. Lister
serviceLister
和nodeLister
分别通过List-Watch
机制监听service
和node
的列表变化。
1.2.1. serviceLister
1 | serviceIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) |
1.2.2. nodeLister
1 | nodeIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{}) |
1.3. 各种Manager
1.3.1. containerRefManager
1 | containerRefManager := kubecontainer.NewRefManager() |
1.3.2. oomWatcher
1 | oomWatcher := NewOOMWatcher(kubeDeps.CAdvisorInterface, kubeDeps.Recorder) |
1.3.3. dnsConfigurer
1 | clusterDNS := make([]net.IP, 0, len(kubeCfg.ClusterDNS)) |
1.3.4. secretManager & configMapManager
1 | var secretManager secret.Manager |
1.3.5. livenessManager
1 | klet.livenessManager = proberesults.NewManager() |
1.3.6. podManager
1 | // podManager is also responsible for keeping secretManager and configMapManager contents up-to-date. |
1.3.7. resourceAnalyzer
1 | klet.resourceAnalyzer = serverstats.NewResourceAnalyzer(klet, kubeCfg.VolumeStatsAggPeriod.Duration) |
1.3.8. containerGC
1 | // setup containerGC |
1.3.9. imageManager
1 | // setup imageManager |
1.3.10. statusManager
1 | klet.statusManager = status.NewManager(klet.kubeClient, klet.podManager, klet) |
1.3.11. probeManager
1 | klet.probeManager = prober.NewManager( |
1.3.12. tokenManager
1 | tokenManager := token.NewManager(kubeDeps.KubeClient) |
1.3.13. volumePluginMgr
1 | klet.volumePluginMgr, err = |
1.3.14. volumeManager
1 | // setup volumeManager |
1.3.15. evictionManager
1 | // setup eviction manager |
1.4. containerRuntime
目前pod所使用的runtime
只有docker
和remote
两种,rkt
已经废弃。
1 | if containerRuntime == "rkt" { |
当runtime
是docker
的时候,会执行docker
相关操作。
1 | switch containerRuntime { |
1.4.1. NewDockerService
1 | // Create and start the CRI shim running as a grpc server. |
1.4.2. NewDockerServer
1 | // The unix socket for kubelet <-> dockershim communication. |
1.4.3. DockerServer.Start
1 | // Start starts the dockershim grpc server. |
1.5. podWorker
构造podWorkers
和workQueue
。
1 | klet.workQueue = queue.NewBasicWorkQueue(klet.clock) |
1.5.1. PodWorkers接口
1 | // PodWorkers is an abstract interface for testability. |
podWorker
主要用来对pod相应事件进行处理和同步,包含以下三个方法:UpdatePod
、ForgetNonExistingPodWorkers
、ForgetWorker
。
2. 总结
NewMainKubelet
主要用来构造kubelet
结构体,其中kubelet除了包含必要的配置和client(例如:kubeClient、csiClient等)外,最主要的包含各种manager来管理不同的任务。核心的manager有以下几种:
oomWatcher
:监控pod内存是否发生OOM。podManager
:管理pod的生命周期,包括对pod的增删改查操作等。containerGC
:对死亡容器进行垃圾回收。imageManager
:对容器镜像进行垃圾回收。statusManager
:与apiserver同步pod状态,同时也作状态缓存。volumeManager
:对pod的volume进行attached/detached/mounted/unmounted
操作。evictionManager
:保证节点稳定,必要时对pod进行驱逐(例如资源不足的情况下)。
NewMainKubelet
还包含了serviceLister
和nodeLister
来监听service
和node
的列表变化。- kubelet使用到的
containerRuntime
目前主要是docker
,其中rkt
已废弃。NewMainKubelet
启动了dockershim grpc server
来执行docker相关操作。 - 构建了
podWorker
来对pod相关的更新逻辑进行处理。
参考文章:
赞赏一下