SIG-Node与CRI
发表于:2025-12-07 | 分类: 学习

与 kubelet 以及容器运行时管理相关的内容,都属于 SIG-Node 的范畴。

kubelet 工作原理如图所示:

kubelet 的工作核心,就是一个控制循环,即:SyncLoop(图中的大圆圈)。而驱动这个控制循环运行的事件,包括四种:

  1. Pod 更新事件;
  2. Pod 生命周期变化;
  3. kubelet 本身设置的执行周期;
  4. 定时的清理事件。

kubelet 启动的时候,要做的第一件事情,就是设置 Listers,也就是注册它所关心的各种事件的 Informer。这些 Informer,就是 SyncLoop 需要处理的数据的来源。kubelet 还负责维护着很多很多其他的子控制循环(也就是图中的小圆圈)。,比如 Volume Manager、Image Manager、Node Status Manager 等等。这些控制循环的责任,就是通过控制器模式,完成 kubelet 的某项具体职责。

kubelet 是通过 Watch 机制,监听了与自己相关的 Pod 对象的变化。这个 Watch 的过滤条件是该 Pod 的 nodeName 字段与自己相同。kubelet 会把这些 Pod 的信息缓存在自己的内存里。

当一个 Pod 完成调度、与一个 Node 绑定起来之后, 这个 Pod 的变化就会触发 kubelet 在控制循环里注册的 Handler,也就是上图中的 HandlePods 部分。此时,通过检查该 Pod 在 kubelet 内存里的状态,kubelet 就能够判断出这是一个新调度过来的 Pod,从而触发 Handler 里 ADD 事件对应的处理逻辑。

在具体的处理过程当中,kubelet 会启动一个名叫 Pod Update Worker 的、单独的 Goroutine 来完成对 Pod 的处理工作。

kubelet 调用下层容器运行时的执行过程,而是通过一组叫作 CRI(Container Runtime Interface,容器运行时接口)的 gRPC 接口来间接执行的。

有了CRI 之后,Kubernetes 以及 kubelet 的架构如图所示:

当 Kubernetes 通过编排能力创建了一个 Pod 之后,调度器会为这个 Pod 选择一个具体的节点来运行。这时候,kubelet 就会通过 SyncLoop 来判断需要执行的具体操作,比如创建一个 Pod。此时,kubelet 实际上就会调用一个叫作 GenericRuntime 的通用组件来发起创建 Pod 的 CRI 请求。

至于CRI请求,每台宿主机上都会单独安装一个负责响应 CRI 的组件,这个组件,一般被称作 CRI shim。CRI shim 的工作,就是扮演 kubelet 与容器项目之间的“垫片”(shim)。所以它的作用非常单一,那就是实现 CRI 规定的每个接口,然后把具体的 CRI 请求“翻译”成对后端容器项目的请求或者操作。

上一篇:
CRI和容器运行时
下一篇:
GPU管理和Device Plugin机制