startKubelet
kubelet源码分析(三)之 startKubelet
以下代码分析基于
kubernetes v1.12.0版本。
本文主要分析startKubelet,其中主要是kubelet.Run部分,该部分的内容主要是初始化并运行一些manager。对于kubelet所包含的各种manager的执行逻辑和pod的生命周期管理逻辑待后续文章分析。
后续的文章主要会分类分析pkg/kubelet部分的代码实现。
kubelet的pkg代码目录结构:
kubelet
├── apis # 定义一些相关接口
├── cadvisor # cadvisor
├── cm # ContainerManager、cpu manger、cgroup manager
├── config
├── configmap # configmap manager
├── container # Runtime、ImageService
├── dockershim # docker的相关调用
├── eviction # eviction manager
├── images # image manager
├── kubeletconfig
├── kuberuntime # 核心:kubeGenericRuntimeManager、runtime容器的相关操作
├── lifecycle
├── mountpod
├── network # pod dns
├── nodelease
├── nodestatus # MachineInfo、节点相关信息
├── pleg # PodLifecycleEventGenerator
├── pod # 核心:pod manager、mirror pod
├── preemption
├── qos # 资源服务质量,不过暂时内容很少
├── remote # RemoteRuntimeService
├── server
├── stats # StatsProvider
├── status # status manager
├── types # PodUpdate、PodOperation
├── volumemanager # VolumeManager
├── kubelet.go # 核心: SyncHandler、kubelet的大部分操作
├── kubelet_getters.go # 各种get操作,例如获取相关目录:getRootDir、getPodsDir、getPluginsDir
├── kubelet_network.go #
├── kubelet_network_linux.go
├── kubelet_node_status.go # registerWithAPIServer、initialNode、syncNodeStatus
├── kubelet_pods.go # 核心:pod的增删改查等相关操作、podKiller、
├── kubelet_resources.go
├── kubelet_volumes.go # ListVolumesForPod、cleanupOrphanedPodDirs
├── oom_watcher.go # OOMWatcher
├── pod_container_deletor.go
├── pod_workers.go # 核心:PodWorkers、UpdatePodOptions、syncPodOptions、managePodLoop
├── runonce.go # RunOnce
├── runtime.go
...1. startKubelet
startKubelet的函数位于cmd/kubelet/app/server.go,启动并运行一个kubelet,运行kubelet的逻辑代码位于pkg/kubelet/kubelet.go。
主要内容如下:
运行一个kubelet,执行kubelet中各种manager的相关逻辑。
运行kubelet server启动监听服务。
此部分代码位于cmd/kubelet/app/server.go
2. Kubelet.Run
Kubelet.Run方法主要将NewMainKubelet构造的各种manager运行起来,让各种manager执行相应的功能,大部分manager为常驻进程的方式运行。
Kubelet.Run完整代码如下:
此部分代码位于pkg/kubelet/kubelet.go
以下对Kubelet.Run分段进行分析。
3. initializeModules
initializeModules包含了imageManager、serverCertificateManager、oomWatcher和resourceAnalyzer。
主要流程如下:
创建文件系统目录,包括kubelet的root目录、pods的目录、plugins的目录和容器日志目录。
启动imageManager、serverCertificateManager、oomWatcher、resourceAnalyzer。
各种manager的说明如下:
imageManager:负责镜像垃圾回收。serverCertificateManager:负责处理证书。oomWatcher:监控内存使用,是否发生内存耗尽。resourceAnalyzer:监控资源使用情况。
完整代码如下:
此部分代码位于pkg/kubelet/kubelet.go
3.1. setupDataDirs
initializeModules先创建相关目录。
具体目录如下:
ContainerLogsDir:目录为/var/log/containers。rootDirectory:由参数传入,一般为/var/lib/kubelet。PodsDir:目录为{rootDirectory}/pods。PluginsDir:目录为{rootDirectory}/plugins。
initializeModules中setupDataDirs的相关代码如下:
setupDataDirs代码如下
3.2. manager
initializeModules中的manager如下:
4. 运行各种manager
4.1. volumeManager
volumeManager主要运行一组异步循环,根据在此节点上安排的pod调整哪些volume需要attached/detached/mounted/unmounted。
volumeManager.Run实现代码如下:
4.2. syncNodeStatus
syncNodeStatus通过goroutine的方式定期执行,它将节点的状态同步给master,必要的时候注册kubelet。
4.3. updateRuntimeUp
updateRuntimeUp调用容器运行时状态回调,在容器运行时首次启动时初始化运行时相关模块,如果状态检查失败则返回错误。 如果状态检查正常,在kubelet runtimeState中更新容器运行时的正常运行时间。
4.4. syncNetworkUtil
通过循环的方式同步iptables的规则,不过当前代码并没有执行任何操作。
4.5. podKiller
但pod没有被podworker正确处理的时候,启动一个goroutine负责杀死pod。
podKiller代码如下:
此部分代码位于pkg/kubelet/kubelet_pods.go
4.6. statusManager
使用apiserver同步pods状态; 也用作状态缓存。
statusManager.Start的实现代码如下:
4.7. probeManager
处理容器探针
4.8. runtimeClassManager
4.9. PodLifecycleEventGenerator
PodLifecycleEventGenerator是一个pod生命周期时间生成器接口,具体如下:
start方法具体实现如下:
4.10. syncLoop
最后调用syncLoop来执行同步变化变更的循环。
5. syncLoop
syncLoop是处理变化的循环。 它监听来自三种channel(file,apiserver和http)的更改。 对于看到的任何新更改,将针对所需状态和运行状态运行同步。 如果没有看到配置的变化,将在每个同步频率秒同步最后已知的所需状态。
其中调用了syncLoopIteration的函数来执行更具体的监控pod变化的循环。syncLoopIteration代码逻辑待后续单独分析。
6. 总结
6.1. 基本流程
Kubelet.Run主要流程如下:
初始化模块,其实就是运行
imageManager、serverCertificateManager、oomWatcher、resourceAnalyzer。运行各种manager,大部分以常驻goroutine的方式运行,其中包括
volumeManager、statusManager等。执行处理变更的循环函数
syncLoop,对pod的生命周期进行管理。
syncLoop:
syncLoop函数,对pod的生命周期进行管理,其中syncLoop调用了syncLoopIteration函数,该函数根据podUpdate的信息,针对不同的操作,由SyncHandler来执行pod的增删改查等生命周期的管理,其中的syncHandler包括HandlePodSyncs和HandlePodCleanups等。该部分逻辑待后续文章具体分析。
6.2. Manager
以下介绍kubelet运行时涉及到的manager的内容。
imageManager
负责镜像垃圾回收
serverCertificateManager
负责处理证书
oomWatcher
监控内存使用,是否发生内存耗尽即OOM
resourceAnalyzer
监控资源使用情况
volumeManager
对pod执行attached/detached/mounted/unmounted操作
statusManager
使用apiserver同步pods状态; 也用作状态缓存
probeManager
处理容器探针
runtimeClassManager
同步RuntimeClasses
podKiller
负责杀死pod
参考文章:
最后更新于
这有帮助吗?