这篇文章将为大家详细讲解有关如何用K8S源码分析Kubelet关键模块,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
1. 运行机制
在k8s集群中,每个node节点上都会运行一个kubelet进程。该进程会处理master下发的任务,定时同步自身的状态并管理Pod。总体来看,kubelet进程主要完成以下几部分工作:
节点管理 - 以固定的时间间隔同步本节点的状态信息到Api Server上。
Pod管理 - 从文件、Http端点、API Server中同步pod信息,创建并管理节点上的所有pod。
容器健康检查 - 提供Liveness & Readiness两种类型的探针,实现容器的监控检查。
资源监控 - 利用cAdvisor实现CPU、内存等的资源统计和监控。
2. 关键模块
kubelet包含的核心模块及相互作用关系可用右图简单表示:
2.1 CRI & Dockershim
k8s为了支持多种容器运行时(目前主要是docker,rkt),提出一个叫CRI(Container Runtime Interface)的概念。CRI是一组gRPC接口,包含了容器生命周期管理的所有操作。k8s所有对容器的操作都通过CRI来进行,这样就可以达到“容器运行时的可替换”以及“隔离容器运行时自身的迭代变更”这两个目的。
CRI主要包含两个核心接口:RuntimeService & ImageManagerService,分别用来管理容器和镜像。CRI最常用的实现是dockershim。dockershim实现了RuntimeService及ImageManagerService两个接口,并以gRPC协议暴露出来。在内部实现中,dockershim使用了libdocker提供的接口,用HTTP(s)协议和docker daemon通讯 ,将CRI协议翻译到了docker协议上。
k8s的/pkg/kubelet/kuberuntime包,提供了一个KubeGenericRuntime接口,内嵌了kubecontainer.Runtime接口,这个接口封装了对容器&镜像的操作。内部结构体kubeGenericRuntimeManager提供这个接口的实现,通过CRI client与cri-shim交互。
2.2 模块简介
右图中其他各模块的完整包名及作用简单介绍如下:
模块 | 包路径 | 作用 |
---|
status.Manager | /pkg/kubelet/status | 维护所有pod的status信息,并和API Server同步 |
ImageManager | /pkg/kubelet/images | 仅提供EnsureImageExists方法,同ImageService接口拉取镜像 |
ImageGCManager | /pkg/kubelet/images | 删除镜像,回收磁盘空间 |
ContainerGC | /pkg/kubelet/container | 删除dead containers,回收磁盘空间 |
ConfigMapManager | /pkg/kubelet/configmap | 管理configmap |
OOMWatcher | /pkg/kubelet | 监听cAdvisor中的OOM事件 |
prober.Manager | /pkg/kubelet/prober | 管理liveness以及readiness探针 |
ContainerManager | /pkg/kubelet/cm | 管理接点上的容器,主要负责cgroup等资源的管理 |
ResourceAnalyzer | /pkg/kubelet/server/status | 提供节点上的资源统计 |
eviction.Manager | /pkg/kubelet/eviction | 在达到资源阈值时,通过kill pods来保障节点稳定 |
NetworkPlugin | /pkg/kubelet/network | 网络插件 |
PodLifecycleEventGenerator | /pkg/kubelet/pleg | 定期检查存活的container,并发出pod生命周期事件 |
VolumeManager | /pkg/kubelet/volumemanager | 卷管理器 |
pod.Manager | /pkg/kubelet/pod | 维护节点上的所有pod信息 |
关于如何用K8S源码分析Kubelet关键模块就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。