如何用K8S源码分析Kubelet关键模块
更新:HHH   时间:2023-1-7


这篇文章将为大家详细讲解有关如何用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关键模块就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

返回云计算教程...