Kubernetes 架构:组件、控制流程与故障边界

梳理 API Server、etcd、Scheduler、Controller 和 kubelet 的职责,解释 Pod 的启动流程、调度与准入边界,以及不同故障应查看的证据。

行业洞见 最佳实践
Kubernetes 架构:组件、控制流程与故障边界

Kubernetes 架构由管理集群状态的控制平面,以及运行容器化工作负载的工作节点组成。用户通过 API 提交期望状态,API Server 处理请求,controller、scheduler 和 kubelet 根据 API 中的状态履行各自职责;容器运行时则执行 kubelet 发来的 CRI 请求。它并不是一台“主服务器”按固定顺序指挥所有组件的流水线。

本文解释组件分工、从 API 到 Pod 的控制过程,以及怎样区分不同故障边界。依据是 Kubernetes 官方文档,不是对特定云服务内部网络的实测。文章由观测云编辑部编写;观测云的产品文档仅用于说明采集路径,不能代替 Kubernetes 机制证据。文中的三个实验方案均未执行,没有实测输出或恢复时间。

若还不熟悉 Pod、声明式管理以及 Kubernetes 的适用条件,可以先看 Kubernetes 是什么。

逻辑架构不等于物理拓扑

官方组件文档将集群描述为控制平面与一个或多个工作节点。自建集群可能由团队管理各组件的部署、升级及恢复;托管服务则由供应商承担其中一部分。组件可以共用机器,也可以跨机器或可用区分布。

网络、存储和云资源的连接方式取决于插件及部署形式。因此,本文讨论的是逻辑职责,不把一个概念图当作所有 EKS、GKE、AKS 或私有集群的唯一物理路径。责任分界仍应以实际服务文档和合同为准。

控制平面:保存意图并持续协调

组件 职责 首先检查的证据 单凭这些证据不能确定什么
kube-apiserver 提供 Kubernetes HTTP API API 响应、认证授权错误、日志及指标 延迟究竟来自 etcd、网络、准入还是客户端
etcd 一致性键值存储,保存 API Server 使用的数据 健康状态、日志、指标及 API 症状 业务代码或用户请求的错误原因
kube-controller-manager 运行多个控制器,使实际状态接近期望状态 对象 spec/status、事件及控制器信号 协调失败的最终原因或业务结果
kube-scheduler 为尚未绑定节点的 Pod 选择节点 PodScheduled 条件、事件及调度器日志 选中节点后镜像能否拉取、应用能否正常运行
cloud-controller-manager 将云特定控制逻辑与 Kubernetes 核心组件分离 云资源状态及相应控制器信号 所有集群都存在此组件或使用同一实现

API Server 是共享状态的入口,不是完成所有任务的中央执行器。控制器反复观察状态并请求变更,调度器和 kubelet 也通过 API 独立工作。不能将这一过程理解成一个长同步函数。

etcd 也不是任何应用或组件都可以直接读写的通用业务数据库。访问权限、备份和恢复,应围绕其保存集群 API 状态的职责单独设计。

工作节点:把 Pod 声明变成容器执行

组件或边界 作用 条件与例外 首批证据
kubelet 管理分配到本节点的 PodSpec,并执行配置的探针 不负责节点上任意非 Kubernetes 容器 Pod 条件、事件、kubelet 日志及指标
容器运行时 处理镜像和容器执行生命周期 需要 CRI 兼容;Docker Engine 需要 cri-dockerd 等适配器 运行时日志、镜像拉取结果、kubelet 症状
kube-proxy 或替代网络实现 实现 Service 规则与流量路径 部分网络插件可替代 kube-proxy Service、EndpointSlice、数据路径及网络检查
Pod 一个或多个共享上下文的容器组成的最小可部署单元 临时实体,通常由工作负载控制器管理 Pod 配置、状态、容器状态及探针

容器运行时文档说明了 CRI 边界。Docker Engine 本身不实现 CRI,内置 dockershim 已于 Kubernetes v1.24 移除。不要把某一种运行时或 socket 路径当作所有版本的永久默认值。

kubelet 只执行已经配置的探针。readiness 成功不代表数据一致性、外部依赖和整条用户旅程都正确;没有配置应用探针时,Ready 更不能证明已经执行过业务检查。

