×

Argo Rollouts 支持 金丝雀蓝绿 部署策略。本指南提供使用金丝雀部署策略的示例说明,以帮助您部署、更新、推广和手动中止 rollout。

使用基于金丝雀的部署策略,您可以将流量拆分到两个应用程序版本之间

  • 金丝雀版本:应用程序的新版本,您可以在其中逐渐路由流量。

  • 稳定版本:应用程序的当前版本。金丝雀版本稳定并且所有用户流量都定向到它之后,它将成为新的稳定版本。之前的稳定版本将被丢弃。

先决条件

  • 您已以管理员身份登录到 OpenShift Container Platform 集群。

  • 您可以访问 OpenShift Container Platform Web 控制台。

  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps

  • 您已在 OpenShift Container Platform 集群上安装了 Argo Rollouts

  • 您已在系统上安装了 Argo Rollouts CLI

部署 rollout

作为集群管理员,您可以配置 Argo Rollouts 以将用户流量的子集逐渐路由到新的应用程序版本。然后,您可以测试应用程序是否已部署并正在运行。

以下示例过程创建了一个 rollouts-demo rollout 和服务。然后,rollout 将 20% 的流量路由到应用程序的金丝雀版本,等待手动推广,然后执行多次自动推广,直到将所有流量路由到新的应用程序版本。

步骤
  1. 在 Web 控制台的**管理员**视角中,单击**Operators** → **已安装的 Operators** → **Red Hat OpenShift GitOps** → **Rollout**。

  2. 从**项目**下拉菜单中创建或选择您想要在其中创建和配置Rollout自定义资源 (CR) 的项目。

  3. 点击创建 Rollout并在 YAML 视图中输入以下配置

    apiVersion: argoproj.io/v1alpha1
    kind: Rollout
    metadata:
      name: rollouts-demo
    spec:
      replicas: 5
      strategy:
        canary: (1)
          steps: (2)
          - setWeight: 20 (3)
          - pause: {}  (4)
          - setWeight: 40
          - pause: {duration: 45}  (5)
          - setWeight: 60
          - pause: {duration: 20}
          - setWeight: 80
          - pause: {duration: 10}
      revisionHistoryLimit: 2
      selector:
        matchLabels:
          app: rollouts-demo
      template: (6)
        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
    1 Rollout 必须使用的部署策略。
    2 指定 Rollout 的步骤。此示例逐步将 20%、40%、60% 和 80% 的流量路由到 canary 版本。
    3 必须导向到 canary 版本的流量百分比。值为 20 表示 20% 的流量导向到 canary 版本。
    4 指定 Argo Rollouts 控制器无限期暂停,直到找到升级请求。
    5 指定 Argo Rollouts 控制器暂停 45 秒。您可以以秒 (s)、分钟 (m) 或小时 (h) 为单位设置持续时间值。例如,您可以指定1h 表示一小时。如果未指定值,则持续时间值默认为秒。
    6 指定要创建的 Pod。
  4. 点击创建

    为了确保 Rollout 在创建时能够快速可用,Argo Rollouts 控制器会自动将.spec.template.spec.containers.image字段中指定的argoproj/rollouts-demo:blue初始容器镜像视为稳定版本。在初始实例中,Rollout资源的创建会将所有流量路由到应用程序的稳定版本,并跳过将流量发送到 canary 版本的部分。但是,对于所有后续的应用程序升级(修改了.spec.template.spec.containers.image字段),Argo Rollouts 控制器将照常执行 canary 步骤。

  5. 运行以下命令验证您的 Rollout 是否已正确创建

    $ oc argo rollouts list rollouts -n <namespace> (1)
    1 指定定义Rollout资源的命名空间。
    示例输出
    NAME           STRATEGY   STATUS        STEP  SET-WEIGHT  READY  DESIRED  UP-TO-DATE  AVAILABLE
    rollouts-demo  Canary     Healthy       8/8   100         5/5    5        5           5
  6. 创建目标为rollouts-demoRollout 的 Kubernetes 服务。

    1. 在 Web 控制台的**管理员**视角中,点击网络服务

    2. 点击创建服务并在 YAML 视图中输入以下配置

      apiVersion: v1
      kind: Service
      metadata:
        name: rollouts-demo
      spec:
        ports: (1)
        - port: 80
          targetPort: http
          protocol: TCP
          name: http
      
        selector: (2)
          app: rollouts-demo
      1 指定应用程序在容器内运行时使用的端口名称。
      2 确保selector字段的内容与Rollout自定义资源 (CR) 中的内容相同。
    3. 点击创建

      Rollouts 会自动使用 canary ReplicaSet 的 Pod 模板哈希更新已创建的服务。例如,rollouts-pod-template-hash: 687d76d795

  7. 运行以下命令观察 Rollout 的进度

    $ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> (1)
    1 指定定义Rollout资源的命名空间。
    示例输出
    Name:            rollouts-demo
    Namespace:       spring-petclinic
    Status:          ✔ Healthy
    Strategy:        Canary
      Step:          8/8
      SetWeight:     100
      ActualWeight:  100
    Images:          argoproj/rollouts-demo:blue (stable)
    Replicas:
      Desired:       5
      Current:       5
      Updated:       5
      Ready:         5
      Available:     5
    
    NAME                                       KIND        STATUS     AGE    INFO
    ⟳ rollouts-demo                            Rollout     ✔ Healthy  4m50s
    └──# revision:1
       └──⧉ rollouts-demo-687d76d795           ReplicaSet  ✔ Healthy  4m50s  stable
          ├──□ rollouts-demo-687d76d795-75k57  Pod         ✔ Running  4m49s  ready:1/1
          ├──□ rollouts-demo-687d76d795-bv5zf  Pod         ✔ Running  4m49s  ready:1/1
          ├──□ rollouts-demo-687d76d795-jsxg8  Pod         ✔ Running  4m49s  ready:1/1
          ├──□ rollouts-demo-687d76d795-rsgtv  Pod         ✔ Running  4m49s  ready:1/1
          └──□ rollouts-demo-687d76d795-xrmrj  Pod         ✔ Running  4m49s  ready:1/1

    创建 Rollout 后,您可以验证 Rollout 的状态字段是否显示阶段:健康

  8. Rollouts部分下的Rollout选项卡中,验证rollouts-demo Rollout 的状态字段是否显示为阶段:健康

    或者,您可以运行以下命令来验证 Rollout 是否健康

    $ oc argo rollouts status rollouts-demo -n <namespace> (1)
    1 指定定义Rollout资源的命名空间。
    示例输出
    Healthy

