Kubernetes StatefulSet 灰度发布与金丝雀发布
一、基本概念
1. 灰度发布(Gray Release)
- 定义:逐步将新版本应用部署到部分 Pod,通过流量控制(如 Ingress 规则)让部分用户访问新版本,验证稳定性后全量发布。
- 适用场景:需要验证新版本功能或稳定性的有状态服务(如数据库、消息队列)。
2. 金丝雀发布(Canary Release)
- 本质:一种特殊的灰度发布,通常先部署**少量 Pod(金丝雀)**接收生产流量,确认无问题后再扩展新版本。
- StatefulSet 实现:通过
partition
字段控制更新的 Pod 范围,实现分阶段更新。
二、StatefulSet 的实现机制
1. 关键字段:updateStrategy
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
partition: 2 # 序号 >=2 的 Pod 才会更新(从0开始计数)
partition
作用:指定一个分界点,只有序号 ≥ partition 的 Pod 会被更新,其余保留旧版本。
2. 操作流程(金丝雀发布示例)
目标:将 StatefulSet(共 3 个 Pod)从 v1 升级到 v2,先更新 1 个 Pod(金丝雀)。 步骤:
-
初始状态:3 个 Pod 运行 v1(
web-0
、web-1
、web-2
)。 -
设置分区:
kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":2}}}}'
- 仅
web-2
(序号=2 ≥ partition)会被更新到 v2,其余保持 v1。
- 仅
-
验证金丝雀:监控
web-2
的日志和指标,确认无异常。 -
全量更新:将
partition
改为0
,所有 Pod 逐步更新到 v2:kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":0}}}}'
三、灰度发布的扩展实现
若需更精细的流量控制(如按比例分配流量),需结合其他工具:
1. 方案 1:Service + 多 StatefulSet
- 创建两个 StatefulSet(v1 和 v2),共享相同的
volumeClaimTemplate
。 - 通过 Service 的
selector
动态调整流量比例(如 90% 到 v1,10% 到 v2)。
2. 方案 2:Ingress 流量切分
- 使用 Nginx/Istio 的 流量镜像 或 权重路由,将部分请求导流到新版本 Pod。 示例(Istio VirtualService):
http:
- route:
- destination:
host: web-service
subset: v1
weight: 90
- destination:
host: web-service
subset: v2
weight: 10
四、关键注意事项
-
数据一致性
- 确保新旧版本 Pod 能兼容同一存储卷的数据(如数据库 Schema 变更需向后兼容)。
-
回滚机制
-
发现问题时,快速调整
partition
回退到旧版本:kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":3}}}}'
-
-
监控与验证
- 在灰度阶段监控 业务指标(如错误率、延迟)和 存储性能(如 IOPS)。
五、与 Deployment 的对比
特性 | StatefulSet(分区更新) | Deployment(金丝雀) |
---|---|---|
Pod 更新顺序 | 逆序(从最高序号开始) | 根据策略(如 RollingUpdate) |
流量控制 | 需结合 Service/Ingress | 原生支持 maxSurge /maxUnavailable |
适用场景 | 有状态服务(如数据库) | 无状态服务(如 Web 应用) |
六、常用命令
# 查看 StatefulSet 更新状态
kubectl rollout status sts/web
# 动态调整 partition(金丝雀发布)
kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":1}}}}'
# 回滚到历史版本(需提前有 Revision)
kubectl rollout undo sts/web --to-revision=1
评论需开启科学上网!