蓝绿发布/灰度发布与Argo Rollouts
蓝绿发布:
- 当前版本 v1 正常运行
- 将新版本 v2 所有副本全部准备完成后
- 切换负载均衡器所有流量指向 v2
- 如果一切正常,则删除 v1,完成更新
- 如果发生错误,则将所有流量切换回 v1,并停止本次更新。
灰度发布:
- 当前版本 v1 正常运行
- 准备新版本 v2 (少量副本),将流量部分(百分比)切至 v2
- 如果一切正常,则逐步增加流向 v2 版本的流量;直至全部流量切换至 v2,删除 v1 版本。
- 如果发生错误,则减少流向 v2 版本的流量或停止本次升级;
argo rollout
argo rollout
定义了一种新的资源Rollout
,旨在代替 Deployment 功能,通过控制不同版本 replicasets 副本数量来实现策略化更新。
其定义和 Deployment 极为相似,仅区别于strategy
字段,可以理解为 Rollout 对 Deployment 的 strategy 功能进行了扩展。
apiVersion: argoproj.io/v1alpha1 # Changed from apps/v1
kind: Rollout # Changed from Deployment
metadata:
name: rollouts-demo
spec:
selector:
matchLabels:
app: rollouts-demo
template:
metadata:
labels:
app: rollouts-demo
spec:
containers:
- name: rollouts-demo
image: argoproj/rollouts-demo:blue
ports:
- containerPort: 8080
strategy:
canary: # Changed from rollingUpdate or recreate
steps:
- setWeight: 20
- pause: {}
https://argoproj.github.io/argo-rollouts/migrating/#convert-deployment-to-rollout
argo rollout 支持从现有 Deployment 引用定义,以方便快速集成至 Rolllout。
https://argoproj.github.io/argo-rollouts/migrating/#reference-deployment-from-rollout
与 Deployment 相同 Rollout 借用了 kubernetes 原生资源 Service 来完成版本更新。
Service 根据标签选择后端 Pod IPs,并对进入的请求进行负载均衡到 pod。回顾一下 Service 中存在的负载均衡:
- 如果是基于 iptables 的 Service,service 使用了 iptables-extensions statistic 模块对所有 pod 设置权重。iptables 根据权重进行负载均衡。
- 如果是基于 ipvs 的 Service,则是默认使用了 ipvs 的
rr
轮询算法进行负载均衡。
在策略设置为蓝绿发布时:
- 对 Rollout 中 pod 定义进行修改以触发更新
- Rollout 创建新 Replicaset
- 在新版本全部准备就绪后更新 Service 将所有流量切换至新 ReplicaSet。
在策略设置为灰度发布时:
- 在 Rollout 中灰度比例以及灰度调整间隔时间等
- 对 Rollout 中 pod 定义进行修改以触发更新
- Rollout 创建新 Replicaset,根据配置设置新旧副本数量比例。此时 Service 后端包含不同比例的副本数量。
- 按照策略继续执行灰度更新,直至完全更新。
除了上述的策略外,argo rollout 还提供了基于监控反馈的灰度更新等其他辅助功能。
argo rollout 还提供了配置支持在 rollout 过程中进行 preview,即提供 preview service 对新版本进行访问以进行监控采样等工作。
参考:
网友评论