K8s-kubelet(Overview)
K8s-kubelet(Overview)
基于1.25
kubelet是K8s中最重要的节点代理程序,运行在集群的每个节点上。
- 能够自动将节点注册到集群
- 将节点上、Pod运行状态和资源使用情况周期性上报到控制平面
- 同时接受控制平面发送到工作任务、启动停止容器、维护管理Pod
- 也包含对cAdvusor资源用量监控、容器和镜像垃圾回收
kubelet架构设计
kubelet整体架构采用了基于事件的处理模型,通过syncLoop和不断调谐Podtatus和PodSpec差距
PodSpec主要来源自三个来源,kube-apiserver、file和HTTP。
- file和HTTP主要用于发现Static类型的Pod
- kubelet默认每隔20s执行一次检测

PodStatus实际状态主要是通过PLEG周期性扫描冗余运行时的运行状态获取。
PLEG每隔1s,从容器运行时获取Pod和Container信息,并于本地缓存进行对比,发生变更的时候,生成PLEG事件,并且发送给事件订阅者触发执行事件处理程序。
- 默认,当产生PLEG事件,kubelet会执行sync调谐
- kubelet提供了HTTPServer,端口10250,支持metrics指标采集、监控检查、接受来自kube-apiserver的Debug请求
- 比如,执行kubectl logs,kubectl 发送给kube-apiserver,kube-apiserver完成合法性校验,会向Pod所在的kubelet的日志服务端点/containerLogs发起请求,有kubelet读取容器日志,返回给kube-apiserver
管理器功能列表
| 名称 | 功能描述 |
|---|---|
| cAdvisor | 采集当前节点的容器、机器资源、内核和运行版本、文件系统等监控信息 |
| CertificateManager | 自动向kube-apiserver申请节点颁发kubelet-client证书,并在在证书过期前更新本地证书 |
| CgroupManger | 维护和管理Pod、Container的Cgroup层级结构,基层基于libcontainer的cgroups实现 |
| CloudResourcesSyncManager | 从云厂商同节点状态,如更新NodeAddress地址信息 |
| ConfigMapManager | kubelet读取ConfigMap对象的接口,支持3种检测变更方法,分别如下1. Watch:使用Informer List-Watch机制监听ConfigMap变化,及时更新超过生存时间的ConfigMap自动失效,被重新加载2.Cache:使用固定的TTL超过时间,超过生存时间ConfigMap自动失效3. Get:不使用缓存,直接从kube-apiserver读取最新的ConfigMap对象 |
| ContainerGC | 容器垃圾回收,清理已经消亡的Container,可以通过GCPolicy控制垃圾回收策略 |
| ContainerLogManager | 容器日志管理Rotate滚动,每隔10s检查并执行一次日志Rotate操作,可以通过LogRotatePolicy控制器控制Rotate策略(如最大日志文件大小,最大日志文件数量) |
| ContainerManager | 主要负责节点上运行的容器的cgroup配置,通过调用Cgroup配置cgroup。如果指定了kubelet的–cgroups-per-qos启动参数为true(默认true),则kubelet会建立cgroup层级结构,确保不同的QOS Pod资源隔离,目前支持3种QOS等级,分别Guaranceed、BestEffort、Burstable |
| CPUManager | 维护和管理CPU资源分配,目前支持俩种cpuset管理策略,分别是none(默认策略)、static。定期通过CRI写入资源更新,以保证PodCPU分配和cgroup设置一致 |
| DeviceManager | 启动gRPC监听kubelet.sock,device plugin通过连接gRPC注册device信息,kubelet通过List-Watch机制监听deice更新,维护节点可分配和cgroup设置一样 |
| EvictionManager | 当节点的内存、磁盘、PID等资源不足,达到了配置了驱逐阈值的时候,驱逐管理器会按照Pod QOS等级,按顺序驱逐低优先级的Pod,以保证节点的稳定性。可以通过–eviction-hard参数配置驱逐阈值。 |
| ImageGCManager | 维护本地镜像列表,当镜像磁盘使用率达到了配置的上限阈值,清理节点上不使用的镜像,直到镜像磁盘使用率下降到配置的下限阈值,可以通过ImageGCPolciy设置镜像回收策略 |
| kubeGenericRuntimeManger | Runtime接口的默认实现,封装了对Pod和Container常见操作,管理Pod和Container的生命周期,底层通过CRI调用Remote ContainerRuntime实现对容器运行时的操作 |
| MemoryManager | 维护和管理Memory资源分配,支持俩种管理策略分别是none(默认策略)、static。当启用MemoryManager featuregate,默认启用 |
| NodeLeaseController | 周期性声明和刷新节点的Lease对象,维持节点活跃状态 |
| NodeShutdownManager | 监听节点关机时间,在关机前,执行优雅关闭逻辑 |
| OOMWatcher | 监听操作系统OOM事件,并且记录为节点的Event |
| PluginManager | 插件管理器,主要用于处理插件的验证、注册、反注册,目前支持Device和CSI。通过监听特定目录(/var/lib/kubelet/plugins_registry)下拓展名为 .sock的文件的创建发现插件,并且通过gRPC发起连接获取插件信息,完成对插件的管理。当拓展名.sock被移除,执行反注册 |
| PodManager | 提供存储和访问Pod信息的接口,封装关于Pod操作的接口,维持StaticPod和Mirror Pod的映射关系 |
| ProbeManager | 负责执行容器监控探测,目前支持三种探针,readiness、liveness、statup |
| QOSContainerManager | 负责维护Pod的QOS等级,通过调用CgroupManager完成cgroup设置 |
| RuntimeClassManager | 监听和缓存RuntimeClass信息,提供kubelet启动容器时使用,Pod可通过设置RuntimeClassName字段指定容器运行时使用的特定Runtime如(runc)启动容器 |
| SecretManager | kubelet读取secret对象接口,目前支持三种变更检测1.Watch:使用Informer监听Secret 2.Cache:使用固定的TTL超时时间,超过生存时间的Secret自动失效,被重新加载 3.Get:不使用缓存,直接从kube-apiserver读取最新的Secret |
| StatusManager | 维护和存储最新的Pod Status信息,并将Pod Status信息不断同步回kube-apiserver |
| TokenManager | 维护Service Account Token缓存,负责申请Token,并清理已经失效的Token |
| TopologyManager | 负责维护CPU和硬件涉笔的拓扑状态,以支持在进行资源分配的时候进行硬件级的亲和条有哦,提升性能。支持4种分配策略,分别为Node(默认)、best-errfort、retricted、single-numa-node |
| VolumeManager | 管理存储卷attach、mount、unmount、detach操作,底层通过调用CSI实现 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Joohwan!
评论


