工作节点组件详解:kubelet、kube-proxy 与容器运行时

摘要:深入了解 Kubernetes 工作节点(Worker Node)上运行的三大核心组件:kubelet、kube-proxy、容器运行时,以及它们如何协同工作。

一、Worker Node 组件全景

工作节点负责运行 Pod 中的容器,由 kubelet、kube-proxy 和容器运行时协同完成。kubelet 管理 Pod 生命周期,kube-proxy 维护网络规则,容器运行时负责实际创建和运行容器。
Pod
Pod C
容器
Worker Node
kubelet

节点代理
管理 Pod 生命周期
汇报节点状态
执行健康检查
kube-proxy

网络代理
Pod A
Pod B
Container Runtime

containerd / CRI-O
容器
容器

上图展示了工作节点上三大组件的职责划分:kubelet 作为节点代理与 API Server 通信并驱动容器运行时;kube-proxy 实现 Service 的流量转发;容器运行时通过 CRI 接口执行容器操作。

二、kubelet --- 节点代理

2.1 核心职责

kubelet 是运行在每个节点上的代理程序(Agent),是 Worker Node 上最重要的组件。
kubelet 核心职责
Pod 管理

获取 Pod 清单 / 调用 CRI / 确保容器运行
状态汇报

定期汇报节点和 Pod 状态
健康检查

liveness / readiness / startup
卷管理

挂载/卸载存储卷

kubelet 从 API Server 获取分配到本节点的 Pod 清单,调用容器运行时创建和启动容器,执行健康检查探针,并管理 Pod 所需的存储卷挂载。

2.2 工作流程

kubelet 通过 Watch API Server 获取 Pod 变更,收到本节点 Pod 后执行创建、启动、监控等操作。
Watch
API Server
kubelet
① 解析 Pod Spec
② 准备存储卷
③ 调用 CRI 创建容器
④ 持续监控与健康检查
Container Runtime

拉取镜像 / 创建容器

kubelet 解析 Pod 规格后,先挂载 Volume,再通过 CRI 调用容器运行时拉取镜像并启动容器,最后持续执行健康检查并上报状态。

2.3 健康检查详解

kubelet 支持三种探针(Probe)来检查容器健康状态:
三种探针
Liveness Probe

失败则重启容器
Readiness Probe

失败则从 Service 端点移除
Startup Probe

用于慢启动应用

  • Liveness Probe:检测容器是否存活,失败时 kubelet 杀死并重启容器。
  • Readiness Probe:检测容器是否就绪接收流量,失败时从 Service 端点列表中移除,不重启。
  • Startup Probe:检测容器是否启动完成,适用于 Java 等慢启动应用。

检查方式包括:HTTP GET(200-399 表示健康)、TCP Socket、Exec Command、gRPC。

配置示例

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: my-app:v1
    ports:
    - containerPort: 8080
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 10
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5

三、kube-proxy --- 网络代理

3.1 职责

kube-proxy 运行在每个节点上,负责实现 Service 的网络规则,将访问 Service 的流量转发到后端 Pod。
kube-proxy 职责
维护网络规则

Service 创建/更新时更新规则
负载均衡

在多个 Pod 副本间分发流量

当 Service 或 Endpoints 变更时,kube-proxy 更新本节点的 iptables 或 IPVS 规则,将 ClusterIP 流量转发到实际 Pod IP。

3.2 代理模式

kube-proxy 支持三种代理模式,不同模式在性能和功能上有所差异。
kube-proxy 模式
iptables 模式

默认,内核态转发
IPVS 模式

大规模集群推荐
nftables 模式

K8s 1.31+

  • iptables 模式:默认模式,通过内核 iptables 规则转发,性能较好,规则过多时可能影响性能。
  • IPVS 模式:使用内核 IPVS 模块,支持多种负载均衡算法(rr、lc、dh、sh、sed、nq),适合大规模集群。
  • nftables 模式:Kubernetes 1.31+ 新增,使用 nftables 替代 iptables,更易维护。

3.3 流量转发流程(iptables 模式)

客户端 Pod 访问 Service 时,请求经 kube-proxy 配置的 DNAT 规则转发到后端 Pod。
随机选择
Pod 请求 10.96.0.100:80
iptables DNAT 规则
10.244.1.5:8080
10.244.2.3:8080
10.244.3.7:8080
后端 Pod

kube-proxy 为每个 Service 配置 DNAT 规则,将 ClusterIP:port 映射到多个 Pod IP:targetPort,流量按配置的算法随机或轮询转发。

四、Container Runtime --- 容器运行时

4.1 演进历史

Kubernetes 1.24 起移除 dockershim,kubelet 直接通过 CRI 对接 containerd 或 CRI-O。
当前架构 K8s 1.24+
kubelet
CRI 接口
containerd
CRI-O
runc
runc

