2. Kubernetes 核心编排概念回顾
在深入 SLO 自愈剧本与 Kubernetes 联动之前,必须重新校准五个核心编排原语:Pod(最小调度单元)、Deployment(声明式更新)、Service(网络抽象)、HPA(弹性伸缩)以及 Operator 模式(领域知识编码)。这些概念是自愈剧本的“执行细胞”。
2.1 Pod:不可变的最小原子
Pod 是 Kubernetes 中可创建和部署的最小计算单元,一个 Pod 代表集群上正在运行的一个进程。关键设计原则:
- 共享网络与存储:同一 Pod 内的容器共享 IP、端口空间和 Volume。
- Sidecar 模式:通过同 Pod 多容器实现日志收集、代理、健康检查等辅助功能。
- 不可变性:Pod 一旦创建,其 spec 不可原地修改(除少数字段);更新必须通过重建或 Deployment 滚动。
💡 SRE 视角: Pod 的
restartPolicy 和 livenessProbe 是自愈的第一道防线。当 Pod 内进程崩溃或挂起,kubelet 自动重启容器,无需上层编排介入。
2.2 Deployment:声明式滚动与回滚
Deployment 为 Pod 和 ReplicaSet 提供声明式更新能力。它不直接管理 Pod,而是通过 ReplicaSet 控制 Pod 副本数。核心字段与行为:
| 字段 / 策略 | 说明 | 自愈关联 |
|---|---|---|
replicas |
期望运行的 Pod 副本数 | 自愈剧本的“期望状态”基准 |
strategy.type |
RollingUpdate(默认)或 Recreate |
滚动更新期间可维持服务不中断 |
minReadySeconds |
Pod 就绪后等待时间再标记可用 | 防止抖动,配合自愈冷却期 |
revisionHistoryLimit |
保留的历史 ReplicaSet 数量 | 支持快速回滚到已知健康版本 |
# 典型 Deployment 定义片段
apiVersion: apps/v1
kind: Deployment
metadata:
name: slo-app
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
spec:
containers:
- name: app
image: myapp:v1.2.3
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
2.3 Service:稳定的网络端点抽象
Service 为一组动态变化的 Pod 提供稳定的虚拟 IP(ClusterIP)和 DNS 名称。自愈剧本中,Service 是流量入口与健康检查的目标。
- ClusterIP:集群内虚拟 IP,默认类型。
- NodePort:在每个节点上开放静态端口,外部流量可访问。
- LoadBalancer:云厂商 LB 集成,自动分配公网入口。
- Headless Service:无 ClusterIP,直接返回 Pod IP 列表,用于 StatefulSet 或自定义发现。
📌 自愈联动: Service 的
selector 与 Pod 标签匹配。当自愈剧本替换 Pod 时,新 Pod 只要携带正确标签,Service 自动将流量引入,无需手动干预。
2.4 HPA:基于指标的弹性伸缩
Horizontal Pod Autoscaler(HPA)根据 CPU、内存或自定义指标(如 QPS、延迟)自动调整 Deployment 或 StatefulSet 的副本数。这是 SLO 自愈中“容量恢复”的核心执行器。
# 基于 CPU 和自定义 QPS 指标的 HPA 示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: slo-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: slo-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 500
⚠️ 常见陷阱: HPA 默认每 15 秒采集一次指标,但缩放决策有 3-5 分钟冷却窗口。自愈剧本需要将 HPA 的伸缩延迟纳入 SLO 响应时间预算(SLO burn budget)中,避免误判。
2.5 Operator 模式:领域知识编码为控制器
Operator 将运维人员的领域知识(备份、扩缩容、故障恢复)编码为 Kubernetes 控制器,通过 CRD(Custom Resource Definition)扩展 API。自愈剧本通常以 Operator 形式实现,监听 SLO 指标并执行恢复动作。
Operator 的核心工作循环(Reconciliation Loop):
- Observe:通过 Informer 监听 CR 和关联资源状态。
- Analyze:对比当前状态与期望状态(如 SLO 阈值)。
- Act:调用 Kubernetes API 执行修复(滚动更新、扩容、重启等)。
2.6 概念对比与自愈角色
| 概念 | 抽象层级 | 自愈中的角色 | 关键 API |
|---|---|---|---|
| Pod | 工作负载单元 | 自愈目标(重启、替换) | PodSpec, Container |
| Deployment | 工作负载控制器 | 期望状态维护、滚动回滚 | apps/v1 |
| Service | 网络抽象 | 流量路由、端点健康 | core/v1 |
| HPA | 弹性控制器 | 容量自愈、突发应对 | autoscaling/v2 |
| Operator | 应用控制器 | 领域自愈逻辑编码 | CRD + controller-runtime |