概述
Kubelet 是 Kubernetes 集群中的一个核心组件,运行在每一个节点(Node)上,负责本节点上的容器、Pods 及其关联资源的实际管理和运维工作。它是节点级别的代理,执行以下关键功能:
- Pod 和容器管理:
Kubelet负责在节点上创建、启动、停止和管理Pod及其内部的容器。它根据从Kubernetes API Server接收到的指令来执行这些操作,确保节点上的实际状态与期望状态相匹配。 - 资源监控与报告:
Kubelet监控节点资源使用情况(如CPU、内存),并将这些信息报告给API Server,使得集群能够基于实时资源状况做出调度决策。 - 健康检查:实现对Pod内容器的健康检查和就绪检查,确保服务的高可用性。
- 卷管理:管理Pod的存储卷,包括挂载和卸载存储卷,确保数据卷能够被Pod正确访问。
- 节点注册与心跳:在启动时,
Kubelet会向API Server注册节点信息,并定期发送心跳以维持其在集群中的活跃状态。 - 与容器运行时交互:
Kubelet可以与多种容器运行时(如Docker、containerd或CRI-O)交互,通过容器运行时接口(CRI)来管理容器。 - 数据同步:通过
API Server观察者(apiserver observer),Kubelet与API Server保持连接,同步节点状态和接收集群级别的配置更新。 - 安全与认证:
Kubelet支持TLS加密通信和认证机制,确保与API Server以及其他组件之间的通信安全。
节点管理
节点通过设置kubelet的启动参数“--register-node”,来决定是否向API Server注册自己。如果该参数的值设置为true,注册自己。在自注册时,kubelet启动时还包含下列参数:
- --api-server:
API Server的位置 - --kubeconfig:
kubeconfig文件,用于访问API Server的安全配置文件 - --cloud-provider:与服务商地址,仅用于共有云环境。
当前每个kubelet都被授予创建和修改任何节点的权限。但在实践中,它仅创建和修改自己。
k8s集群中的某些kubelet没有选择自注册模式,需要自己去配置Node的资源信息,同时告知API Server的位置。
kubelet在启动时通过API Server注册节点信息,并定时向API Server发送节点的新消息,API Server在接收到这些消息后保存到ETCD中。--node-status-update-frequency 设置kubelet报告间隔时间,默认10s。
Pod 管理
kubelet通过一下几种方式获得自身Node上要运行的Pod清单。
- 文件:
kubelet启动参数“--config”指定的配置文件目录下的文件(默认目录为/etc/kubernetes/manifests/)。通过 --file-check-frequency 设置检查该文件目录的时间间隔,默认为20秒。 - HTTP端点:通过“--manfifest-url”参数设置。通过 --http-check-frequency 设置检查该HTTP端点数据的时间间隔,默认为20秒。
- API Server:
kubelet通过API Server监听ETCD目录,通过Pod列表。
所有以非API Server方式创建的Pod都叫做静态Pod(Static Pod)。kubelet将静态Pod状态汇报给API Server,然后API Server创建一个镜像Pod和其匹配,镜像Pod会反映静态Pod的真实的状态。
kubelet监听etcd,所有针对Pod的操作都会被kubelet监听。如果发现有新的绑定到本节点的Pod,则按照Pod清单要求创建Pod。
如果发现本地的Pod被修改,则kubelet或作出相应的修改,比如在删除Pod中的容器时,会通过docker client删除Pod中的容器。
kubelet读取监听到信息,如果是创建和修改Pod任务,则做如下处理。
- 为该Pod创建一个数据目录
- 从
API Server读取Pod清单 - 为该Pod挂载外部卷
- 下载Pod用到的
secret - 检查已经运行在节点上的Pod,如果该Pod没有容器或者
Pause容器没有启动,则先通知Pod里的所有容器进程。 - 用“kubernetes/pause”镜像为每个Pod都创建一个容器。该Pause容器用于接管Pod中所有其他容器的网络。该容器大概200KB,是一个非常小的容器。
- 为Pod中的每个容器做如下处理:
- 为容器计算一个
hash值,然后用容器的名称去查询对应Docker容器的hash值。若查找到容器,且二者的hash值不同,则停止docker容器进程,并停止与之关联的Pause容器的进程,若二者相同,则什么都不处理 - 如果容器被终止了,且容器没有指定启动策略,则不做任何处理
- 调用
Docker Client下载容器镜像,调用Docker Client运行容器
- 为容器计算一个
容器健康检查
Pod通过两类探针来检查容器的健康状态
LivenessProbe探针:判断容器是否健康并反馈给kubelet。如果出现不健康状况,kubelet会删除该容器,并根据重启策略做相应处理。ReadinessProbe探针:用于判断容器是否启动完成。如果标记启动失败,Endpoint Controller将会从Service的Endpoint中删除包含该容器所在Pod的Ip地址的条目。
cAdvisor 资源监控
在k8s集群中,应用程序在执行情况下可以在不同级别上检测到,包括容器、Pod、Service和整个集群。
cAdvisor是一个开源的分析容器资源使用率和性能特性的代理工具,在k8s项目中cAdvisor被集成到代码中,kubelet则通过cAdvisor获取所在节点及容器的数据。cAdvisor自动查找所有在其所在Node上的容器,自动采集CPU、内存、文件系统及其网络使用的统计信息,暴露端口是所在Node的4194端口。
kubelet作为连接kubenetes master和各Node之间的桥梁,管理运行在Node上的Pod和容器。kubelet将每个Pod都转换成它的成员容器,同时从cAdvisor获取单独的容器使用统计信息,然后通过REST API暴露数据。
部署 cAdvisor
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: cadvisor
namespace: kube-system
spec:
selector:
matchLabels:
app: cAdvisor
template:
metadata:
labels:
app: cAdvisor
spec:
tolerations: #污点容忍,忽略master的NoSchedule
- effect: NoSchedule
key: node-role.kubernetes.io/master
hostNetwork: false #
restartPolicy: Always # 重启策略
containers:
- name: cadvisor
image: registry.cn-hangzhou.aliyuncs.com/sysu-faas/cadvisor:v0.45.0
imagePullPolicy: IfNotPresent # 镜像策略
ports:
- containerPort: 8080
hostPort: 8888
volumeMounts:
- name: root
mountPath: /rootfs
- name: run
mountPath: /var/run
- name: sys
mountPath: /sys
- name: docker
mountPath: /var/lib/containerd
volumes:
- name: root
hostPath:
path: /
- name: run
hostPath:
path: /var/run
- name: sys
hostPath:
path: /sys
- name: docker
hostPath:
path: /var/lib/containerd
运行并查看结果
# 创建 DeamonSet
kubectl apply -f cadvisor.yaml -n kube-system
# 查看结果
[root@master1 huo-l]# kubectl get ds -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
cadvisor 4 4 4 4 4 <none> 2d
访问:http://192.168.40.180:8888/containers/
结语
Kubelet是Kubernetes集群中实现具体任务执行的关键组件,是节点上实现容器编排的核心代理,保证了集群管理指令的有效实施和节点状态的准确反映。