3. Sidecar 生命周期管理:注入、版本与健康策略

Sidecar 代理(Envoy)的生命周期管理是 Istio 数据面稳定性的核心。本章从注入方式、版本控制、健康检查与重启策略三个维度,构建完整的 Sidecar 治理体系。

3.1 Sidecar 注入方式:手动与自动

Istio 支持两种 Sidecar 注入模式,适用于不同的集群治理阶段。手动注入用于 CI/CD 管道或离线部署,自动注入则用于运行时动态扩缩容场景。

对比维度 手动注入 自动注入
触发时机 部署前通过 istioctl kube-inject 修改 YAML Pod 创建时由 MutatingWebhook 拦截并注入
控制粒度 逐个 Deployment 控制,适合灰度升级 基于 Namespace Label 或 Pod Annotation 批量控制
版本一致性 需手动指定 Sidecar 镜像版本 由 istiod 统一下发,版本集中管理
回滚复杂度 重新生成 YAML 并 apply 修改注入 Label 或 Annotation 后重建 Pod
典型场景 金丝雀发布、离线环境、合规审计 生产集群日常扩缩容、自动弹性
最佳实践:在集群治理模板制品库中,建议将手动注入的 YAML 制品与自动注入的 Helm Values 分开存储。手动注入制品用于“基线版本”的固化,自动注入配置用于“运行时版本”的灵活调整。

3.1.1 手动注入操作示例

# 使用 istioctl 手动注入 Sidecar 到 Deployment
istioctl kube-inject -f deployment.yaml -o deployment-injected.yaml \
  --set values.global.proxy.image=proxyv2:1.20.3 \
  --set values.global.proxy.resources.requests.cpu=100m \
  --set values.global.proxy.resources.requests.memory=128Mi

# 应用注入后的 YAML
kubectl apply -f deployment-injected.yaml

3.1.2 自动注入配置示例

# 为 Namespace 启用自动注入
kubectl label namespace production istio-injection=enabled

# 或使用 revision 标签实现多控制面注入
kubectl label namespace production istio.io/rev=canary-1-20

# 在 Pod 级别覆盖注入行为(Annotation)
metadata:
  annotations:
    sidecar.istio.io/inject: "true"
    sidecar.istio.io/proxyImage: "proxyv2:1.20.3"
Sidecar 注入流程对比:手动 vs 自动 手动注入流程 ① 开发编写 Deployment YAML ② istioctl kube-inject 注入 Sidecar ③ 生成带 Sidecar 的完整 YAML ④ kubectl apply 部署到集群 自动注入流程 ① Namespace 打上注入 Label ② 创建 Pod(不包含 Sidecar) ③ MutatingWebhook 拦截请求 ④ istiod 注入 Sidecar 并创建 Pod 手动注入适合版本固化与离线部署;自动注入适合运行时弹性与大规模集群治理

3.2 Sidecar 版本管理

Sidecar 版本管理是集群升级治理的关键环节。在制品库联动场景下,需要同时管理 Sidecar 镜像版本、控制面版本与数据面版本的兼容性矩阵。

3.2.1 版本兼容性矩阵

Istio 控制面版本 兼容 Sidecar 版本范围 推荐 Sidecar 版本 备注
1.18.x 1.17.x – 1.19.x 1.18.6 LTS 基线版本
1.19.x 1.18.x – 1.20.x 1.19.5 支持 Ambient Mesh
1.20.x 1.19.x – 1.21.x 1.20.3 当前稳定版
1.21.x (canary) 1.20.x – 1.22.x 1.21.0 金丝雀控制面
版本偏差风险:当 Sidecar 版本与控制面版本偏差超过 2 个 minor 版本时,Envoy xDS 协议可能产生不兼容的配置字段,导致 Sidecar 启动失败或路由规则异常。建议在制品库中为每个控制面版本绑定对应的 Sidecar 镜像标签白名单。

3.2.2 制品库中的版本标签策略

# 制品库 Sidecar 镜像标签规范
# 格式:proxyv2:{istio版本}-{构建时间戳}-{commit短哈希}

