首页 / Kubernetes (k8s) 入门教程 / 滚动/蓝绿/金丝雀发布

Kubernetes (k8s) 入门教程

滚动/蓝绿/金丝雀发布

本教程共 65 篇 · 第 50 篇 · 更新于 2026-08-14 · 约 16 分钟阅读

Kubernetes发布策略滚动发布蓝绿部署金丝雀Deployment

本节目标:搞懂滚动、蓝绿、金丝雀三种发布策略各是怎么玩的,分别适合什么风险场景,以及它们和 Service、Ingress 是怎么配合切流量的。

写完代码只是第一步,把它安全地上线才是真考验。直接把旧版本全换掉,一旦新版本有 bug,全站就黑了。Kubernetes 给了你几种”渐进式上线”的姿势,风险从低到高、操作从简到繁,我们一个一个看。

先记住一条:不管哪种策略,Service 的 selector 决定了哪批 Pod 能接到流量。所谓”切换流量”,本质就是让 Service 或 Ingress 把请求指向不同的 Pod 集合。滚动发布靠控制器自己换,蓝绿和金丝雀靠你手动/工具切 Service 和 Ingress。

50-1 滚动发布(Rolling Update)

这是最常用、也是 Kubernetes 最”原生”的方式。Deployment 默认就是滚动发布,不需要你额外装任何东西。

原理很简单:新副本一个个起来,旧副本一个个退场,中间始终有一部分 Pod 在干活,所以服务不中断。你在 spec.strategy.rollingUpdate 里控制节奏:

spec:
  replicas: 4
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # 最多比期望多 1 个 Pod(扩出来顶上)
      maxUnavailable: 0  # 最多允许 0 个不可用(保证容量不降)

maxSurge 控制”最多多几个”,maxUnavailable 控制”最多少几个”。比如 4 个副本、maxSurge:1, maxUnavailable:0,那就是先起 1 个新的、再退 1 个旧的,滚动往前推。

Note

滚动发布的回滚也极其简单:Deployment 会保留历史 ReplicaSet,kubectl rollout undo deployment/web 就能退回上一版。想深入可以回看第 19 章”滚动更新与回滚”。

滚动发布的缺点:新旧版本同时在跑,如果你的数据库 schema 不兼容新旧两端,就会出错。而且它没法”只让一小撮用户试新版本”,是所有流量一起渐变。

50-2 蓝绿发布(Blue-Green)

蓝绿的核心思想:准备两套完全一样的环境,一套跑旧版(蓝),一套跑新版(绿)。流量一开始全在蓝。等绿的就绪且验证 OK,把 Service 的 selector 一改,瞬间把所有流量切到绿。出问题?再把 selector 改回蓝,秒级回滚。

# 蓝(旧版)和绿(新版)是两个独立的 Deployment
# 流量由 Service 的 selector 决定走向
apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector:
    app: web
    version: green   # 改这一行:blue <-> green 即可切流
  ports:
  - port: 80
    targetPort: 8080

优点很明显:

  • 切换是原子的,没有”滚到一半”的中间态。
  • 回滚极快,改回 selector 即可,不用等 Pod 重建。

代价是:同一时刻你要养两套环境,资源开销翻倍。而且切换瞬间,蓝上还在处理中的请求会被切断(除非你做了优雅退出)。

Tip

蓝绿适合”版本不兼容、必须整体切换”的场景,比如改了不向后兼容的接口或数据结构。它用资源换安全和速度。

50-3 金丝雀发布(Canary)

金丝雀名字来自矿工带金丝雀下井测毒气:先放一小撮,活着再放大。发布时,你让极少部分流量先打到新版本,大部分还走旧版。观察新版的指标(错误率、延迟、日志)没问题,再逐步把比例放大到 100%。

在纯 Kubernetes 原语里,金丝雀可以这样拼:

  • 新旧两个 Deployment 同时跑。
  • Service 的 selector 同时匹配两者(比如都带 app: web),但旧版副本多、新版副本少。因为 Service 对端点做负载均衡,新版 Pod 少,自然只分到少量流量。
# 旧版 9 个副本,新版 1 个副本,Service 同时选中二者
# 大约 10% 的流量会落到新版——这就是"金丝雀"
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-stable
spec:
  replicas: 9
  selector:
    matchLabels: {app: web, track: stable}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-canary
spec:
  replicas: 1
  selector:
    matchLabels: {app: web, track: canary}

想更精细地按”百分比”切流(比如先 5% 再 20% 再 50%),光靠副本比例就不够准了。这时要借助 Ingress 控制器(如 Nginx Ingress 的 canary 注解)或服务网格(Istio),按权重把流量按比例导到新版本。这属于进阶玩法。

Warning

用”副本比例”模拟金丝雀只是近似。Pod 数少时,比例抖动很大(1:9 是 10%,但 1:4 就是 20%)。要精确百分比,请用 Ingress/服务网格的权重能力。

50-4 三种策略怎么选

一张表对比清楚:

策略资源开销回滚速度流量精度适合场景
滚动低(略多副本)中(需重建)全部渐变日常小版本、兼容性强
蓝绿高(双倍)极快(切 selector)全量切换不兼容大改、要秒回滚
金丝雀中(少量额外)快(调比例/selector)可控百分比新功能试水、降风险

选择口诀:日常小改上滚动;不兼容大改要秒回滚上蓝绿;想让真实用户先帮你试新功能上金丝雀。

50-5 进阶工具一句话

原生 YAML 能拼出三种策略的雏形,但要做到”按百分比精准切流 + 自动按指标推进 + 失败自动回滚”,还得靠专门工具:

  • Argo Rollouts:把金丝雀/蓝绿做成 Kubernetes 原生 CRD,支持按步长、按分析结果自动推进。
  • Flagger:基于指标的渐进式交付,常配合 Istio/Linkerd 做自动金丝雀。
  • 服务网格(Istio 等):提供细粒度流量权重,是精准金丝雀的底座。
Note

本章重点是”策略长什么样、各解决什么风险”。真要落地进阶玩法,建议先吃透基础的 Service 与 Ingress 路由(可回看第 26、28 章),再引入上述工具。

小结

发布策略本质是”在多大范围内、多快地把流量交给新版本”:

  1. 滚动发布最原生,新旧交替、不中断,但版本需兼容。
  2. 蓝绿发布双环境瞬间切换,回滚快但费资源。
  3. 金丝雀发布先放小流量试水,最稳但原语下精度有限。
  4. 要精准百分比切流,得靠 Ingress/服务网格或 Argo Rollouts 这类工具。

下一章我们看:升级节点、腾空节点时,怎么保证”同一时间不能挂太多 Pod”——这正是 Pod 中断预算(PDB)的活儿。