kubernetes 核心组件运行机制-kubelet运行机制

136 阅读6分钟

概述

KubeletKubernetes 集群中的一个核心组件,运行在每一个节点(Node)上,负责本节点上的容器、Pods 及其关联资源的实际管理和运维工作。它是节点级别的代理,执行以下关键功能:

  1. Pod 和容器管理Kubelet 负责在节点上创建、启动、停止和管理Pod及其内部的容器。它根据从 Kubernetes API Server 接收到的指令来执行这些操作,确保节点上的实际状态与期望状态相匹配。
  2. 资源监控与报告Kubelet 监控节点资源使用情况(如CPU、内存),并将这些信息报告给API Server,使得集群能够基于实时资源状况做出调度决策。
  3. 健康检查:实现对Pod内容器的健康检查和就绪检查,确保服务的高可用性。
  4. 卷管理:管理Pod的存储卷,包括挂载和卸载存储卷,确保数据卷能够被Pod正确访问。
  5. 节点注册与心跳:在启动时,Kubelet会向API Server注册节点信息,并定期发送心跳以维持其在集群中的活跃状态。
  6. 与容器运行时交互Kubelet 可以与多种容器运行时(如DockercontainerdCRI-O)交互,通过容器运行时接口(CRI)来管理容器。
  7. 数据同步:通过API Server观察者(apiserver observer),KubeletAPI Server保持连接,同步节点状态和接收集群级别的配置更新。
  8. 安全与认证Kubelet 支持 TLS 加密通信和认证机制,确保与API Server以及其他组件之间的通信安全。

节点管理

节点通过设置kubelet的启动参数“--register-node”,来决定是否向API Server注册自己。如果该参数的值设置为true,注册自己。在自注册时,kubelet启动时还包含下列参数:

  • --api-serverAPI Server的位置
  • --kubeconfigkubeconfig文件,用于访问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都叫做静态PodStatic 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任务,则做如下处理。

  1. 为该Pod创建一个数据目录
  2. API Server读取Pod清单
  3. 为该Pod挂载外部卷
  4. 下载Pod用到的secret
  5. 检查已经运行在节点上的Pod,如果该Pod没有容器或者Pause容器没有启动,则先通知Pod里的所有容器进程。
  6. 用“kubernetes/pause”镜像为每个Pod都创建一个容器。该Pause容器用于接管Pod中所有其他容器的网络。该容器大概200KB,是一个非常小的容器。
  7. 为Pod中的每个容器做如下处理:
    • 为容器计算一个hash值,然后用容器的名称去查询对应Docker容器的hash值。若查找到容器,且二者的hash值不同,则停止docker容器进程,并停止与之关联的Pause容器的进程,若二者相同,则什么都不处理
    • 如果容器被终止了,且容器没有指定启动策略,则不做任何处理
    • 调用Docker Client下载容器镜像,调用Docker Client运行容器

容器健康检查

Pod通过两类探针来检查容器的健康状态

  • LivenessProbe探针:判断容器是否健康并反馈给kubelet。如果出现不健康状况,kubelet会删除该容器,并根据重启策略做相应处理。
  • ReadinessProbe探针:用于判断容器是否启动完成。如果标记启动失败,Endpoint Controller将会从ServiceEndpoint中删除包含该容器所在Pod的Ip地址的条目。

cAdvisor 资源监控

在k8s集群中,应用程序在执行情况下可以在不同级别上检测到,包括容器、Pod、Service和整个集群。

cAdvisor是一个开源的分析容器资源使用率和性能特性的代理工具,在k8s项目中cAdvisor被集成到代码中,kubelet则通过cAdvisor获取所在节点及容器的数据。cAdvisor自动查找所有在其所在Node上的容器,自动采集CPU、内存、文件系统及其网络使用的统计信息,暴露端口是所在Node的4194端口。

微信图片_20240507213740.png 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/

结语

KubeletKubernetes集群中实现具体任务执行的关键组件,是节点上实现容器编排的核心代理,保证了集群管理指令的有效实施和节点状态的准确反映。