从 API 请求到运行中的 Pod

下面是提交 Deployment 后的概念过程,各组件的重试与协调可以异步发生,不是网络包的精确顺序。

  1. 客户端通过 kubectl 或 API 提交工作负载声明,API Server 处理请求。
  2. 被接受的 API 状态保存在 etcd;不是客户端绕过 API 直接写 etcd。
  3. 工作负载控制器观察期望和实际状态,按需调整 ReplicaSet 与 Pod 对象。
  4. 调度器发现尚未分配节点的 Pod,根据资源请求、约束、策略和可用节点选择放置位置。
  5. 目标节点的 kubelet 观察分配给自己的 Pod,通过 CRI 请求运行时准备并运行容器。
  6. kubelet 更新容器状态及 Pod 条件,执行探针;其他组件和用户继续通过 API 观察状态。
客户端 → kube-apiserver ↔ etcd(API 状态)
                 ↑
       ┌─────────┼──────────┐
       │         │          │
   controller scheduler   kubelet
   观察/写入   观察/绑定    观察分配的 Pod/更新状态
                            │
                            ▼
                   CRI 兼容运行时 → 容器

这是一幅根据官方机制整理的逻辑图,不是实验抓包结果。排障时应把对象变化、事件、组件日志、指标及执行层证据放到同一时间轴,不能只凭一次 status 截图就认定某个组件有问题。

工作负载与访问路径要分层看

Deployment通过 ReplicaSet 管理 Pod 的声明式更新;三个名字不是同一个对象的不同叫法。Service提供访问抽象,EndpointSlice则表示后端端点及其条件。

层次 检查对象或信号 能回答的问题 还需要其他证据的问题
Deployment 更新状态、条件、ReplicaSet 目标版本和副本替换是否推进 每次业务请求是否成功
Pod phase、条件、容器状态、探针 执行或准备是否出错 Service 和外部依赖是否正常
Service / EndpointSlice selector、端口、地址和端点条件 是否存在候选后端、是否可参与路由 后端业务响应是否正确
网络 / DNS 名称解析、连通性和数据路径 请求能否到达后端 应用计算是否正确
应用 / 用户 日志、链路、请求结果、SLO、RUM 实际服务和用户旅程受到什么影响 控制平面哪个组件是最终原因

有 endpoint 不等于请求成功,应用出现 5xx 也不等于控制平面故障。对象身份与时间必须对应,才能逐层验证假设。

通信与安全边界

控制平面与节点通信文档区分了节点访问 API,以及 API Server 访问 kubelet、Pod 或 Service 的路径。

  • kubelet 和使用 Kubernetes API 的节点组件与 API Server 通信,需要认证、授权及传输保护。
  • 容器运行时通常通过本地 CRI 接收 kubelet 请求,不能据此认为运行时直接 watch Kubernetes API。
  • 登录成功不等于拥有所有对象权限;认证和授权需要分别检查。
  • kubelet API、API Server 到节点的路径、隧道及云供应商连接方式,随部署而变。
  • 端口、证书、ServiceAccount、网络策略及加固步骤,应使用目标版本的官方配置文档。

任何实验记录都应控制原始凭证的访问,并在公开前去除 kubeconfig、token、证书私钥、客户数据及内部地址。本篇不要求把这些资料复制到文章或截图中。

高可用和故障域不是一回事

多个控制平面实例,不会自动让业务具备高可用。kubeadm 高可用拓扑讨论堆叠与外置 etcd;多可用区文档讨论副本如何跨故障域分布。需要分别检查:

故障边界 可能症状 首批证据 需要单独设计的内容
API Server / 控制平面 API 不可用、延迟、认证错误或协调停滞 API 响应及组件信号 拓扑、负载均衡、etcd 保护与恢复
etcd API 状态读写异常 etcd 与 API Server 的关联症状 仲裁、备份、恢复、访问控制
节点 / 运行时 镜像拉取或容器执行失败 Node/Pod 条件、事件和节点日志 容量、镜像仓库、运行时和宿主机
调度约束 已创建 Pod 尚未绑定节点 spec.nodeName、PodScheduled 和调度事件 requests、affinity、taint/toleration、节点容量
ResourceQuota / 准入 创建或更新被拒绝,新 Pod 可能不存在 API 错误、ReplicaSet FailedCreate、namespace 配额 配额、资源请求及准入政策
可用区 / 网络 / 存储 一组节点、卷或访问路径受影响 按拓扑关联的对象与网络、存储证据 副本分布、存储恢复及依赖布局
应用 5xx、延迟、错误结果 应用日志、链路、SLO、用户检查 冗余、数据一致性、依赖及回滚

