以下代码分析基于
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相关的更新逻辑进行处理。
参考文章:
赞赏一下
支付宝打赏
微信打赏