节点组件详解:角色、职责与交互

AI 协助说明: 本页由 Codex 协助核验和修复站内链接;正文的技术事实和适用范围未因本次修改而改变,仍以文中来源及当前官方文档为准。

本文边界:本文从节点侧协作关系解释组件分工,不展开 kubelet、流量转发实现或容器运行时的单组件原理。

推荐深读Kubelet 详解kube-proxy 详解Containerd 深度解析

1. Kubelet:节点的生命维持系统#

基本角色#

Kubelet是Kubernetes节点上的主要代理,负责Pod的整个生命周期管理

  • 从API Server接收Pod清单并确保容器正常运行
  • 执行健康检查(liveness/readiness probes)
  • 管理卷(Volumes)挂载与卸载
  • 收集节点和Pod的资源使用指标
  • 向API Server报告节点和Pod状态
  • 执行容器日志管理

交互方式#

graph LR
    A[API Server] -->|分配Pod| B(Kubelet)
    B -->|CRI接口| C[Container Runtime]
    B -->|CNI接口| D[网络插件]
    B -->|CSI接口| E[存储插件]
    C -->|运行| F[容器1]
    C -->|运行| G[容器2]
    B -->|报告状态| A
    B -->|执行| H[Pod生命周期管理]
  • 关键交互流程
    1. 通过API Server的Watch机制接收分配给本节点的Pod
    2. 通过CRI (Container Runtime Interface) API与容器运行时交互
    3. 通过CNI (Container Network Interface)调用网络插件配置Pod网络
    4. 通过CSI (Container Storage Interface)管理持久化存储
    5. 定期向API Server发送心跳和状态更新
    6. 执行配置的探针并根据结果采取行动

面向对象#

  • 直接用户:集群管理员(配置、排错、升级)
  • 间接用户:所有开发者(通过Pod配置影响kubelet行为)
  • 监控对象:SRE/运维团队(监控节点健康状况)

开发者视角#

作为开发者,你通过Pod配置间接控制kubelet

  • 配置合理的liveness/readiness探针:

    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 3
      periodSeconds: 3
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
  • 理解资源限制如何被强制执行:

    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
      requests:
        memory: "64Mi"
        cpu: "250m"
  • 了解Pod生命周期事件:

    • 为什么容器可能被重启(OOMKilled、探针失败)
    • 为什么Pod可能卡在"Terminating"状态
    • Init容器与应用容器的执行顺序
  • 调试技巧

    # 查看kubelet日志(节点级别排错)
    journalctl -u kubelet -f
    
    # 检查Pod在节点上的实际状态
    crictl pods
    crictl logs <container-id>

类比理解#

Kubelet就像建筑工地的工头

  • 从项目经理(API Server)接收建筑图纸(Pod配置)
  • 指挥工人(容器运行时)按照图纸施工
  • 定期检查工程质量(健康检查)
  • 向项目经理报告施工进度和问题
  • 确保工地(节点)有足够材料和设备

2. Kube-proxy:服务网络的交通警察#

基本角色#

Kube-proxy是Kubernetes的网络代理,负责实现Service概念流量路由

  • 维护节点上的网络规则(iptables/IPVS规则)
  • 将Service的ClusterIP流量转发到后端Pod
  • 支持多种代理模式:
    • userspace(已淘汰)
    • iptables(默认,高性能)
    • IPVS(大规模集群,高级负载均衡算法)
  • 处理会话亲和性(SessionAffinity)
  • 与网络策略(NetworkPolicy)配合工作

交互方式#

graph TB
    A[API Server] -->|Service/Endpoint变更| B(Kube-proxy)
    B -->|配置规则| C[iptables/IPVS]
    D[Pod流量] --> C
    C -->|负载均衡| E[后端Pod1]
    C -->|负载均衡| F[后端Pod2]
    C -->|负载均衡| G[后端Pod3]
    H[外部流量] -->|NodePort/ExternalIP| C
  • iptables模式工作流程

    1. 从API Server Watch Service和Endpoint对象变化
    2. 为每个Service创建iptables规则链
    3. 当流量到达Service IP时,iptables根据规则随机选择后端Pod
    4. DNAT(目标地址转换)将流量转发到选中的Pod
  • IPVS模式优势

    • 支持更多负载均衡算法(轮询、最少连接、源IP哈希等)
    • 更好的性能和可扩展性(尤其在大规模集群)
    • 内置会话保持和健康检查

面向对象#

  • 配置者:集群管理员(选择模式、性能调优)
  • 使用者:开发者(设计微服务架构、调试连接问题)
  • 网络策略制定者:安全团队和平台工程师

开发者视角#

