架构

每个 Node 上运行一个 Kubelet 服务进程,默认监听 10250 端口

image-20230726223546086

  1. 接收并执行 Master 的指令
  2. 管理 Pod 以及 Pod 中的容器
  3. 在 API Server 注册 Node 信息,定期向 Master 汇报 Node 的资源使用情况
    • 通过 cAdvisor 监控 Node 和容器的资源
    • cAdvisor 通过 Cgroups 收集并上报容器的资源用量

Node 管理

Node 自注册 + Node 状态更新

  1. 自注册模式:Kubelet 通过启动参数 --register-node 来确定是否向 API Server 注册
  2. Kubelet 没有选择自注册模式
    • 用户需要自己配置 Node 资源信息
    • 告知 Kubelet 集群上的 API Server 的位置
  3. Kubelet 选择自注册模式
    • Kubelet 定时API Server 发送 Node 信息
    • API Server 在接收到 Node 信息后,转存到 etcd

Pod 管理

syncLoop - Kubelet 本身也是控制器模式

computePodActions - 比对 Pod Manifest实际 Pod差异,来决定 Action

PLEG - Pod Lifecycle Event Generator - 上报给 API Server - relist 间隔 1 秒执行 1 次

image-20230726224202345

获取 Pod 清单的 4 种方式

Type Method Desc
Pull File 20 秒检查一次
启动参数 --config 指定的配置目录下的文件
默认为 /etc/kubernetes/manifests
Pull HTTP Endpoint 20 秒检查一次
启动参数 --manifest-url 设置
Push API Server 通过 API Server 监听 etcd 目录,同步 Pod 清单
Push HTTP Server Kubelet 监听 HTTP 请求,并响应简单的 API 以提交新的 Pod 清单

Pod 启动流程

image-20230726231845153

CSI -> CRI -> CNI
WaitForAttachAndMount – CSI

image-20230726232153080

pause - SandBox Container - Sleep Indefinitely - 非常巧妙优雅的设计

  1. 同一个 Pod 内的多个容器共享某些资源,SandBox Container 作为底座
    • 不消耗 CPU 资源,且极度稳定
  2. Init Container主 Container在运行时就需要网络就绪的前提
    • Network Namespace 关联到 SandBox Container,即便主 Container Crash,Pod 网络依然是稳定
1
2
3
4
5
6
7
$ k get po
NAME READY STATUS RESTARTS AGE
nginx-deployment-6799fc88d8-hnc4t 1/1 Running 0 8s

$ docker ps | grep nginx-deployment-6799fc88d8-hnc4t
b0a5c9f75cde nginx "/docker-entrypoint.…" About a minute ago Up About a minute k8s_nginx_nginx-deployment-6799fc88d8-hnc4t_default_609b3480-9295-436f-8eae-d3035ba6d245_0
9a49744d3877 registry.aliyuncs.com/google_containers/pause:3.5 "/pause" About a minute ago Up About a minute k8s_POD_nginx-deployment-6799fc88d8-hnc4t_default_609b3480-9295-436f-8eae-d3035ba6d245_0