Pending 不只意味着等待调度,也包括节点已经分配后的镜像下载及容器准备。ResourceQuota超额则可能让 API 以 403 Forbidden 拒绝创建,连待调度 Pod 都没有。两种情况的检查入口不同。

这张表是调查起点,不是自动根因树。同一症状可以跨多个边界出现;恢复时间和可用性承诺还需要合同或固定环境的测试支持。

用可观测性连接这些层次

官方可观测性文档说明了指标、日志及链路的作用;集中日志也需要在容器生命周期之外设计收集与保留。

调查时先固定时间、集群、namespace、工作负载、Pod UID 与节点,然后读取对象状态和 owner 关系,寻找协调差异。事件可以提示调度、拉镜像或探针变化,但不是单独的根因证明。再用相应组件的日志与指标缩小范围,最后检查应用请求和用户结果是否随修复恢复。

观测云的 Kubernetes 集成、Prometheus 自动发现及 ServiceMonitor / PodMonitor 支持字段可作为采集配置入口。它们说明产品公开支持的路径,具体权限、版本、字段映射及限制仍须在目标环境验证,不能视作任意集群都已实测通过。

三个尚未执行的故障实验

实验旨在区分故障边界,不用于比较供应商性能,也不能证明观测云自动定位了原因。三个方案都没有执行结果、截图或耗时记录。

执行前的共同条件

使用一次性的非生产 kind 或同类集群,固定 Kubernetes 补丁版本、kind、运行时、CNI、宿主机系统与架构。对工作负载镜像的来源和 digest、清单、资源限制与探针做版本管理。保存命令、原始输出、退出码、时间、对象 YAML、事件、组件证据及清理结果;公开副本应脱敏,再由另一位工程师复现。

实验一:调度边界

计划提交要求不存在节点标签或无法满足约束的 Pod,收集 phase、条件、调度事件和可选节点信息。修正后再次观察绑定。要区分“还未选中节点”和“已选中节点但执行失败”。本文没有实际观察 Pending 状态、具体事件或绑定耗时。

实验二:节点与运行时边界

计划使用不存在的镜像 digest 或 tag,收集容器状态、事件、kubelet、运行时及仓库请求证据,再恢复已知可用镜像。已完成调度不意味着已经拉取并运行镜像。本文没有实测 ErrImagePull、ImagePullBackOff 或其他具体状态。

实验三:readiness 与 EndpointSlice 边界

计划部署固定失败的 readiness probe 与 Service,随后修正探针。记录 Pod Ready 条件、探针结果、selector、EndpointSlice 地址及 ready、serving、terminating,同时记录 Service 的 publishNotReadyAddresses 与实际请求。

容器运行、Pod 就绪、地址存在、流量资格及业务响应是五种不同事实。未就绪 Pod 可以留在 EndpointSlice,开启 publishNotReadyAddresses 时端点还可能被标记为 ready。本文没有测得端点变化顺序或恢复时间。

在原始输出与第二次复现记录齐备前,这些实验只能作为待执行方法,不能改写为“已测”“已验证”或某产品的优势证明。官方文档支持机制解释,实验只能支持特定环境中实际观察到的结果。

继续学习与实施

定义和适用边界见 Kubernetes 是什么。深入配置应使用当前官方的架构、组件及目标版本的安装、安全文档。

若要评估观测云在生产环境中的监控路径,可以参考Kubernetes 监控方案,再以一个测试集群验证对象、指标、日志、权限与缺失数据。产品说明和概念解释都不能替代这一步。

一次资料

2026 年 10 月 27 日按官方文档复核技术机制,未执行上述实验。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台