使用 canary 部署时,Rollout 会部署应用程序的初始 canary 版本。您可以手动或以编程方式验证它。验证 canary 版本并将其提升为稳定版本后,新的稳定版本将提供给所有用户。
但是,有时会在 canary 版本中发现 bug、错误或部署问题,您可能希望中止 canary Rollout 并回滚到应用程序的稳定版本。
中止 canary Rollout 会删除新 canary 版本的资源,并恢复应用程序之前的稳定版本。所有导向到 canary 的网络流量(例如入口、路由或虚拟服务)都将返回到原始的稳定版本。
以下示例过程部署了应用程序的新red
canary 版本,然后在它完全提升为稳定版本之前中止它。
步骤
-
更新容器镜像版本,并通过在 Argo Rollouts CLI 中运行以下命令将.spec.template.spec.containers.image
的值从argoproj/rollouts-demo:yellow
修改为argoproj/rollouts-demo:red
$ oc argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:red -n <namespace> (1)
1 |
指定定义Rollout 自定义资源 (CR) 的命名空间。 |
示例输出
rollout "rollouts-demo" image updated
Rollout 中部署的容器镜像已修改,Rollout 启动新的 canary 部署。
-
等待 rollout 达到暂停状态。
-
通过运行以下命令,验证 rollout 是否部署了rollouts-demo:red
金丝雀版本并达到暂停状态
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> (1)
示例输出
Name: rollouts-demo
Namespace: spring-petclinic
Status: ॥ Paused
Message: CanaryPauseStep
Strategy: Canary
Step: 1/8
SetWeight: 20
ActualWeight: 20
Images: argoproj/rollouts-demo:red (canary)
argoproj/rollouts-demo:yellow (stable)
Replicas:
Desired: 5
Current: 5
Updated: 1
Ready: 5
Available: 5
NAME KIND STATUS AGE INFO
⟳ rollouts-demo Rollout ॥ Paused 17m
├──# revision:3
│ └──⧉ rollouts-demo-5747959bdb ReplicaSet ✔ Healthy 75s canary
│ └──□ rollouts-demo-5747959bdb-fdrsg Pod ✔ Running 75s ready:1/1
├──# revision:2
│ └──⧉ rollouts-demo-6cf78c66c5 ReplicaSet ✔ Healthy 9m45s stable
│ ├──□ rollouts-demo-6cf78c66c5-zrgd4 Pod ✔ Running 9m44s ready:1/1
│ ├──□ rollouts-demo-6cf78c66c5-2ptpp Pod ✔ Running 4m58s ready:1/1
│ ├──□ rollouts-demo-6cf78c66c5-tmk6c Pod ✔ Running 4m38s ready:1/1
│ └──□ rollouts-demo-6cf78c66c5-zv6lx Pod ✔ Running 4m27s ready:1/1
└──# revision:1
└──⧉ rollouts-demo-687d76d795 ReplicaSet • ScaledDown 17m
-
通过运行以下命令中止 rollout 的更新
$ oc argo rollouts abort rollouts-demo -n <namespace> (1)
示例输出
rollout 'rollouts-demo' aborted
Argo Rollouts 控制器将删除应用程序的金丝雀资源,并回滚到稳定版本。
-
通过运行以下命令,验证中止 rollout 后,金丝雀ReplicaSet
的副本数量是否已缩放到 0。
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> (1)
示例输出
Name: rollouts-demo
Namespace: spring-petclinic
Status: ✖ Degraded
Message: RolloutAborted: Rollout aborted update to revision 3
Strategy: Canary
Step: 0/8
SetWeight: 0
ActualWeight: 0
Images: argoproj/rollouts-demo:yellow (stable)
Replicas:
Desired: 5
Current: 5
Updated: 0
Ready: 5
Available: 5
NAME KIND STATUS AGE INFO
⟳ rollouts-demo Rollout ✖ Degraded 24m
├──# revision:3
│ └──⧉ rollouts-demo-5747959bdb ReplicaSet • ScaledDown 7m38s canary
├──# revision:2
│ └──⧉ rollouts-demo-6cf78c66c5 ReplicaSet ✔ Healthy 16m stable
│ ├──□ rollouts-demo-6cf78c66c5-zrgd4 Pod ✔ Running 16m ready:1/1
│ ├──□ rollouts-demo-6cf78c66c5-2ptpp Pod ✔ Running 11m ready:1/1
│ ├──□ rollouts-demo-6cf78c66c5-tmk6c Pod ✔ Running 11m ready:1/1
│ ├──□ rollouts-demo-6cf78c66c5-zv6lx Pod ✔ Running 10m ready:1/1
│ └──□ rollouts-demo-6cf78c66c5-mlbsh Pod ✔ Running 4m47s ready:1/1
└──# revision:1
└──⧉ rollouts-demo-687d76d795 ReplicaSet • ScaledDown 24m
rollout 状态标记为Degraded
,这表明尽管应用程序已回滚到之前的稳定版本yellow
,但 rollout 当前并未处于.spec.template.spec.containers.image
字段中设置的所需版本red
。
|
Degraded 状态并不反映应用程序的健康状况。它仅表示所需和正在运行的容器镜像版本之间存在不匹配。
|
-
将容器镜像版本更新到之前的稳定版本yellow
,并通过运行以下命令修改.spec.template.spec.containers.image
的值
$ oc argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow -n <namespace> (1)
示例输出
rollout "rollouts-demo" image updated
rollout 将跳过分析和推广步骤,回滚到之前的稳定版本yellow
,并快速部署稳定的ReplicaSet
。
-
通过运行以下命令,验证 rollout 状态是否立即标记为Healthy
。
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> (1)
示例输出
Name: rollouts-demo
Namespace: spring-petclinic
Status: ✔ Healthy
Strategy: Canary
Step: 8/8
SetWeight: 100
ActualWeight: 100
Images: argoproj/rollouts-demo:yellow (stable)
Replicas:
Desired: 5
Current: 5
Updated: 5
Ready: 5
Available: 5
NAME KIND STATUS AGE INFO
⟳ rollouts-demo Rollout ✔ Healthy 63m
├──# revision:4
│ └──⧉ rollouts-demo-6cf78c66c5 ReplicaSet ✔ Healthy 55m stable
│ ├──□ rollouts-demo-6cf78c66c5-zrgd4 Pod ✔ Running 55m ready:1/1
│ ├──□ rollouts-demo-6cf78c66c5-2ptpp Pod ✔ Running 50m ready:1/1
│ ├──□ rollouts-demo-6cf78c66c5-tmk6c Pod ✔ Running 50m ready:1/1
│ ├──□ rollouts-demo-6cf78c66c5-zv6lx Pod ✔ Running 50m ready:1/1
│ └──□ rollouts-demo-6cf78c66c5-mlbsh Pod ✔ Running 44m ready:1/1
├──# revision:3
│ └──⧉ rollouts-demo-5747959bdb ReplicaSet • ScaledDown 46m
└──# revision:1
└──⧉ rollouts-demo-687d76d795 ReplicaSet • ScaledDown 63m