×

Red Hat OpenShift GitOps 中的 Argo Rollouts 支持各种流量管理机制,例如 OpenShift 路由 和基于 Istio 的 OpenShift 服务网格。

选择与 Argo Rollouts 一起使用的流量管理器的选择取决于您用于部署集群工作负载的现有流量管理解决方案。例如,Red Hat OpenShift 路由提供基本的流量管理功能,不需要使用 sidecar 容器。但是,Red Hat OpenShift 服务网格通过使用 Istio 提供更高级的路由功能,但需要配置 sidecar 容器。

您可以使用 OpenShift 服务网格在两个应用程序版本之间拆分流量。

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

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

Argo Rollouts 中的 Istio 支持使用 Gateway 和 VirtualService 资源来处理流量路由。

  • Gateway:您可以使用 Gateway 来管理网格的入站和出站流量。Gateway 是 OpenShift Service Mesh 的入口点,负责处理发送到应用程序的流量请求。

  • VirtualService:VirtualService 定义流量路由规则以及到达底层服务的流量百分比,例如稳定服务和金丝雀服务。

示例部署场景

例如,在一个示例部署场景中,在初始实例期间,100% 的流量都定向到应用程序的稳定版本。应用程序按预期运行,并且没有进行额外的部署新版本的尝试。

100% of traffic in the stable version of the application

但是,在部署新版本的应用程序后,Argo Rollouts 会基于新版本的应用程序创建一个新的金丝雀部署,并将一定百分比的流量路由到该新版本。

当您使用 Service Mesh 时,Argo Rollouts 会自动修改 VirtualService 资源以控制稳定版和金丝雀版应用程序之间流量分割的百分比。在下图中,在第一次升级后,20% 的流量发送到金丝雀应用程序版本,然后稳定服务将 80% 的流量发送到稳定版本。

80% of traffic in the stable version and 20% in the canary version

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

您可以使用 OpenShift Service Mesh 通过创建以下项目来配置 Argo Rollouts:

  • 一个 Gateway

  • 两个 Kubernetes 服务:稳定服务和金丝雀服务,它们指向每个服务版本的 Pod

  • 一个 VirtualService

  • 一个 Rollout 自定义资源 (CR)

在以下示例过程中,Rollout 将 20% 的流量路由到应用程序的金丝雀版本。手动升级后,Rollout 将路由 40% 的流量。在另一次手动升级后,Rollout 将执行多次自动升级,直到所有流量都路由到新应用程序版本。

