×

您可以使用 Argo Rollouts 及其流量分割机制,逐步将一部分用户流量路由到新应用程序版本。然后,您可以测试应用程序是否已部署并正常运行。

使用 OpenShift Routes,您可以配置 Argo Rollouts 根据您的需求,通过将流量导向集群环境中的各种应用程序来减少或增加流量。

您可以使用 OpenShift Routes 在两个应用程序版本之间拆分流量

  • **金丝雀版本**:应用程序的新版本,您可以逐步路由流量。

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

先决条件

配置 Argo Rollouts 以使用 OpenShift Routes 路由流量

您可以使用 OpenShift Routes 配置 Argo Rollouts 来创建路由、rollouts 和服务。

以下示例过程创建了一个路由、一个 rollout 和两个服务。然后,它会逐步将越来越多的流量路由到应用程序的金丝雀版本,然后将该金丝雀状态标记为成功并成为新的稳定版本。

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

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

  • 您已在 OpenShift Container Platform 集群上安装了 Argo Rollouts。更多信息,请参见“创建 RolloutManager 自定义资源”。

  • 您已在系统上安装了 Red Hat OpenShift GitOps CLI。更多信息,请参见“安装 GitOps CLI”。

  • 您已在系统上安装了 Argo Rollouts CLI。更多信息,请参见“Argo Rollouts CLI 概述”。

