介绍
Argo Rollouts是Kubernetes的控制器和一组crd,提供先进的部署能力,如蓝绿、金丝雀、金丝雀分析、实验和渐进交付功能。
Argo Rollouts(可选)集成了入口控制器和服务网格,利用它们的流量整型能力,在更新期间逐步将流量转移到新版本。此外,rollout可以验证不同的KPI指标,并自动在更新期间推动更新或回滚。
支持的特性
- 蓝绿更新策略
- 金丝雀更新策略
- 更加细粒度、加权流量拆分
- 自动回滚
- 手动判断
- 可定制的指标查询和业务 KPI 分析
- Ingress 控制器集成:NGINX,ALB
- 服务网格集成:Istio,Linkerd,SMI
- Metrics 指标集成:Prometheus、Wavefront、Kayenta、Web、Kubernetes Jobs、Datadog、New Relic,Graphite, InfluxDB
概念
Rollout
Rollout是一个Kubernetes的CRD,相当于Deployment对象,它的目的是在需要更高级的部署或渐进式交付功能的情况下代替Deployment对象,Rollout提供了Deployment所不能提供的功能:
- 蓝绿部署
- 金丝雀部署
- 与 Ingress 控制器和服务网格整合,实现高级流量路由
- 和metric集成,进行蓝绿和金丝雀部署分析
- 根据成功或失败的指标,自动发布或回滚
渐进式交付
渐进式交付是以一种可控的、渐进式的方式发布产品更新的过程,从而减少发布的风险,通常结合自动化和指标分析来驱动更新的自动升级或回滚。
渐进交付通常被描述为持续交付的演变,将CI/CD中的速度优势扩展到部署过程。这是通过将新版本发布给一部分用户,观察和分析正确的行为,然后逐步增加对更多的流量,同时不断验证正确性来实现的。
部署策略
- RollingUpdate(滚动更新):慢慢地用新版本替换旧版本,随着新版本的增加,旧版本会慢慢缩减,以保持应用的总数。这是Deployment的默认策略。
- Recreate(重新创建):Recreate 会在启动新版本之前删除旧版本的应用程序,这可确保应用程序的两个版本永远不会同时运行,但在部署期间会出现停机时间。
- Blue-Green(蓝绿):蓝绿发布(有时称为红黑)指同时部署了新旧两个版本的应用程序,在此期间,只有旧版本的应用程序会收到生产流量,这允许开发人员在将流量切到新版本之前对新版本进行测试。
- Canary(金丝雀):金丝雀发布指将一部分流量给新版本的应用,而将其余流量给旧版本,一旦新版本被验证是正确的,新版本可以逐渐取代旧版本。Ingress 控制器和服务网格,比如 nginx-ngress和Istio,可以使金丝雀的流量拆分模式比原生的更复杂(例如,实现非常细粒度的流量分割,或基于 HTTP 头的分割)。
架构
-
Rollout Controller
这是主控制器,用于监视集群的事件并在rollout类型的资源发生变更时做出反应。控制器将读取rollout的所有详细信息,并使集群处于rollout定义中描述的状态。 -
Rollout 资源
Rollout资源是Argo Rollouts引入和管理的一个CRD,它与原生的Deployment基本兼容,但有额外的字段来控制更加高级的部署方法,比如金丝雀和蓝绿部署。Argo Rollouts 控制器只对Rollout资源中的变化做出反应,不会对正常的Deployment做任何事情,所以如果你想用 Argo Rollouts管理你的Deployment,你需要将你的Deployment迁移到Rollouts。
-
旧版和新版的ReplicaSets
就是标准的ReplicaSet实例,Argo Rollouts给它们添加了一些额外的元数据,以便跟踪属于应用程序的不同版本。参加Rollout的ReplicaSet完全由控制器自动管理,不应该用外部工具来篡改它们。 -
Ingress/Service
用户的流量进入集群后,被重定向到合适的版本,Argo Rollouts 使用标准的Service,并添加了一些额外的元数据。 -
AnalysisTemplate和AnalysisRun
Analysis是一个CRD,它将Rollout连接到metrics providers ,并为某些指标定义特定阈值,这些阈值将决定Rollout是否成功。对于每个Analysis,你可以定义一个或多个指标查询及其预期结果,如果指标查询正常,则Rollout将继续操作;如果指标显示失败,则自动回滚;如果指标无法提供成功/失败的答案,则暂停发布。AnalysisTemplate包含关于查询什么指标的说明。附加到Rollout上的是AnalysisRun自定义资源。可以在特定的Rollout上定义一个AnalysisTemplate,也可以在集群全局上定义一个ClusterAnalysisTemplate,由多个Rollout共享。AnalysisRun资源在特定的rollout上限定范围。
-
Metric Providers
Argo Rollouts支持多个原生的Metric Providers,你可以在Analysis资源中使用,来自动升级或回滚。
原理
Argo Rollouts原理和Deployment差不多,只是加强rollout的策略和流量控制。当spec.template发送变化时,Argo Rollout就会根据spec.strategy进行rollout,通常会产生一个新的ReplicaSet,逐步scale down之前的ReplicaSet的pod数量。
应用场景
Argo Rollouts支持多种更新策略,意味着可以支持多种应用场景,蓝绿发布和金丝雀发布的场景它都支持。比如逐步增加新版本的流量;新旧版本同时存在,新版本测试通过后再把流量切到新版本等。
安装
官方文档:https://argoproj.github.io/argo-rollouts/installation/
安装argo-rollouts
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
安装argo-rollouts的kubectl plugin
curl -LO https://github.91chi.fun//https://github.com//argoproj/argo-rollouts/releases/download/v1.2.1/kubectl-argo-rollouts-linux-amd64
chmod +x ./kubectl-argo-rollouts-linux-amd64
sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts
kubectl argo rollouts version
自动补全
source <(kubectl-argo-rollouts completion bash)
使用
这里使用官网的金丝雀栗子,通过Rollout的部署、升级、发布和中断等操作来展示Rollouts的各种功能。
1.部署rollout
kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/rollout.yaml
kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/service.yaml
1.1文件说明
cat rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollouts-demo
spec:
replicas: 5 # 定义5个副本
strategy: # 定义部署策略
canary: # 金丝雀发布
steps:
- setWeight: 20
- pause: {} # 没有跟duration则需要手动更新
- setWeight: 40 # 设置流量的权重
- pause: {duration: 10}
- setWeight: 60
- pause: {duration: 10}
- setWeight: 80
- pause: {duration: 10}
revisionHistoryLimit: 2
selector:
matchLabels:
app: rollouts-demo
template:
metadata:
labels:
app: rollouts-demo
spec:
containers:
- name: rollouts-demo
image: argoproj/rollouts-demo:blue
ports:
- name: http
containerPort: 8080
protocol: TCP
resources:
requests:
memory: 32Mi
cpu: 5m
---
cat service.yaml
apiVersion: v1
kind: Service
metadata:
name: rollouts-demo
spec:
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: rollouts-demo
任何 Rollout 的初始创建都会立即将副本扩展到100%(跳过任何金丝雀升级步骤、分析等…),因为还没有发生升级。
2.查看rollout
Argo Rollouts 的 kubectl 插件允许我们可视化 Rollout 以及相关资源对象,并展示实时状态变化。
kubectl argo rollouts get rollout rollouts-demo --watch
3.更新rollout
更新Rollout通常是修改容器镜像的版本,然后执行 kubectl apply ,为了方便,rollouts插件还单独提供了一个 set image
的命令:
kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow
在rollout更新期间,控制器将通过rollout更新策略中定义的步骤进行。这个示例的rollout为金丝雀设置了20%的流量权重,并一直暂停rollout,直到用户取消或升级发布。在更新镜像后,再次观察rollout,直到它达到暂停状态。
rollout到达第二步时,可以看到,rollout处于暂停状态,现在只有1个运行新版本的pod,其余4个仍然运行旧版本,这相当于setWeight: 20 步骤所定义的20%的金丝雀权重。
4.恢复更新
argo rollouts提供了promote来进行后续的更新,剩余的步骤是完全自动化的。
promote 命令还支持用 –full 参数跳过所有剩余步骤和分析。
kubectl argo rollouts promote rollouts-demo
5.中断更新
先使用 set image
命令部署一个新的 red 版本的容器,并等待 rollout 再次暂停。
kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:red
这次我们将中止更新,而不是将滚动切换到下一步,这样它就回到了stabl 版本,该插件同样提供了一个abort命令,可以在更新过程中的任何时候手动中止 Rollout。
kubectl argo rollouts abort rollouts-demo
5.1恢复状态为Healthy
kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow
当Rollout还没有达到预期状态(例如,它被中止了,或者正在更新中),稳定版本的资源清单被重新应用,Rollout检测到这是一个回滚,而不是一个更新,并将通过跳过分析和步骤快速部署稳定的ReplicaSet。
6.回退更新
kubectl argo rollouts undo rollouts-demo --to-revision=1
可以看到没有revision为1的版本,而是重新创建了一个为5的版本,而且第一步处于暂停状态。
6.1执行promote命令继续后续的更新。
kubectl argo rollouts promote rollouts-demo
可以看到回退到我们最初版本为blue的镜像了。
Dashboard
执行下面的命令,即可启动dashboard
kubectl argo rollouts dashboard &
访问 ip:3100。
查看rollout详情