3. Deployment 升级策略基础:Recreate、RollingUpdate、蓝绿部署、金丝雀发布与 A/B 测试

在 Kubernetes 生态中,Deployment 是最核心的工作负载控制器,其升级策略直接决定了应用变更时的可用性、风险暴露面与回滚速度。本章深入剖析五种主流升级策略的原理、适用场景与配置要点,为后续多集群准入控制联动打下坚实基础。

3.1 Recreate 策略:全量替换,停机升级

Recreate 策略是所有升级策略中最简单、最粗暴的一种。当 Deployment 更新时,它会先删除所有旧版本 Pod,待旧 Pod 完全终止后,再创建新版本 Pod。

核心特征:升级期间存在明确的服务中断窗口,适用于开发环境、离线批处理任务或对停机不敏感的内部工具。
维度 说明
升级速度 快(无滚动等待)
资源消耗 低(同一时间只运行一个版本)
风险等级 高(全量切换,失败影响面 100%)
回滚速度 快(直接重建旧版本)
典型场景 无状态批处理、非关键内部服务、数据库迁移 Job
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-recreate
spec:
  replicas: 3
  strategy:
    type: Recreate
  template:
    spec:
      containers:
      - name: app
        image: my-app:2.0.0

3.2 RollingUpdate 策略:渐进替换,保持可用

RollingUpdate 是 Kubernetes Deployment 的默认升级策略。它通过逐步替换旧 Pod 为新 Pod,确保在整个升级过程中始终有足够数量的 Pod 提供服务。

两个关键参数控制滚动节奏:

  • maxUnavailable:升级过程中允许的最大不可用 Pod 数量(值或百分比)。
  • maxSurge:升级过程中允许超出期望副本数的最大 Pod 数量(值或百分比)。
最佳实践:对于生产关键服务,建议设置 maxUnavailable: 25% 和 maxSurge: 25%,在速度与稳定性之间取得平衡。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-rolling
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  template:
    spec:
      containers:
      - name: app
        image: my-app:2.0.0
RollingUpdate 滚动替换流程 Pod v1 Pod v1 Pod v1 Pod v1 Pod v1 开始 Pod v2 Pod v1 Pod v1 Pod v1 Pod v1 Pod v2 Pod v2 Pod v2 Pod v2 Pod v2 说明:每次替换一个 Pod,保持总副本数不变,确保服务不中断。

3.3 蓝绿部署:独立环境,瞬间切换

蓝绿部署并非 Kubernetes 原生策略,而是通过两套完全独立的 Deployment + Service 实现的发布模式。蓝环境(Blue)运行当前稳定版本,绿环境(Green)部署新版本。验证通过后,通过修改 Service 的 selector 将流量瞬间从蓝切到绿。

关键风险:蓝绿部署需要双倍资源,且切换后旧版本(蓝)应保留一段时间用于快速回滚,避免资源浪费与回滚困难。
蓝绿部署架构 用户 Service selector: app=v2 蓝环境 (v1) 副本数: 3 绿环境 (v2) 副本数: 3 切换方式:修改 Service 的 selector 从 app=v1 改为 app=v2,流量瞬间切换。 回滚方式:将 selector 改回 app=v1,秒级回滚。

3.4 金丝雀发布:小比例验证,渐进放量

金丝雀发布通过路由权重控制,将小部分流量(如 5%-10%)导向新版本,在真实生产流量中验证新版本的稳定性与性能。验证通过后逐步增加权重,直至全量切换。

在 Kubernetes 中,金丝雀发布通常借助 Service Mesh(如 Istio)、Ingress Controller(如 Nginx Ingress) 或 Flagger 等工具实现精细化的流量分割。

阶段 金丝雀权重 稳定版本权重 验证目标
初始 5% 95% 基础功能、错误率
中期 25% 75% 性能、延迟、资源消耗
后期 50% 50% 全量兼容性、业务指标
全量 100% 0% 完成发布
自动化金丝雀:结合 Prometheus 指标与 Flagger,可实现自动化金丝雀发布——当错误率升高或延迟增加时自动回滚,无需人工干预。

3.5 A/B 测试:基于特征的流量路由

A/B 测试与金丝雀发布的本质区别在于:金丝雀发布关注版本稳定性,而 A/B 测试关注业务效果对比。A/B 测试根据用户特征(如地域、浏览器、用户 ID 哈希、Cookie)将流量路由到不同版本,用于验证新功能对业务指标(转化率、点击率)的影响。

在 Kubernetes 中,A/B 测试通常需要 Istio VirtualService 或 自定义 Ingress 规则 实现基于 HTTP Header 或 Cookie 的路由。

# Istio VirtualService 示例:基于 Header 的 A/B 路由
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: my-app-ab
spec:
  hosts:
  - my-app.example.com
  http:
  - match:
    - headers:
        user-group:
          exact: "beta"
    route:
    - destination:
        host: my-app
        subset: v2
  - route:
    - destination:
        host: my-app
        subset: v1

3.6 策略对比与选型矩阵

策略 停机时间 资源开销 流量控制粒度 回滚速度 适用场景
Recreate 有(全量停机) 低 无 快 开发环境、离线任务
RollingUpdate 无 低 Pod 级别 中等 通用生产服务
蓝绿部署 无 高(双倍) 环境级别 极快 关键业务、合规要求
金丝雀发布 无 中等 百分比权重 快 高风险变更、性能验证
A/B 测试 无 中等 用户特征 快 功能效果对比、用户体验实验
选型建议:在多集群场景下,建议将金丝雀发布作为默认的跨集群升级策略,配合准入控制 Webhook 实现版本一致性校验与策略强制执行。蓝绿部署适用于对回滚速度要求极高的金融核心系统,而 A/B 测试则推荐在独立集群或命名空间中隔离运行,避免影响全局流量。