Kubernetes 是什么:从控制循环理解容器编排
从期望状态和控制循环理解 Kubernetes,分清控制平面、节点、Pod 与 Service,判断平台能自动化什么、团队仍需验证什么。
Kubernetes 是管理容器化工作负载和服务的开源平台。你声明希望使用的应用镜像、副本数量和访问方式,Kubernetes 的控制组件持续观察集群,让实际状态接近期望状态。容器运行应用,Kubernetes 则管理应用周围的部署、调度和更新过程。
理解这层分工,比记住组件名称更重要。Kubernetes 可以调度 Pod、替换失败的工作负载实例、协调滚动更新,并通过 Service 为不断变化的 Pod 提供访问抽象;它不会替你构建源代码,也不能保证订单金额正确、所有网络和存储故障都能自动恢复。它同样不指定唯一的日志或监控后端。官方概述同时说明了这些能力与边界。
本文面向需要理解控制循环、选择工作负载类型或判断是否采用 Kubernetes 的工程师。文章由观测云编辑部依据官方文档编写,决策表和排障顺序是编辑整理的方法,不是 Kubernetes 项目的官方采用标准。下文的故障实验尚未执行,没有实测恢复时间或产品性能结论。
先分清四件事
- 镜像、容器和 Pod 不同。 镜像封装应用及依赖,容器是基于镜像运行的实例。Pod 是 Kubernetes 创建和管理的最小可部署计算单元,可以包含一个或多个紧密协作、共享网络与存储上下文的容器。
- 期望状态不等于业务正确。 控制器可以按声明维持三个 Pod,却不能据此证明支付、权限判断或数据库写入正确。
- 自愈有条件。 重启和替换受策略、健康检查及资源条件约束。不断重启并不能修好代码缺陷。
- Service 不是可用性证明。 稳定的访问入口仍需要可用后端、有效路由、健康依赖和正确的应用响应。
从控制循环理解 Kubernetes
Kubernetes API 中的对象表达运行意图。对于同时包含这两个字段的对象,spec 描述期望状态,status 记录组件报告的实际状态。控制组件持续处理二者的差异,具体语义见对象模型。
用户或自动化声明期望状态
↓
Kubernetes API 对象(spec)
↓
控制器观察并调整实际状态
↓
工作负载控制器按需创建或替换 Pod
↓
调度器为尚未分配 Node 的 Pod 选择节点
↓
kubelet 通过容器运行时运行容器
↓
status、条件和事件反映当前进展
└────────→ 继续协调
应用和用户结果 → 指标、日志、链路与请求检查
→ 团队修正代码、配置、策略或声明
上半部分是平台协调过程,下半部分是团队判断业务是否正确的证据路径。它们相关,但不是同一件事。图中箭头表示逻辑关系,不是所有网络调用的固定时序。
例如,一个 Deployment 声明 replicas: 3,当前只有两个符合要求的 Pod,控制器可以创建第三个。若新 Pod 拉不到镜像,期望副本数仍是三个,但可用副本可能不足。Kubernetes 会暴露差异,不会替你猜测正确的镜像地址。
这些组件独立地重复协调,而不是中央程序依次执行完一串步骤就结束。如果声明本身有误,反复重试也需要团队修改声明才能解决。
控制平面、节点和 Pod
官方组件文档将集群分为控制平面和工作节点。实际部署位置及托管责任可能不同,但组件职责可以这样理解。
| 组件或层次 | 主要职责 | 不能据此证明什么 |
|---|---|---|
| API Server | 提供创建、读取和修改对象的 Kubernetes HTTP API | 被接受的配置一定安全、应用结果一定正确 |
| etcd | 保存 API Server 使用的数据 | 应用业务数据已经备份或可恢复 |
| Scheduler | 为尚未分配节点的 Pod 选择合适节点 | 应用未来有足够资源或能满足延迟目标 |
| Controller Manager | 运行控制器,协调期望与实际状态 | 对象状态正常就代表业务成功 |
| kubelet | 在节点上管理已分配 Pod 的容器执行 | 运行中的进程已经就绪或业务正确 |
| 容器运行时 | 在节点上运行容器 | 镜像可信、应用配置正确 |
| 网络和存储实现 | 提供具体环境的连通性和持久化机制 | 路由、权限、卷、备份及恢复目标都已验证 |
Pod 中的容器共同调度到同一节点。Pod 本身是临时实体;需要替换时,控制器通常创建新的 Pod,而不是把同一个 Pod 身份搬到另一台机器。详见 Pod 生命周期。
托管 Kubernetes 可以转移部分控制平面运维工作,但工作负载、身份权限、网络策略、数据保护、遥测和事故响应的责任仍需按具体服务与合同划分。
按生命周期选择工作负载
工作负载资源的差异,主要在于身份、完成条件和运行方式。
| 资源 | 适用需求 | 平台管理的状态 | 仍需自己保证的条件 |
|---|---|---|---|
| Deployment | 副本可互换、通常无状态的服务 | Pod 模板、副本、滚动更新与历史 | 应用无状态、数据库变更兼容性 |
| StatefulSet | 稳定身份、顺序或持久卷关联 | Pod 序号身份及更新、扩缩容行为 | 数据复制、备份、仲裁安全和灾难恢复 |
| DaemonSet | 每个符合条件的节点运行本地组件 | 每个目标节点上的 Pod | Agent 能连上后端、数据没有丢失 |
| Job | 执行到完成的任务 | 声明的成功次数、并行与重试策略 | 进程成功退出时业务结果也正确 |
数据库放进 StatefulSet,不代表已经有备份;Agent 的 DaemonSet 显示可用,也不代表数据已经到达存储。先明确身份、数据、放置和失败要求,再选资源类型。
Service 放在哪一层
Service描述一组逻辑后端及访问策略,后端通常是 Pod。Pod 地址随替换变化,客户端仍可以通过 Service 访问。
排查访问失败时,需要同时核对 selector、Pod 标签、EndpointSlice、readiness、端口和网络路径。Service 存在不能证明 DNS、网络策略、负载均衡、TLS、数据库或外部 API 都正常,更不能证明 HTTP 200 中的业务内容正确。
还要区分“EndpointSlice 有地址”和“后端可以接收普通流量”。未就绪的 Pod 仍可能出现在 EndpointSlice;ready、serving、terminating 是不同条件,publishNotReadyAddresses: true 还会影响 ready 的表示。具体依据见 EndpointSlice 文档。
平台自动化之后,团队还要负责什么
| 领域 | Kubernetes 提供的机制 | 团队需要设计和验证 |
|---|---|---|
| 调度 | 按资源请求、限制条件及节点选择放置位置 | 容量、拓扑、资源请求和无可用节点时的行为 |
| 副本 | 创建替代实例、维持声明数量 | 副本是否足够、状态是否安全、替换后服务是否恢复 |
| 更新 | 协调新旧 Pod 模板的切换 | readiness、数据库兼容性、回滚和业务验证 |
| 自愈 | 按策略重启容器、替换 Pod、调整路由候选 | 代码缺陷、持久化故障、数据损坏及外部依赖 |
| Service | 将客户端与后端地址变化隔离 | DNS、网络实现、加密、策略及端到端可达性 |
| 扩缩容 | 在配置的信号和策略下调整容量 | SLO、指标质量、最小容量、时延、成本及缩容安全 |
| 扩展 | 自定义资源、控制器和准入逻辑 | 版本兼容、供应链、权限、故障隔离及维护责任 |
| 可观测性 | 暴露组件信号与对象状态 | 收集、脱敏、保留、关联、告警及响应 |
自愈文档说明了重启策略、工作负载替换及存储恢复的边界。Deployment 文档也明确:更新停滞时平台报告状态,不能假定它必然自动回滚代码和数据。
平台收敛与业务成功要分别验证
下面是用于说明边界的假设,不是实测结果。
| 观察到的状态 | 可以说明什么 | 还不能说明什么 |
|---|---|---|
| 三个 Pod 都 Ready | 容器就绪及已配置的 readiness gate 条件满足 | 一定配置了应用探针、订单结果正确或依赖数据新鲜 |
| Deployment 更新完成 | 更新条件已经达到 | 数据库变更兼容、错误率和延迟达标 |
| Service 有 ready endpoint | 条件和 Service 设置产生了路由候选 | DNS、策略、TLS、网络及响应内容都正确 |
| 容器重启 | 重启机制按策略执行了 | 原因已消除或不会再次崩溃 |
| 副本增多 | 目标容量发生了变化 | 瓶颈不是数据库、锁或错误的扩容信号 |
因此,一次恢复确认至少需要平台证据与业务结果两部分。前者包括 spec、status、条件、事件和 EndpointSlice,后者包括真实请求、业务不变量、日志、链路、应用指标或用户体验。
一个尚未执行的故障实验
这个实验计划用于观察:错误镜像声明怎样造成期望与实际状态的差异,恢复原镜像后平台及请求结果如何变化。本文没有运行或独立复现此实验,没有可报告的输出或恢复时间。
执行前应使用隔离的非生产集群,并记录 Kubernetes 精确补丁版本、kind 或同类工具版本、运行时、宿主机系统及架构。所有镜像使用不可变 digest,副本数和更新策略显式写入清单,保存清单校验值、时间与命令版本。公开记录不得包含凭证、kubeconfig、客户标识或内部地址。
实验步骤如下,不能将预期当作结果:
- 在隔离 namespace 中部署一个最小应用及 ClusterIP Service,用已核对的镜像 digest,并定义包含预期响应内容的请求检查。
- 保存健康基线:清单、Deployment 状态、Pod 条件、Service 与 EndpointSlice、事件、更新状态、应用响应和退出码。
- 仅将 Deployment 镜像改为故意不可用的测试引用,不同时改动探针、副本、selector 或 Service。
- 记录替代 Pod 无法就绪时的 Deployment、ReplicaSet、Pod 状态与事件,以及实际请求结果。
- 恢复原镜像 digest,再记录就绪状态、EndpointSlice 与请求结果。不要预先认定请求必然中断,旧的 Ready Pod 可能仍在服务。
- 删除实验 namespace,确认集群中没有残留资源或临时凭证;需要保留的脱敏证据单独存放。
常见的工作假设是出现 ErrImagePull 或 ImagePullBackOff,但仓库策略、缓存、准入规则、运行时和 Kubernetes 版本会影响具体表现,必须以实际记录为准。
以下是拟使用的只读采集命令,<recorded-pod-name> 需替换为当次记录的 Pod 名称:
kubectl -n k8s-definition-lab get deployment,replicaset,pod,service,endpointslice -o wide
kubectl -n k8s-definition-lab describe deployment demo
kubectl -n k8s-definition-lab describe pod <recorded-pod-name>
kubectl -n k8s-definition-lab get events --sort-by=.metadata.creationTimestamp
kubectl -n k8s-definition-lab rollout status deployment/demo --timeout=120s
这些命令不能证明业务正确。实验还需要实际请求及预期响应、脱敏原始输出,并由第二位工程师按相同输入复现。若结果不同于假设,应报告差异。
为什么仍然需要可观测性
官方可观测性文档把组件与应用的指标、日志和链路作为理解系统状态的证据。组件能输出信号,不等于集群已经统一存储、保留和关联它们。
排障时可以分三层:集群和节点证据用于判断平台是否具备运行条件;对象和工作负载证据用于定位协调在哪里受阻;应用和用户证据用于确认服务实际是否正确。Kubernetes 组件可以暴露 Prometheus 格式的指标,kube-state-metrics 提供对象状态信息,但端点权限、稳定性、采集与保留仍须配置。需要集中历史日志时,也必须将日志保存到容器生命周期之外。
| 症状 | 第一批证据 | 下一步 |
|---|---|---|
| Pod 一直 Pending | spec.nodeName、Pod 条件、容器状态及事件 |
未绑定时查调度;已绑定时查镜像、运行时与容器准备 |
| 容器不断重启 | 当前与上次状态、重启次数、事件 | 查上次日志、探针、资源压力和依赖 |
| 更新不完成 | Deployment 条件、新旧 ReplicaSet、Pod | 查镜像、准入、调度、readiness 和配额 |
| Service 没有可用后端 | selector、Pod 标签、EndpointSlice 地址及条件 | 分清地址不存在和存在但未就绪,再查端口及监听 |
| 有后端但请求失败 | 端到端请求与应用日志、链路 | 查 DNS、策略、代理、TLS 及下游依赖 |
| Pod Ready 但用户仍慢 | 请求延迟、链路、依赖指标 | 查代码、队列、数据库、饱和度和最近变更 |
Pending 包括等待调度和调度后的镜像下载,不能直接归因于 scheduler。关联三层证据时,应保留集群、namespace、工作负载、Pod、容器、服务、环境、版本和 trace 上下文;不要为了关联而采集凭证、个人资料或无限增长的用户标识。
是否值得采用 Kubernetes
下面是条件式决策表,不是打分排名。安全、数据恢复或责任归属的缺口,不能用其他项目的几个“是”抵消。
| 问题 | 应收集的证据 | 适合继续试点的条件 | 应暂停或比较简单方案的条件 |
|---|---|---|---|
| 要解决什么问题 | 部署、扩容、恢复及发布失败记录 | 确有多工作负载、更新、放置或统一策略需求 | 只是运行一个现有托管服务已能承担的简单应用 |
| 生命周期是否匹配 | 无状态、有状态、批处理、身份和依赖 | 能对应合适控制器及失败策略 | 尚未定义数据和恢复方式就先选平台 |
| 谁负责运行 | 升级、节点、插件、权限、事故和容量负责人 | 维护时间及升级责任明确 | 希望引入后运维工作自动消失 |
| 怎样验证正确 | readiness、SLO、请求和数据不变量 | 平台与业务结果都能验证 | 只看 Pod Running |
| 数据如何恢复 | 备份、恢复测试、复制、RPO/RTO | 控制器之外的恢复已演练 | 把 StatefulSet 或持久卷当作备份 |
| 网络和安全是否清楚 | RBAC、准入、密钥、网络及镜像信任 | 各项控制能在上线前验证 | 权限、边界和数据路径尚不明确 |
| 能否排查 | 信号清单、关联键、保留和演练记录 | 能从用户症状追到平台与应用证据 | 数据很多但无法共同支持调查 |
| 托管方负责什么 | 服务范围、版本政策、可用性及支持条款 | 责任转移确实减少团队负担 | 未读合同就认为一切由供应商负责 |
| 如何退出 | 分阶段迁移、数据导出、并行与回滚方案 | 小规模试点可撤销 | 首个有效测试前就需要不可逆重构 |
当问题明确、资源模型合适、责任人到位,且关键安全与恢复条件可验证时,再推进有界原型。若只增加控制平面、网络、存储和升级负担,却没有解决实际问题,应比较更简单的容器或应用平台。
部署地点也是选型的一部分。应逐项核对实际区域、可用区、数据路径、流量费用、支持覆盖和跨境要求。其他地区的服务说明,不能直接证明目标地区的可用性或合同条件;这些需要在具体供应商评估中确认。
下一步
理解组件后,可以继续阅读官方的组件、工作负载及 Service 文档。
在观测云中实施采集时,先核对 Kubernetes 集成、Prometheus 自动发现与 ServiceMonitor / PodMonitor 支持字段。对象查看方式见容器基础设施文档。这些资料说明产品的配置路径,不是所有环境都已验证的证明。
需要评估商业监控方案时,再参考观测云 Kubernetes 监控,用自己的集群核对权限、标签、信号缺失、延迟和回滚。
资料依据
技术机制于 2026 年 10 月 27 日对照 Kubernetes 官方英文文档复核;本文是文档型指南,未运行上述实验。