先决条件
步骤
  1. 创建一个 Gateway 对象来接受网格的入站流量。

    1. 创建一个包含以下代码片段内容的 YAML 文件。

      名为 rollouts-demo-gateway 的示例 Gateway
      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: rollouts-demo-gateway (1)
      spec:
        selector:
          istio: ingressgateway (2)
        servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
          - "*"
      1 Gateway 的名称。
      2 指定入口 Gateway 的名称。Gateway 配置公开的端口和协议,但不包含任何流量路由配置。
    2. 运行以下命令应用 YAML 文件。

      $ oc apply -f gateway.yaml
  2. 为应用程序的稳定版本和金丝雀版本创建服务。

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

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

    3. 在**创建服务**页面上,单击**YAML 视图**并添加以下代码片段。以下示例创建了一个名为 rollouts-demo-stable 的稳定服务。稳定流量将定向到此服务。

      apiVersion: v1
      kind: Service
      metadata:
        name: rollouts-demo-stable
      spec:
        ports: (1)
        - port: 80
          targetPort: http
          protocol: TCP
          name: http
        selector: (2)
          app: rollouts-demo
      1 指定应用程序在容器内运行时使用的端口的名称。
      2 确保稳定服务和 Rollout CR 中的 selector 字段内容相同。
    4. 单击**创建**以创建稳定服务。

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

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

  3. 创建一个 VirtualService 来将传入流量路由到稳定服务和金丝雀服务。

    1. 创建一个 YAML 文件,并将以下 YAML 代码复制到其中。以下示例创建了一个名为 rollouts-demo-vsvcVirtualService

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: rollouts-demo-vsvc
      spec:
        gateways:
        - rollouts-demo-gateway (1)
        hosts:
        - rollouts-demo-vsvc.local
        http:
        - name: primary
          route:
          - destination:
              host: rollouts-demo-stable (2)
              port:
                number: 15372 (3)
            weight: 100
          - destination:
              host: rollouts-demo-canary (4)
              port:
                number: 15372
            weight: 0
        tls: (5)
        - match:
          - port: 3000
            sniHosts:
            - rollouts-demo-vsvc.local
          route:
          - destination:
              host: rollouts-demo-stable
            weight: 100
          - destination:
              host: rollouts-demo-canary
            weight: 0
      1 Gateway 的名称。
      2 目标稳定服务的名称。
      3 指定用于侦听流量的端口号。
      4 目标金丝雀服务的名称。
      5 指定用于保护 VirtualService 的 TLS 配置。
    2. 运行以下命令应用 YAML 文件。

      $ oc apply -f virtual-service.yaml
  4. 创建 Rollout CR。在此示例中,Istio 用作流量管理器。

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

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

      apiVersion: argoproj.io/v1alpha1
      kind: Rollout
      metadata:
        name: rollouts-demo
      spec:
        replicas: 5
        strategy:
          canary:
            canaryService: rollouts-demo-canary (1)
            stableService: rollouts-demo-stable (2)
            trafficRouting:
              istio:
                virtualServices:
                - name: rollouts-demo-vsvc
                  routes:
                  - primary
            steps: (3)
            - setWeight: 20
            - pause: {}
            - setWeight: 40
            - pause: {}
            - setWeight: 60
            - pause: {duration: 30}
            - setWeight: 80
            - pause: {duration: 60}
        revisionHistoryLimit: 2
        selector: (4)
          matchLabels:
            app: rollouts-demo
        template:
          metadata:
            labels:
              app: rollouts-demo
              istio-injection: enabled
          spec:
            containers:
            - name: rollouts-demo
              image: argoproj/rollouts-demo:blue
              ports:
              - name: http
                containerPort: 8080
                protocol: TCP
              resources:
                requests:
                  memory: 32Mi
                  cpu: 5m
      1 此值必须与已创建的金丝雀 Service 的名称匹配。
      2 此值必须与已创建的稳定 Service 的名称匹配。
      3 指定 Rollout 的步骤。此示例逐渐将 20%、40%、60% 和 100% 的流量路由到金丝雀版本。
      4 确保 selector 字段的内容与金丝雀服务和稳定服务中的相同。
    3. 单击**创建**。

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

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

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

      $ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> (1)
      1 指定定义 Rollout 资源的命名空间。
      示例输出
      Name:            rollouts-demo
      Namespace:       argo-rollouts
      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 会调节要定向到稳定版和金丝雀版应用程序的流量数量。在初始实例中,创建 Rollout 资源会将所有流量路由到应用程序的稳定版本,并跳过将流量发送到金丝雀版本的部分。

    2. 要验证服务网格是否将 100% 的流量发送到稳定服务,而 0% 发送到金丝雀服务,请运行以下命令

      $ oc describe virtualservice/rollouts-demo-vsvc -n <namespace>
    3. 查看终端中显示的以下输出

      route
      - destination:
          host: rollouts-demo-stable
        weight: 100 (1)
      - destination:
          host: rollouts-demo-canary
        weight: 0 (2)
      1 值为 100 表示 100% 的流量定向到稳定版本。
      2 值为 0 表示 0% 的流量定向到金丝雀版本。
  6. 通过修改 Rollout 中部署的容器镜像来模拟应用程序的新金丝雀版本。

    1. 通过运行以下命令,将 .spec.template.spec.containers.image 值从 argoproj/rollouts-demo:blue 修改为 argoproj/rollouts-demo:yellow

      $ oc argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow -n <namespace>

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

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

    2. 运行以下命令来观察 Rollout 的进度。

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

      在以下示例中,80% 的流量路由到稳定服务,20% 的流量路由到金丝雀服务。然后部署无限期暂停,直到您手动将其提升到下一级。

      示例输出
      Name:            rollouts-demo
      Namespace:       argo-rollouts
      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:       6
        Updated:       1
        Ready:         6
        Available:     6
      
      NAME                                       KIND        STATUS     AGE    INFO
      ⟳ rollouts-demo                            Rollout     ॥ Paused   6m51s
      ├──# 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
      示例:80% 的流量定向到稳定版本,20% 的流量定向到金丝雀版本。
      route
      - destination:
          host: rollouts-demo-stable
        weight: 80 (1)
      - destination:
          host: rollouts-demo-canary
        weight: 20 (2)
      1 值为80表示80% 的流量定向到稳定版本。
      2 值为20表示20% 的流量定向到金丝雀版本。
  7. 手动将部署提升到下一个推广步骤。

    $ oc argo rollouts promote rollouts-demo -n <namespace> (1)
    1 指定定义 Rollout 资源的命名空间。
    1. 运行以下命令来观察 Rollout 的进度

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

      在以下示例中,60% 的流量路由到稳定服务,40% 的流量路由到金丝雀服务。然后部署无限期暂停,直到您手动将其提升到下一级。

      示例输出
      Name:            rollouts-demo
      Namespace:       argo-rollouts
      Status:          ॥ Paused
      Message:         CanaryPauseStep
      Strategy:        Canary
        Step:          3/8
        SetWeight:     40
        ActualWeight:  40
      Images:          argoproj/rollouts-demo:blue (stable)
                       argoproj/rollouts-demo:yellow (canary)
      Replicas:
        Desired:       5
        Current:       7
        Updated:       2
        Ready:         7
        Available:     7
      
      NAME                                       KIND        STATUS     AGE    INFO
      ⟳ rollouts-demo                            Rollout     ॥ Paused   9m21s
      ├──# 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
      示例:60% 的流量定向到稳定版本,40% 的流量定向到金丝雀版本。
      route
      - destination:
          host: rollouts-demo-stable
        weight: 60 (1)
      - destination:
          host: rollouts-demo-canary
        weight: 40 (2)
      1 值为60表示60% 的流量定向到稳定版本。
      2 值为40表示40% 的流量定向到金丝雀版本。
  8. 通过运行以下命令,将金丝雀版本的流量权重增加到 100%,并丢弃应用程序先前稳定版本的流量

    $ oc argo rollouts promote rollouts-demo -n <namespace> (1)
    1 指定定义 Rollout 资源的命名空间。
    1. 运行以下命令来观察 Rollout 的进度

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

成功完成后,稳定服务的权重为 100%,金丝雀服务的权重为 0%。