dockershim 已废弃,推荐使用 containerd(通用)或 CRI-O(专为 K8s 设计,常见于 OpenShift)。

4.2 CRI(Container Runtime Interface)

CRI 是 Kubernetes 定义的标准接口,使 kubelet 可对接多种容器运行时实现。
kubelet
CRI gRPC
RuntimeService

RunPodSandbox / CreateContainer
ImageService

PullImage / ListImages
containerd
CRI-O

通过 CRI,Kubernetes 不依赖特定容器运行时,只需实现 RuntimeService 和 ImageService 即可接入。

4.3 containerd vs CRI-O

特性 containerd CRI-O
来源 Docker 项目拆分 Red Hat 主导
用户 最广泛 OpenShift
功能范围 通用容器运行时 专为 K8s 设计
生态 Docker 生态兼容 OCI 标准兼容

五、 Pod 创建流程

在工作节点上,kubelet 创建 Pod 的完整流程如下:
收到 Pod 指令
① 创建 Pod Sandbox
② CNI 配置网络
③ 拉取镜像
④ 启动 Init 容器
⑤ 启动应用容器
⑥ postStart Hook
⑦ 状态更新为 Running

kubelet 先创建 Pod Sandbox(网络命名空间、pause 容器),再通过 CNI 分配 Pod IP,拉取镜像后依次启动 Init 容器和主容器,执行 postStart Hook 并开始健康检查,最后将 Pod 状态更新为 Running。

六、节点资源管理

kubelet 将节点资源划分为系统预留、K8s 预留、驱逐阈值和可分配部分,可分配资源用于运行 Pod。
节点资源分配
总资源
System Reserved
Kube Reserved
Eviction Threshold
Allocatable

Allocatable = Total - SystemReserved - KubeReserved - EvictionThreshold。资源不足时,kubelet 会根据驱逐策略驱逐部分 Pod。

七、常用 kubectl 命令

bash 复制代码
# 查看所有节点
kubectl get nodes

# 查看节点详情
kubectl describe node <node-name>

# 查看节点资源
kubectl get nodes -o custom-columns='NAME:.metadata.name,CPU:.status.capacity.cpu,MEMORY:.status.capacity.memory'

# 污点节点(禁止调度)
kubectl taint nodes node1 key=value:NoSchedule

# 取消污点
kubectl taint nodes node1 key:NoSchedule-

kubectl describe node 输出包括 Conditions(Ready、MemoryPressure、DiskPressure、PIDPressure)、Capacity、Allocatable 等关键信息。

八、常见问题

Q1:如何切换 kube-proxy 为 IPVS 模式?

修改 kube-proxy DaemonSet,设置 --proxy-mode=ipvs 并确保加载 ip_vs 等内核模块。部分发行版需额外安装 ipvsadm

Q2:kubelet 启动失败常见原因?

常见原因包括:证书过期、kubeconfig 配置错误、容器运行时未就绪、磁盘空间不足、cgroup 驱动不匹配等。可通过 journalctl -u kubelet 查看日志。

Q3:如何配置节点资源预留?

在 kubelet 启动参数中设置 --system-reserved--kube-reserved--eviction-hard 等。例如:--system-reserved=cpu=500m,memory=1Gi

九、总结

组件 职责
kubelet 节点代理,管理 Pod 生命周期、汇报状态、执行健康检查
kube-proxy 维护网络规则,实现 Service 负载均衡与流量转发
Container Runtime 通过 CRI 拉取镜像、创建和运行容器

所有组件仅与 API Server 通信,不直接访问 etcd。CRI 使 Kubernetes 不依赖特定容器运行时。

相关推荐
@hdd2 小时前
Kubernetes 网络模型:Pod 通信、Service 网络与 CNI
网络·云原生·容器·kubernetes
封奚泽优2 小时前
Docker常用命令(Windows 11)
运维·docker·容器
only_Klein7 小时前
kubernetes-ReplicaSet控制器
容器·kubernetes
only_Klein8 小时前
Kubernetes-DaemonSet控制器
容器·kubernetes
什么都干的派森13 小时前
Qdrant生产环境部署方法(Docker)
运维·docker·容器·qdrant
叱咤少帅(少帅)13 小时前
docker 镜像加速地址
运维·docker·容器
阿寻寻14 小时前
【云原生技术】探针**就是:Kubelet(K8s 节点上的组件)会**进入容器里执行一条命令**,根据命令的退出码判断健康
云原生·kubernetes·kubelet
迎仔15 小时前
11-裸金属算力中心:K8s的实际价值与“管一切“的体现
云原生·容器·kubernetes
岁岁种桃花儿15 小时前
kubeadm构建单master多Node的k8s集群。
云原生·容器·kubernetes