作为开发者,你依赖kube-proxy实现服务发现和负载均衡

  • 理解不同Service类型的工作原理:

    • ClusterIP:仅集群内部访问
    • NodePort:通过节点IP:端口访问
    • LoadBalancer:云提供商负载均衡器
    • ExternalName:CNAME记录到外部服务
  • 常见配置

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 9376
      type: ClusterIP
      sessionAffinity: ClientIP  # 会话亲和性
  • 排查连接问题

    # 检查Service和Endpoints
    kubectl get svc,ep my-service
    
    # 测试Service可达性
    kubectl run test --image=busybox --rm -it --restart=Never -- sh
    wget -qO- http://my-service
    
    # 检查节点上的iptables规则
    iptables-save | grep my-service
  • 了解网络策略对流量的影响:

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-app-access
    spec:
      podSelector:
        matchLabels:
          app: my-app
      ingress:
        - from:
            - podSelector:
                matchLabels:
                  role: frontend
          ports:
            - protocol: TCP
              port: 80

类比理解#

Kube-proxy就像机场的行李分拣系统

  • 接收所有到达的行李(网络请求)
  • 根据目的地标签(Service IP)分拣
  • 将行李分配到正确的传送带(后端Pod)
  • 确保没有传送带过载(负载均衡)
  • 当某传送带故障(Pod宕机),自动重新路由

3. Container Runtime:容器的引擎室#

基本角色#

Container Runtime是实际运行容器的软件,负责容器生命周期管理

  • 下载/缓存容器镜像
  • 创建/启动/停止/删除容器
  • 执行资源隔离(cgroups、namespaces)
  • 收集容器日志和指标
  • 实现CRI (Container Runtime Interface)规范

主流实现#

运行时特点适用场景
containerd从Docker中分离的核心容器运行时,轻量级通用生产环境,CNCF毕业项目
CRI-O专为Kubernetes设计的轻量级运行时OpenShift环境,安全优先场景
Docker Engine通过cri-dockerd适配器支持Kubernetes旧集群迁移,开发环境

交互方式#

graph LR
    A[Kubelet] -->|gRPC API| B[CRI Shim]
    B -->|调用| C[Runtime Service]
    B -->|调用| D[Image Service]
    C -->|管理| E[容器生命周期]
    D -->|管理| F[镜像缓存]
    E --> G[Containerd]
    F --> G
    G --> H[runc]
    H --> I[Linux内核]
    I --> J[cgroups]
    I --> K[namespaces]
  • CRI架构

    1. Kubelet通过gRPC调用CRI接口
    2. CRI Shim(如containerd的cri插件)转换CRI调用到具体运行时API
    3. 容器运行时调用底层执行器(如runc)创建容器
    4. 通过Linux内核特性(cgroups、namespaces)实现资源隔离
  • 镜像管理流程

    1. Kubelet请求拉取镜像
    2. 运行时检查本地缓存
    3. 未命中缓存时,从配置的镜像仓库拉取
    4. 验证镜像签名(如果启用)
    5. 解压并存储到本地缓存

面向对象#

  • 维护者:集群管理员(版本升级、漏洞修复)
  • 安全团队:运行时安全策略、漏洞扫描
  • 开发者:镜像构建、调试容器启动失败

开发者视角#

作为开发者,你通过容器镜像和配置与运行时交互

  • 了解镜像拉取策略:

    imagePullPolicy: Always  # 总是拉取
    imagePullPolicy: IfNotPresent  # 本地不存在时拉取
    imagePullPolicy: Never  # 仅使用本地镜像
  • 调试容器启动失败

    # 查看容器运行时状态
    crictl info
    
    # 列出所有容器(包括失败的)
    crictl ps -a
    
    # 检查容器日志
    crictl logs <container-id>
    
    # 检查镜像列表
    crictl images
  • 理解安全上下文在运行时的执行:

    securityContext:
      runAsUser: 1000
      runAsGroup: 3000
      fsGroup: 2000
      capabilities:
        add: ["NET_ADMIN", "SYS_TIME"]
      readOnlyRootFilesystem: true
      privileged: false
  • 了解容器日志机制:

    • 标准输出/错误被kubelet收集
    • 配置日志轮转避免磁盘占满
    • 理解JSON日志格式与多行日志处理

类比理解#

Container Runtime就像汽车引擎

  • 接收油门指令(kubelet命令)
  • 将燃料(镜像)转化为动力(计算资源)
  • 有内置仪表盘(指标收集)
  • 需要定期保养(安全更新)
  • 不同品牌(containerd、CRI-O)有不同性能特点
  • 驾驶员(开发者)不需了解引擎内部工作,但需要知道基本使用方法

整体交互流程:Pod启动全过程#

sequenceDiagram
    API Server->>+Scheduler: 新Pod需要调度
    Scheduler-->>-API Server: 选择节点并绑定
    
    API Server->>+Kubelet: 通知新Pod分配到本节点
    Kubelet->>+Container Runtime: 拉取容器镜像
    Container Runtime->>-Container Registry: 下载镜像
    Container Registry-->>-Container Runtime: 返回镜像
    Container Runtime-->>-Kubelet: 镜像就绪
    
    Kubelet->>+CNI Plugin: 配置Pod网络
    CNI Plugin-->>-Kubelet: 网络配置完成
    
    Kubelet->>+Container Runtime: 创建并启动容器
    Container Runtime-->>-Kubelet: 容器运行中
    
    Kubelet->>+Kube-proxy: 通知新Pod加入Service后端
    Kube-proxy->>+Node Network Stack: 更新iptables/IPVS规则
    Node Network Stack-->>-Kube-proxy: 规则更新完成
    Kube-proxy-->>-Kubelet: 网络配置确认
    
    Kubelet->>+API Server: 报告Pod状态为Running
    API Server-->>-API Server: 更新etcd中的Pod状态