步骤
  1. 创建一个Route对象。

    1. 在 Web 控制台的**管理员**视角中,点击**网络** → **路由**。

    2. 点击**创建路由**。

    3. 在**创建路由**页面上,点击**YAML 视图**并添加以下代码片段:以下示例创建一个名为rollouts-demo-route的路由

      apiVersion: route.openshift.io/v1
      kind: Route
      metadata:
        name: rollouts-demo-route
      spec:
        port:
          targetPort: http (1)
        tls: (2)
          insecureEdgeTerminationPolicy: Redirect
          termination: edge
        to:
          kind: Service
          name: argo-rollouts-stable-service (3)
          weight: 100 (4)
      
        alternateBackends:
          - kind: Service
            name: argo-rollouts-canary-service (5)
            weight: 0 (6)
      1 指定应用程序在容器内运行时使用的端口名称。
      2 指定用于保护路由的 TLS 配置。
      3 目标稳定服务的名称。
      4 此字段由 Route Rollout 插件自动修改为稳定权重。
      5 目标金丝雀服务的名称。
      6 此字段由 Route Rollout 插件自动修改为金丝雀权重。
    4. 点击**创建**以创建路由。然后它将显示在**路由**页面上。

  2. 创建要在路由中引用的服务(金丝雀和稳定)。

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

    2. 点击**创建服务**。

    3. 在**创建服务**页面上,点击**YAML 视图**并添加以下代码片段:以下示例创建一个名为argo-rollouts-canary-service的金丝雀服务。金丝雀流量将定向到此服务。

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

      确保Route对象中指定的金丝雀服务名称与Service对象中指定的金丝雀服务名称匹配。

    4. 点击**创建**以创建金丝雀服务。

      Rollouts 会自动使用金丝雀ReplicaSet的 pod 模板哈希更新已创建的服务。例如,rollouts-pod-template-hash: 7bf84f9696

    5. 重复这些步骤以创建稳定服务:以下示例创建一个名为argo-rollouts-stable-service的稳定服务。稳定流量将定向到此服务。

      apiVersion: v1
      kind: Service
      metadata:
        name: argo-rollouts-stable-service
      spec:
        ports: (1)
        - port: 80
          targetPort: http
          protocol: TCP
          name: http
      
        selector: (2)
          app: rollouts-demo
      1 指定应用程序在容器内运行时使用的端口名称。
      2 确保selector字段的内容与金丝雀服务和Rollout CR 中的内容相同。

      确保Route对象中指定的稳定服务名称与Service对象中指定的稳定服务名称匹配。

    6. 点击**创建**以创建稳定服务。

      Rollouts 会自动使用稳定ReplicaSet的 pod 模板哈希更新已创建的服务。例如,rollouts-pod-template-hash: 1b6a7733

  3. 创建Rollout CR 以引用RouteService对象。

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

    2. 在**创建 Rollout**页面上,点击**YAML 视图**并添加以下代码片段:以下示例创建一个名为rollouts-demoRollout CR

      apiVersion: argoproj.io/v1alpha1
      kind: Rollout
      metadata:
        name: rollouts-demo
      spec:
        template: (1)
          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
      
        revisionHistoryLimit: 2
        replicas: 5
        strategy:
          canary:
            canaryService: argo-rollouts-canary-service (2)
            stableService: argo-rollouts-stable-service (3)
            trafficRouting:
              plugins:
                argoproj-labs/openshift:
                  routes:
                    - rollouts-demo-route  (4)
            steps: (5)
            - setWeight: 30
            - pause: {}
            - setWeight: 60
            - pause: {}
        selector: (6)
          matchLabels:
            app: rollouts-demo
      1 指定要创建的 Pod。
      2 此值必须与已创建的金丝雀Service的名称匹配。
      3 此值必须与已创建的稳定Service的名称匹配。
      4 此值必须与已创建的Route CR 的名称匹配。
      5 指定发布步骤。此示例逐步将 30%、60% 和 100% 的流量路由到金丝雀版本。
      6 确保selector字段的内容与金丝雀和稳定服务中的内容相同。
    3. 点击**创建**。

    4. 在**Rollout**选项卡下的**Rollout**部分,验证 Rollout 的**状态**字段是否显示**阶段:健康**。

  4. 验证路由是否将 100% 的流量定向到应用程序的稳定版本。

    创建第一个Rollout资源实例时,Rollout 会调节要定向到稳定版和金丝雀版应用程序的流量数量。在初始实例中,创建Rollout资源会将所有流量路由到应用程序的稳定版本,并跳过将流量发送到金丝雀版本的部分。

    1. 转到**网络** → **路由**并查找要验证的Route资源。

    2. 选择**YAML**选项卡并查看以下代码片段

      示例:Route
      kind: Route
      metadata:
        name: rollouts-demo-route
      spec:
        alternateBackends:
        - kind: Service
          name: argo-rollouts-canary-service
          weight: 0 (1)
        # (...)
        to:
          kind: Service
          name: argo-rollouts-stable-service
          weight: 100 (2)
      1 值为0表示 0% 的流量定向到金丝雀版本。
      2 值为100表示 100% 的流量定向到稳定版本。
  5. 通过修改 Rollout 中部署的容器镜像来模拟应用程序的新金丝雀版本。

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

    2. 选择现有的**Rollout**并将.spec.template.spec.containers.image的值从argoproj/rollouts-demo:blue修改为argoproj/rollouts-demo:yellow

      结果,Rollout 中部署的容器镜像被修改,Rollout 启动新的金丝雀部署。

      根据Rollout资源的.spec.strategy.canary.steps字段中定义的setWeight属性,最初有 30% 的路由流量到达金丝雀版本,70% 的流量定向到稳定版本。将 30% 的流量定向到金丝雀版本后,Rollout 将暂停。

      示例路由:30% 的流量定向到金丝雀版本,70% 的流量定向到稳定版本。
      spec:
        alternateBackends:
        - kind: Service
          name: argo-rollouts-canary-service
          weight: 30
        # (...)
        to:
          kind: Service
          name: argo-rollouts-stable-service
          weight: 70
  6. 通过在 Argo Rollouts CLI 中运行以下命令来模拟应用程序的另一个新金丝雀版本

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

    这会将金丝雀版本的流量权重增加到 60%,稳定版本的流量权重减少到 40%。

    示例路由:60% 的流量定向到金丝雀版本,40% 的流量定向到稳定版本。
    spec:
      alternateBackends:
      - kind: Service
        name: argo-rollouts-canary-service
        weight: 60
      # (...)
      to:
        kind: Service
        name: argo-rollouts-stable-service
        weight: 40
  7. 通过运行以下命令,将金丝雀版本的流量权重增加到 100%,并丢弃应用程序旧稳定版本的流量

    $ oc argo rollouts promote rollouts-demo -n <namespace> (1)
    1 指定定义Rollout资源的命名空间。
    示例路由:0% 的流量定向到金丝雀版本,100% 的流量定向到稳定版本。
    spec:
      # (...)
      to:
        kind: Service
        name: argo-rollouts-stable-service
        weight: 100