k8s | 深入理解组件 kubelet
每个Node节点上都运行一个 Kubelet 服务进程,默认监听 10250 端口,接收并执行 Master 发来的指令,管理 Pod 及 Pod 中的容器
kubelet 架构
- Kubelet API,包括 10250 端口的认证 API、4194 端口的 cAdvisor API、10255 端口的只读 API 以及 10248 端口的健康检查 API
- syncLoop:从 API 或者 manifest 目录接收 Pod 更新,发送到 podWorkers 处理,大量使用 channel 处理来处理异步请求
- 辅助的 manager,如 cAdvisor、PLEG、Volume Manager 等,处理 syncLoop 以外的其他工作
- CRI:容器执行引擎接口,负责与 container runtime shim 通信
- 容器执行引擎,如 dockershim、rkt 等(注:rkt 暂未完成 CRI 的迁移)
- 网络插件,目前支持 CNI 和 kubenet
具体来说,有以下的功能
监听apiserver,管理节点和pod
每个 Kubelet
进程会在 API Server
上注册所在Node节点的信息,定期向 Master
节点汇报该节点的资源使用情况,并通过 cAdvisor 监控节点和容器的资源。
节点管理
Kubelet
可以通过设置启动参数 --register-node
来确定是否向 API Server 注册自己。kubelet
给API Server
发送注册消息,API Server
在接收到新消息后,将信息写入 etcd
pod管理
Kubelet
以 PodSpec
的方式工作。PodSpec
是描述一个 Pod
的 YAML
或 JSON
对象。
kubelet
可以通过API Server
监听etcd
目录来获取 pod 清单(配置文件)
Kubelet
监听 etcd
,所有针对 Pod
的操作(创建,修改,删除)都将会被 Kubelet 监听到
- 为该 Pod 创建一个数据目录;
- 从 API Server 读取该 Pod 清单;
- 为该 Pod 挂载外部卷;
- 下载 Pod 用到的 Secret;
- 检查已经在节点上运行的 Pod
健康检查
kubelet 会调用容器的 livenessProde 来检测容器的健康状况,包含三种实现方式
- ExeAction:在容器中执行命令,返回0则健康
- TCPSocketAction:通过ip+port访问,如果可以被访问则健康
- HTTPGetAction:调用HTTP GET 方法,返回200-400则健康
LivenessProbe 存活探针
用于判断容器是否健康,告诉 Kubelet
一个容器什么时候处于不健康的状态。如果 LivenessProbe
探针探测到容器不健康,则 Kubelet
将删除该容器,并根据容器的重启策略做相应的处理
何时使用?
- 如果容器中的进程能够在遇到问题或不健康的情况下自行崩溃,则不一定需要存活态探针
- 如果希望容器在探测失败时被杀死并重新启动,那么请指定一个存活态探针
ReadinessProbe 就绪探针
用于判断容器是否启动完成且准备接收请求,如果探测失败,endpoint 将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址
何时使用?
- 如果你希望容器在探测失败时被杀死并重新启动,那么请指定一个存活态探针。这种情况和存活探针相同,就绪态探针的存在意味着 Pod 将在启动阶段不接收任何数据,并且只有在探针探测成功后才开始接收数据
- 如果你希望容器能够自行进入维护状态,也可以指定一个就绪态探针, 检查某个特定于就绪态的因此不同于存活态探测的端点
- 如果你的应用程序对后端服务有严格的依赖性,你可以同时实现存活态和就绪态探针。存活态探针检测通过后,就绪态探针会额外检查每个所需的后端服务是否可用
startupProbe
指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被 禁用,直到此探针成功为止。如果启动探测失败,kubelet
将杀死容器
何时使用?
- 对于所包含的容器需要较长时间才能启动就绪的 Pod 而言,启动探针是有用的
- 如果你的容器启动时间通常超出
initialDelaySeconds + failureThreshold × periodSeconds
总值,你应该设置一个启动探测
cAdvisor 监控节点和容器的资源
cAdvisor 是一个开源的分析容器资源使用率和性能特性的代理工具,集成到 Kubelet中,当Kubelet启动时会同时启动cAdvisor,且一个cAdvisor只监控一个Node节点的信息。cAdvisor 自动查找所有在其所在节点上的容器,自动采集 CPU、内存、文件系统和网络使用的统计信息
Eviction 驱逐
Kubelet 会监控资源的使用情况,并使用驱逐机制防止计算和存储资源耗尽。在驱逐时,Kubelet 将 Pod 的所有容器停止,并将 PodPhase 设置为 Failed。
容器运行时CRI
容器运行时(Container Runtime)是 Kubernetes 最重要的组件之一,负责真正管理镜像和容器的生命周期。Kubelet 通过 容器运行时接口 与容器运行时交互,以管理镜像和容器。
评论区