LabHub
学习 学习路径 课程

CAPA — Argo 项目认证助理

金丝雀、蓝绿与回退

在 LabHub 中继续学习

目标

编写金丝雀和蓝绿 Rollout 清单,以及负责基于指标自动回滚的 AnalysisTemplate;同时实际部署相应的 Service 和 Deployment,亲手完成发布与回滚。

为什么重要

渐进式发布的核心有两点:‘新版本要暴露多少流量’,以及‘根据什么决定是否继续’。setWeight 回答前一个问题,analysis 回答后一个问题。没有 duration 的 pause 会把判断交给人,而 AnalysisTemplate 则把同样的判断交给指标。另一方面,回滚本身并不是 Argo Rollouts 的发明;它之所以可行,是因为 Kubernetes 会将 ReplicaSet 保留为各个修订版本。在本实验中同时操作这两个层次后,你就能分辨 Rollout 究竟在哪些方面带来了新能力。

步骤

  1. 创建 /root/capa-rollout/ 目录,并在 rollout.yaml 中填写 apiVersion argoproj.io/v1alpha1、kind Rolloutmetadata.name capa-webmetadata.namespace capa-rolloutspec.replicas 4spec.selector.matchLabels.app capa-web,容器镜像使用 nginx:1.27
  2. 将同一文件中的 spec.strategy.canary.steps 设置为至少五个步骤:第一个步骤为 setWeight: 20,第二个为 pause: {duration: 30s},第三个为 setWeight: 50,最后一个为 setWeight: 100
  3. /root/capa-rollout/analysistemplate.yaml 中填写 kind AnalysisTemplatemetadata.name capa-success-rate,并在 spec.metrics[0] 中填写 name success-rate、interval 30s、failureLimit 3、要求结果不低于 0.95 的 successCondition,以及 provider.prometheus.address
  4. rollout.yaml 的一个金丝雀步骤改为 analysis 步骤,使 templates[0].templateName 指向 capa-success-rate;并将 spec.strategy.canary.canaryService 指定为 capa-web-canarystableService 指定为 capa-web-stabletrafficRouting.nginx.stableIngress 指定为 capa-web-stable
  5. /root/capa-rollout/rollout-bluegreen.yaml 中填写 kind Rolloutmetadata.name capa-api,并在 spec.strategy.blueGreen 下加入 activeService capa-api-active、previewService capa-api-preview、autoPromotionEnabled false、scaleDownDelaySeconds 60。不要在此文件中同时使用 canary。
  6. 在集群中创建命名空间 capa-rollout,并在其中实际创建 Service capa-web-stablecapa-web-canary。两者的 type 都是 ClusterIPspec.selector.app 都是 capa-web,端口都是 80
  7. 在同一命名空间中实际创建 Deployment capa-webreplicas4spec.selector.matchLabels.appcapa-web,容器镜像为 nginx:1.27
  8. capa-web 的镜像改为一次 nginx:1.28 以创建新修订版本,然后执行回滚。最终镜像应恢复为 nginx:1.27,且修订版本号应不小于 3。

参考

Rollout 基本骨架

创建 /root/capa-rollout/ 目录,并在 rollout.yaml 中填写 apiVersion argoproj.io/v1alpha1、kind Rolloutmetadata.name capa-webmetadata.namespace capa-rolloutspec.replicas 4spec.selector.matchLabels.app capa-web,容器镜像使用 nginx:1.27

Rollout 的 spec 从 replicas、selector 到 template 都与 Deployment 几乎相同。不同之处在于 strategy 下的内容。

权重与暂停步骤

将同一文件中的 spec.strategy.canary.steps 设置为至少五个步骤:第一个步骤为 setWeight: 20,第二个为 pause: {duration: 30s},第三个为 setWeight: 50,最后一个为 setWeight: 100

steps 是一个数组,每个元素只包含 setWeight 或 pause 等一个键。为 pause 指定 duration 时会等待相应时长;不指定时则会无限等待,直到有人执行晋级。

编写 AnalysisTemplate

/root/capa-rollout/analysistemplate.yaml 中填写 kind AnalysisTemplatemetadata.name capa-success-rate,并在 spec.metrics[0] 中填写 name success-rate、interval 30s、failureLimit 3、要求结果不低于 0.95 的 successCondition,以及 provider.prometheus.address

metrics 条目必须同时说明测量频率、成功判定标准、允许失败的次数以及数据来源。四项缺少任何一项,都无法形成完整的判断。

连接分析步骤与流量路由

rollout.yaml 的一个金丝雀步骤改为 analysis 步骤,使 templates[0].templateName 指向 capa-success-rate;并将 spec.strategy.canary.canaryService 指定为 capa-web-canarystableService 指定为 capa-web-stabletrafficRouting.nginx.stableIngress 指定为 capa-web-stable

analysis 步骤通过 templates 数组引用 AnalysisTemplate 的名称。要真正按比例分配流量,还必须把金丝雀服务和稳定服务的名称告诉控制器。

蓝绿策略

/root/capa-rollout/rollout-bluegreen.yaml 中填写 kind Rolloutmetadata.name capa-api,并在 spec.strategy.blueGreen 下加入 activeService capa-api-active、previewService capa-api-preview、autoPromotionEnabled false、scaleDownDelaySeconds 60。不要在此文件中同时使用 canary。

蓝绿发布会先完整启动新版本,只允许通过 preview 访问,随后再切换 active。分别有一个字段用于关闭自动晋级,另一个字段用于决定旧版本保留多久。

创建稳定版与金丝雀版两个服务

在集群中创建命名空间 capa-rollout,并在其中实际创建 Service capa-web-stablecapa-web-canary。两者的 type 都是 ClusterIPspec.selector.app 都是 capa-web,端口都是 80

从这里开始操作真实集群。两个服务可以使用相同的选择器,控制器稍后会修改选择器来划分流量。

部署对应的 Deployment

在同一命名空间中实际创建 Deployment capa-webreplicas4spec.selector.matchLabels.appcapa-web,容器镜像为 nginx:1.27

必须为 Pod 模板添加与服务选择器相同的标签,服务才能找到端点。副本数应与 Rollout 文件保持一致。

升级后再回滚

capa-web 的镜像改为一次 nginx:1.28 以创建新修订版本,然后执行回滚。最终镜像应恢复为 nginx:1.27,且修订版本号应不小于 3。

先更换一次镜像创建新修订版本,再执行回滚。请确认回滚后修订版本号不会减小,而是继续增加。