健康检查、滚动更新与资源限制
High Contrast
Dark Mode
Light Mode
Sepia
Forest
1 min read211 words

健康检查、滚动更新与资源限制

K8s 的自愈能力依赖于两件事:知道 Pod 是否健康(健康检查)和知道如何安全地替换 Pod(滚动更新)。不配置这两项就等于无法真正利用 K8s 的核心优势。

三种探针的用途

graph LR subgraph Probes ["K8s 探针(Probes)"] LP["Liveness Probe\n存活探针\n失败 → 重启容器"] RP["Readiness Probe\n就绪探针\n失败 → 从 Service 摘除"] SP["Startup Probe\n启动探针\n慢启动应用保护\n通过后才开始 LP/RP"] end START["容器启动"] --> SP SP -->|通过| LIVE["运行中\nLP + RP 持续检测"] SP -->|超时失败| KILL1["容器被杀 → 重启"] LIVE -->|LP 失败| KILL2["容器被杀 → 重启"] LIVE -->|RP 失败| DETACH["从 Service 摘除\n(不重启,等待恢复)"]

完整探针 + 资源限制配置

# 带探针和资源限制的生产级 Deployment 示例
containers:
- name: myapp
image: myapp:1.2.0
# 资源请求与限制
resources:
requests:       # Scheduler 用来决定放哪个节点
memory: "128Mi"
cpu: "100m"   # 100m = 0.1 个 CPU 核
limits:         # 超出则被 OOM Kill / throttle
memory: "256Mi"
cpu: "500m"
# 启动探针(给启动慢的应用用,Spring Boot / JVM 应用)
startupProbe:
httpGet:
path: /health
port: 8080
failureThreshold: 30   # 最多 30 × 10s = 5 分钟等待启动
periodSeconds: 10
# 存活探针(检测死锁、内存泄漏)
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 10
periodSeconds: 15
failureThreshold: 3     # 连失败 3 次才重启
# 就绪探针(检测是否可以接收流量)
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
failureThreshold: 2     # 失败 2 次则从 Service 摘除

滚动更新策略配置

# Deployment 的更新策略
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1       # 更新期间最多额外多几个 Pod(不影响 replicas)
maxUnavailable: 0 # 更新期间最少保证可用 Pod 数 = 0 个不可用
# 上面配置含义:先起 1 个新 Pod,等就绪后再杀 1 个旧 Pod(零停机)
# 触发滚动更新(更新镜像)
kubectl set image deploy/myapp myapp=myapp:1.3.0 -n production
# 查看更新进度
kubectl rollout status deploy/myapp -n production
# 查看历史版本(需要 --record 或使用 annotations)
kubectl rollout history deploy/myapp -n production
# 回滚到上一个版本
kubectl rollout undo deploy/myapp -n production
# 回滚到指定版本
kubectl rollout undo deploy/myapp --to-revision=2 -n production

水平自动扩容(HPA)

# 根据 CPU 使用率自动扩缩 Pod 数量
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60   # CPU 均值超过 60% 则扩容
# 查看 HPA 状态(当前副本数和利用率)
kubectl get hpa -n production

本节执行清单

下一章:可观测性体系 — Prometheus 与 Grafana