您现在可以使用Rollout CR 的下一次更新来执行 canary 部署。

更新 Rollout

当您更新Rollout自定义资源 (CR),并修改.spec.template.spec字段(例如,容器镜像版本)时,新的 Pod 将通过ReplicaSet使用更新的容器镜像版本创建。

步骤
  1. 通过修改 Rollout 中部署的容器镜像来模拟应用程序的新 canary 版本。

    1. 在 Web 控制台的**管理员**视角中,转到操作符已安装的操作符Red Hat OpenShift GitOpsRollout

    2. 选择现有的rollouts-demo Rollout,并在 YAML 视图中将.spec.template.spec.containers.image的值从argoproj/rollouts-demo:blue修改为argoproj/rollouts-demo:yellow

    3. 点击保存,然后点击重新加载

      Rollout 中部署的容器镜像已修改,Rollout 启动新的 canary 部署。

      根据Rollout CR 的.spec.strategy.canary.steps字段中定义的setWeight属性,最初只有 20% 的路由流量到达 canary 版本,并且 Rollout 会无限期暂停,直到收到升级请求。

      示例路由:20% 的流量导向到 canary 版本,并且 Rollout 会无限期暂停,直到后续步骤中指定升级请求。
      spec:
        replicas: 5
        strategy:
          canary: (1)
            steps: (2)
            - setWeight: 20 (3)
            - pause: {}  (4)
        # (...)
      1 Rollout 必须使用的部署策略。
      2 Rollout 的步骤。此示例逐步将 20%、40%、60% 和 80% 的流量路由到 canary 版本。
      3 必须导向到 canary 版本的流量百分比。值为 20 表示 20% 的流量导向到 canary 版本。
      4 指定 Argo Rollouts 控制器无限期暂停,直到找到升级请求。
  2. 运行以下命令观察 Rollout 的进度

    $ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> (1)
    1 指定定义Rollout CR 的命名空间。
    示例输出
    Name:            rollouts-demo
    Namespace:       spring-petclinic
    Status:          ॥ Paused
    Message:         CanaryPauseStep
    Strategy:        Canary
      Step:          1/8
      SetWeight:     20
      ActualWeight:  20
    Images:          argoproj/rollouts-demo:blue (stable)
                     argoproj/rollouts-demo:yellow (canary)
    Replicas:
      Desired:       5
      Current:       5
      Updated:       1
      Ready:         5
      Available:     5
    
    NAME                                       KIND        STATUS     AGE    INFO
    ⟳ rollouts-demo                            Rollout     ॥ Paused   9m51s
    ├──# revision:2
    │  └──⧉ rollouts-demo-6cf78c66c5           ReplicaSet  ✔ Healthy  99s    canary
    │     └──□ rollouts-demo-6cf78c66c5-zrgd4  Pod         ✔ Running  98s    ready:1/1
    └──# revision:1
       └──⧉ rollouts-demo-687d76d795           ReplicaSet  ✔ Healthy  9m51s  stable
          ├──□ rollouts-demo-687d76d795-75k57  Pod         ✔ Running  9m50s  ready:1/1
          ├──□ rollouts-demo-687d76d795-jsxg8  Pod         ✔ Running  9m50s  ready:1/1
          ├──□ rollouts-demo-687d76d795-rsgtv  Pod         ✔ Running  9m50s  ready:1/1
          └──□ rollouts-demo-687d76d795-xrmrj  Pod         ✔ Running  9m50s  ready:1/1

    Rollout 现在处于暂停状态,因为 Rollout 的更新策略配置中未指定暂停持续时间。

  3. 重复上一步以测试新部署的应用程序版本并确保其按预期工作。例如,通过浏览器与应用程序交互来验证应用程序,并尝试运行测试或观察容器日志。

    在您将其推进到下一步之前,Rollout 将保持暂停状态。

