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。任何一个环节中断都会导致状态同步失败。
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 资源对象之间的依赖关系
理解资源对象之间的依赖链,有助于快速定位状态同步故障的根因:
- 节点注册链: kubelet 启动 → 向 apiserver 创建 Node 对象 → 节点加入集群 → 调度器开始分配 Pod。
- Pod 调度链: 用户创建 Deployment → ReplicaSet 创建 Pod → 调度器绑定节点 → kubelet 调用容器运行时创建容器。
- 网络连通链: Pod 创建 → CNI 插件分配 IP → kube-proxy 更新 Service 规则 → 流量可达。
- 存储挂载链: Pod 引用 PVC → 存储插件挂载卷 → 容器运行时将卷映射到容器内。
常见故障模式: 节点扩容时,如果容器运行时状态同步失败,通常表现为 kubelet 无法通过 CRI 接口获取容器列表,导致 Node 状态变为 NotReady,进而影响调度器将新 Pod 分配到该节点。此时应优先检查容器运行时服务状态和 CRI 通信链路。
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 错误信息。