跳到内容

7.2 Kubernetes:声明状态与控制循环

Kubernetes 的核心不是 YAML,而是 reconciliation:把 API 中声明的期望状态与集群当前状态持续比较并收敛。

控制面与节点

text
kubectl/client → API Server → etcd

          ┌─────────┴─────────┐
       Scheduler          Controllers

                         Kubelet on Node
  • API Server 是资源操作和认证授权入口;
  • etcd 保存控制面状态;
  • Scheduler 为未绑定 Pod 选择节点;
  • Controller 创建/删除对象使状态收敛;
  • Kubelet 让节点上的 Pod 接近声明规格。

控制器按观察到的状态工作,操作需要幂等并容忍缓存延迟。一次 API 成功不表示所有资源已经收敛。

Pod 是调度和共享边界

一个 Pod 内的容器共享网络 namespace 和 volume 生命周期,通常一起调度和终止。只有生命周期和资源命运确实绑定的辅助进程才放同一 Pod。

Pod 是可替换实例,不是永久服务器。不要依赖 Pod 名称、IP 或本地磁盘长期稳定。

Deployment 管理无状态副本

Deployment 通过 ReplicaSet 维持副本,并执行滚动更新。发布期间新旧版本并存,API、消息和数据库必须兼容。

maxUnavailablemaxSurge、readiness 和终止排空共同决定实际可用容量。只设置 replicas: 3 不能证明故障或发布时仍有 3 个可服务实例。

Service 提供稳定发现

Service 用 selector/EndpointSlice 关联 ready 后端,为调用方提供稳定虚拟地址和 DNS 名。Service 不保证应用成功,也不替代 deadline、重试和业务负载均衡。

无 selector、ExternalName、headless Service 等具有不同发现语义,应按真实协议选择。

三类 Probe 不可混用

  • startupProbe:应用是否完成慢启动;通过前可抑制其他探针;
  • readinessProbe:当前是否应该接流量;失败不一定重启;
  • livenessProbe:进程是否陷入只能重启恢复的状态。

把下游数据库短暂失败放进 liveness,可能让全部副本同时重启。探针要轻量、快速、有超时,不能成为新的高成本业务请求。

Requests、Limits 与调度

Scheduler 主要根据 requests 放置 Pod;limits 由运行时限制。requests 过低会过度装箱并在高峰争抢,过高会浪费容量或导致 Pending。

应用先通过负载测试得到每副本容量曲线,再配置资源和副本。CPU HPA 目标基于 requests 时,错误 requests 会让扩缩行为失真。

HPA 不是瞬时救火

扩容包含指标延迟、控制器决策、调度、拉镜像、启动和 readiness。突发流量可能在新副本可用前耗尽旧副本,因此仍需队列、并发限制、负载削减和预留容量。

缩容要设置稳定窗口,并让长任务可排空或迁移。对队列消费者,积压、处理速率和最老消息年龄通常比 CPU 更接近业务需求。

第 11 章会继续讲 NetworkPolicy、StatefulSet、存储与多租户生产治理。

参考资料

Built with VitePress | Software Systems Atlas