节点组件间的协作关系#

服务请求流程#

  1. 外部请求到达节点IP:NodePort
  2. Kube-proxy的iptables规则捕获流量
  3. 根据Service后端选择目标Pod IP
  4. 流量通过CNI配置的网络路径到达Pod
  5. 容器内的应用处理请求
  6. 响应沿相同路径返回

资源监控流程#

  1. Container Runtime收集容器CPU/内存使用
  2. Kubelet聚合容器指标
  3. Kubelet向API Server报告节点和Pod资源使用
  4. Metrics Server从API Server聚合集群级指标
  5. HPA (Horizontal Pod Autoscaler) 基于指标自动调整副本数
  6. Kube-proxy动态更新负载均衡后端

面向不同角色的核心要点#

开发者(你的角色)需要重点掌握#

  1. Kubelet交互

    • 配置有效的liveness/readiness探针
    • 合理设置资源请求/限制
    • 理解Pod生命周期事件
    • 有效收集和分析容器日志
  2. Kube-proxy影响

    • 理解Service类型及其网络行为
    • 设计微服务通信模式
    • 调试连接问题和DNS解析
    • 了解网络策略对应用通信的影响
  3. Container Runtime考虑

    • 构建优化的容器镜像
    • 理解镜像拉取策略
    • 调试容器启动失败
    • 配置适当的安全上下文

集群管理员需要额外掌握#

  1. Kubelet:配置参数调优、证书轮换、资源预留
  2. Kube-proxy:模式选择(iptables vs IPVS)、性能调优
  3. Container Runtime:安全加固、漏洞管理、运行时选择
  4. 整体节点:监控指标收集、自动修复策略

学习与调试建议#

1. 实用命令集合#

# 检查节点组件状态
kubectl get nodes -o wide
kubectl describe node <node-name>

# 直接与容器运行时交互
crictl ps -a  # 列出所有容器
crictl pods   # 列出所有Pod
crictl images # 列出镜像
crictl inspect <container-id> # 详细容器信息

# 检查kube-proxy规则
iptables-save | grep <service-name>
ipvsadm -ln  # 如果使用IPVS模式

# 诊断网络连接
kubectl run debug-pod --image=nicolaka/netshoot --rm -it --restart=Never -- sh
# 在容器内执行:
nslookup my-service
curl -v http://my-service

2. 常见问题排查流程#

Pod无法启动

  1. kubectl describe pod <pod-name> 查看事件
  2. 检查容器日志 kubectl logs <pod-name>
  3. 在节点上使用 crictl ps -a | grep <pod-name> 检查容器状态
  4. 检查kubelet日志 journalctl -u kubelet | grep <pod-name>

服务无法访问

  1. 验证Service和Endpoints kubectl get svc,ep <service-name>
  2. 检查网络策略 kubectl get networkpolicy
  3. 在节点上检查iptables规则 iptables-save | grep <service-ip>
  4. 从集群内Pod测试连接 kubectl run test --image=busybox --rm -it --restart=Never -- wget -qO- http://<service-name>

3. 学习路径建议#

  1. 基础实验

    • 在minikube/kind中部署应用,观察节点组件行为
    • 故意制造资源不足,观察kubelet的驱逐行为
    • 修改Service配置,观察kube-proxy规则变化
  2. 深入实践

    • 通过cri-debug工具分析容器运行时行为
    • 使用tcpdump抓包分析服务流量路径
    • 模拟节点故障,观察Pod重建过程
  3. 推荐资源

    • 《Kubernetes Up & Running》第7章(节点组件)
    • Kubernetes官方文档"Concepts/Architecture/Nodes"
    • containerd GitHub仓库的CRI实现说明
    • 《Cloud Native Infrastructure》中网络章节

理解节点组件不是为了成为节点管理员,而是为了设计出在Kubernetes环境中运行良好的应用。当你了解这些组件如何工作,就能:

  • 配置合理的健康检查,避免服务中断
  • 优化容器镜像大小,加速部署
  • 设计有效的服务通信,减少网络延迟
  • 快速定位和解决应用问题
  • 做出符合Kubernetes设计理念的架构决策

记住:节点组件是Kubernetes的"执行层",它们将控制平面的声明式配置转化为实际运行的应用。作为开发者,你不需要管理这些组件,但必须理解它们如何影响你的应用行为,才能在云原生环境中取得成功。

本文共 4651 字,创建于 Dec 26, 2025

相关标签: Kubernetes