2. Kubernetes 架构回顾:控制平面组件、节点组件、核心资源对象概述

在深入准入控制与节点扩容故障排查之前,必须对 Kubernetes 整体架构有清晰的认知。本章从控制平面、工作节点和核心资源对象三个维度进行回顾,为后续章节的故障定位建立知识基础。

2.1 控制平面组件(Control Plane Components)

控制平面负责集群的全局决策和状态管理,是集群的“大脑”。以下组件运行在控制平面节点上:

组件 核心职责 关键端口
kube-apiserver 所有 API 请求的入口,负责认证、授权、准入控制、数据持久化到 etcd 6443 (HTTPS)
etcd 分布式键值存储,保存集群所有资源对象的状态数据 2379, 2380
kube-scheduler 监听未调度的 Pod,根据调度策略将其绑定到合适的节点 10259 (HTTPS)
kube-controller-manager 运行各类控制器(Node Controller、Replication Controller 等),确保实际状态趋近期望状态 10257 (HTTPS)
cloud-controller-manager 与云平台交互,管理负载均衡、存储卷、节点路由等云资源(可选组件) 10258 (HTTPS)
故障排查要点: 当节点扩容或容器运行时状态同步失败时,首先检查 kube-apiserver 的准入控制链是否拦截了请求,以及 etcd 的读写延迟是否异常。

2.2 节点组件(Node Components)

每个工作节点上运行以下组件,负责维护 Pod 的运行环境和网络连通性:

  • kubelet:节点代理,负责管理 Pod 生命周期、健康检查、上报节点状态。与容器运行时(如 containerd、CRI-O)通过 CRI 接口通信。
  • kube-proxy:维护节点上的网络规则,实现 Service 的负载均衡和集群内通信。通常使用 iptables 或 IPVS 模式。
  • 容器运行时(Container Runtime):实际运行容器的软件,如 containerd、CRI-O、Docker(已弃用)。通过 CRI 接口与 kubelet 交互。
关键路径: 节点扩容时,kubelet 向 apiserver 注册节点 → 调度器分配 Pod → kubelet 通过 CRI 调用容器运行时创建容器 → 容器运行时状态通过 kubelet 上报回 apiserver。任何一个环节中断都会导致状态同步失败。
Kubernetes 控制平面与节点组件架构 控制平面 (Control Plane) kube-apiserver etcd kube-scheduler kube-controller-manager 工作节点 (Worker Node) kubelet kube-proxy 容器运行时 (containerd/CRI-O) kubelet 通过 CRI 接口与容器运行时通信,通过 apiserver 上报节点和 Pod 状态 kube-proxy 通过 iptables/IPVS 规则实现 Service 流量转发

2.3 核心资源对象概述

Kubernetes 通过声明式 API 管理资源对象,以下是与节点扩容和容器运行时状态同步最相关的核心对象:

资源对象 API 版本 作用与故障关联
Node v1 代表集群节点。节点状态(Ready/NotReady)直接反映 kubelet 与容器运行时的健康度
Pod v1 最小调度单元。Pod 状态(Pending/Running/CrashLoopBackOff)反映容器运行时创建或运行失败
Namespace v1 资源隔离边界。准入控制可基于 Namespace 实施策略
Service v1 Pod 访问抽象层。节点扩容后,kube-proxy 需同步更新 Endpoint
ConfigMap / Secret v1 配置与敏感数据注入。容器运行时需从 apiserver 拉取这些资源
PersistentVolumeClaim v1 存储卷声明。节点扩容时,存储卷挂载失败会导致 Pod 无法启动

2.4 资源对象之间的依赖关系

理解资源对象之间的依赖链,有助于快速定位状态同步故障的根因:

  1. 节点注册链: kubelet 启动 → 向 apiserver 创建 Node 对象 → 节点加入集群 → 调度器开始分配 Pod。
  2. Pod 调度链: 用户创建 Deployment → ReplicaSet 创建 Pod → 调度器绑定节点 → kubelet 调用容器运行时创建容器。
  3. 网络连通链: Pod 创建 → CNI 插件分配 IP → kube-proxy 更新 Service 规则 → 流量可达。
  4. 存储挂载链: Pod 引用 PVC → 存储插件挂载卷 → 容器运行时将卷映射到容器内。
常见故障模式: 节点扩容时,如果容器运行时状态同步失败,通常表现为 kubelet 无法通过 CRI 接口获取容器列表,导致 Node 状态变为 NotReady,进而影响调度器将新 Pod 分配到该节点。此时应优先检查容器运行时服务状态和 CRI 通信链路。
核心资源对象依赖关系(节点扩容场景) Node Pod 容器运行时 Service ConfigMap/Secret PersistentVolumeClaim 节点扩容时,kubelet 需同步 Node 状态 → 创建 Pod → 调用容器运行时 同时依赖 Service 网络规则、ConfigMap/Secret 配置注入、PVC 存储挂载

2.5 关键交互流程:节点加入集群

当新节点加入集群时,以下步骤必须全部成功,容器运行时状态才能正常同步:

1. kubelet 启动,读取节点配置(kubeconfig、节点名称、容器运行时端点)
2. kubelet 向 kube-apiserver 发送 Node 注册请求(POST /api/v1/nodes)
3. apiserver 执行准入控制链(认证 → 授权 → AdmissionWebhook → 资源配额校验)
4. 准入通过后,Node 对象写入 etcd,节点状态初始为 NotReady
5. kubelet 通过 CRI 接口连接容器运行时(默认 unix:///run/containerd/containerd.sock)
6. kubelet 定期上报节点状态(心跳),包含容器运行时健康信息
7. 调度器检测到 Ready 节点,开始将待调度 Pod 分配到该节点
8. kubelet 接收 Pod 绑定,通过 CRI 调用容器运行时创建容器
故障排查切入点: 如果步骤 5 或步骤 6 失败(容器运行时无法连接或状态异常),Node 将长期处于 NotReady 状态。此时应使用 crictl info 或 systemctl status containerd 检查容器运行时状态,并查看 kubelet 日志中的 CRI 错误信息。