验证应用程序的新版本按预期工作后,您可以决定是否继续升级或中止 Rollout。相应地,请遵循“升级 Rollout”或“手动中止 Rollout”中的说明。

升级 Rollout

由于您的 Rollout 现在处于暂停状态,因此作为集群管理员,您现在必须手动升级 Rollout 以使其能够继续执行下一步。

步骤
  1. 通过在 Argo Rollouts CLI 中运行以下命令来模拟应用程序的另一个新的 canary 版本

    $ oc argo rollouts promote rollouts-demo -n <namespace> (1)
    1 指定定义Rollout资源的命名空间。
    示例输出
    rollout 'rollouts-demo' promoted

    这会将 canary 版本的流量权重增加到 40%。

  2. 通过运行以下命令验证 Rollout 是否按步骤执行。

    $ oc argo rollouts get rollout rollouts-demo -n <namespace> --watch (1)
    1 指定定义Rollout资源的命名空间。

    由于Rollout CR 中定义的其余步骤都设置了持续时间,例如pause: {duration: 45},因此 Argo Rollouts 控制器将等待该持续时间,然后自动进入下一步。

    所有步骤成功完成后,新的ReplicaSet对象将被标记为稳定副本集。

    示例输出
    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     14m
    ├──# revision:2
    │  └──⧉ rollouts-demo-6cf78c66c5           ReplicaSet  ✔ Healthy     6m5s  stable
    │     ├──□ rollouts-demo-6cf78c66c5-zrgd4  Pod         ✔ Running     6m4s  ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-g9kd5  Pod         ✔ Running     2m4s  ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-2ptpp  Pod         ✔ Running     78s   ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-tmk6c  Pod         ✔ Running     58s   ready:1/1
    │     └──□ rollouts-demo-6cf78c66c5-zv6lx  Pod         ✔ Running     47s   ready:1/1
    └──# revision:1
       └──⧉ rollouts-demo-687d76d795           ReplicaSet  • ScaledDown  14m

手动中止 Rollout

使用 canary 部署时,Rollout 会部署应用程序的初始 canary 版本。您可以手动或以编程方式验证它。验证 canary 版本并将其提升为稳定版本后,新的稳定版本将提供给所有用户。

但是,有时会在 canary 版本中发现 bug、错误或部署问题,您可能希望中止 canary Rollout 并回滚到应用程序的稳定版本。

中止 canary Rollout 会删除新 canary 版本的资源,并恢复应用程序之前的稳定版本。所有导向到 canary 的网络流量(例如入口、路由或虚拟服务)都将返回到原始的稳定版本。

以下示例过程部署了应用程序的新red canary 版本,然后在它完全提升为稳定版本之前中止它。

步骤
  1. 更新容器镜像版本,并通过在 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 部署。

  2. 等待 rollout 达到暂停状态。

  3. 通过运行以下命令,验证 rollout 是否部署了rollouts-demo:red金丝雀版本并达到暂停状态

    $ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> (1)
    1 指定定义Rollout CR 的命名空间。
    示例输出
    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
  4. 通过运行以下命令中止 rollout 的更新

    $ oc argo rollouts abort rollouts-demo -n <namespace> (1)
    1 指定定义Rollout CR 的命名空间。
    示例输出
    rollout 'rollouts-demo' aborted

    Argo Rollouts 控制器将删除应用程序的金丝雀资源,并回滚到稳定版本。

  5. 通过运行以下命令,验证中止 rollout 后,金丝雀ReplicaSet的副本数量是否已缩放到 0。

    $ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> (1)
    1 指定定义Rollout CR 的命名空间。
    示例输出
    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状态并不反映应用程序的健康状况。它仅表示所需和正在运行的容器镜像版本之间存在不匹配。

  6. 将容器镜像版本更新到之前的稳定版本yellow,并通过运行以下命令修改.spec.template.spec.containers.image的值

    $ oc argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow -n <namespace> (1)
    1 指定定义Rollout CR 的命名空间。
    示例输出
    rollout "rollouts-demo" image updated

    rollout 将跳过分析和推广步骤,回滚到之前的稳定版本yellow,并快速部署稳定的ReplicaSet

  7. 通过运行以下命令,验证 rollout 状态是否立即标记为Healthy

    $ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> (1)
    1 指定定义Rollout CR 的命名空间。
    示例输出
    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