# 示例标签
proxyv2:1.20.3-20240315-a1b2c3d   # 生产稳定版
proxyv2:1.20.3-20240316-e4f5g6h   # 热修复版
proxyv2:1.21.0-20240310-x7y8z9w   # 金丝雀版

# Helm Values 中引用 Sidecar 版本
global:
  proxy:
    image: proxyv2
    tag: "1.20.3-20240315-a1b2c3d"
    imagePullPolicy: IfNotPresent

3.3 Sidecar 健康检查与重启策略

Sidecar 的健康状态直接影响业务 Pod 的流量接管能力。Istio 提供了多层次的健康检查机制,并与 Kubernetes 原生重启策略协同工作。

3.3.1 健康检查层次

  • Liveness 探针:检测 Envoy 进程是否存活。默认通过 /healthz/ready 端点检查,超时 1s,失败阈值 3 次。
  • Readiness 探针:检测 Sidecar 是否就绪,包括 xDS 配置是否同步完成。Pod 的 Ready 状态依赖 Sidecar 和业务容器同时就绪。
  • Startup 探针:用于慢启动场景,在 Sidecar 首次启动时延长检测窗口,避免因配置加载慢导致误杀。

3.3.2 默认健康检查配置

# Istio 默认注入的 Sidecar 健康检查(自动生成)
containers:
  - name: istio-proxy
    image: proxyv2:1.20.3
    ports:
      - containerPort: 15090
        name: http-envoy-prom
      - containerPort: 15021
        name: http-envoy-stats
    livenessProbe:
      httpGet:
        path: /healthz/ready
        port: 15021
      initialDelaySeconds: 1
      periodSeconds: 2
      failureThreshold: 3
    readinessProbe:
      httpGet:
        path: /healthz/ready
        port: 15021
      initialDelaySeconds: 1
      periodSeconds: 2
      failureThreshold: 30
    startupProbe:
      httpGet:
        path: /healthz/ready
        port: 15021
      initialDelaySeconds: 1
      periodSeconds: 2
      failureThreshold: 30

3.3.3 重启策略与 Sidecar 恢复

场景 Kubernetes 行为 对流量影响 治理建议
Liveness 探针失败 重启 Sidecar 容器 Pod 内流量中断,直至 Sidecar 就绪 设置合理的 failureThreshold,避免频繁重启
Readiness 探针失败 Pod 从 Service Endpoint 中移除 新流量不再路由至此 Pod 配合 terminationDrainDuration 优雅排空
Startup 探针失败 杀死并重启 Sidecar Pod 无法进入 Ready 状态 增大 failureThreshold 或调整 xDS 超时
Sidecar 进程崩溃 根据 restartPolicy 重启(默认 Always) 流量中断,重启后恢复 监控崩溃次数,触发告警
Sidecar 健康检查与重启决策流程 Sidecar 启动 Startup 探针检测 通过? 重启 Sidecar Liveness 周期性检测 通过? 重启 Sidecar Readiness 就绪检测

3.4 优雅关闭与排空策略

在 Sidecar 重启或 Pod 缩容时,需要确保存量请求被优雅处理,避免连接中断。Istio 提供了 terminationDrainDuration 和 EXIT_ON_ZERO_ACTIVE_CONNECTIONS 两个关键参数。

# 在 Pod Annotation 中配置优雅关闭
metadata:
  annotations:
    # 等待所有活跃连接关闭后再退出(最长等待 60s)
    sidecar.istio.io/terminationDrainDuration: "60s"
    # 当活跃连接数为 0 时立即退出
    sidecar.istio.io/exitOnZeroActiveConnections: "true"

# 在 Helm Values 中全局配置
global:
  proxy:
    terminationDrainDuration: 60s
    exitOnZeroActiveConnections: true
治理联动要点:在制品库中,每个 Sidecar 版本应附带对应的健康检查参数模板。当 Sidecar 版本升级时,自动校验新版本的探针参数是否与集群资源配额(如 CPU 限速)匹配,避免因探针超时导致误重启。