第 5 章 为 OpenShift Service Mesh 使用 Argo Rollouts 的路由流量


Red Hat OpenShift GitOps 中的 Argo Rollouts 支持各种流量管理机制,如 OpenShift 路由和 基于 Istio 的 OpenShift Service Mesh。

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

您可以使用 OpenShift Service Mesh 在两个应用程序版本间分割流量。

  • Canary 版本 :您逐步路由流量的应用程序的新版本。
  • 稳定版本 :应用程序的当前版本。在 canary 版本稳定并且所有用户流量定向到它后,它会成为新的稳定版本。之前的稳定版本将被丢弃。

Argo Rollout 中的 Istio-supports 使用 Gateway 和 VirtualService 资源来处理流量路由。

  • 网关 :您可以使用网关来管理网格的入站和出站流量。网关是 OpenShift Service Mesh 的入口点,负责处理发送到应用程序的流量请求。
  • VirtualService: VirtualService 定义流量路由规则以及进入底层服务的流量百分比,如 stable 和 canary 服务。

部署场景示例

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

应用程序稳定版本中的 100% 流量

但是,在部署应用程序的新版本后,Argo Rollouts 根据应用程序的新版本创建一个新的 Canary 部署,并将某种百分比的流量路由到该新版本。

使用 Service Mesh 时,Argo Rollouts 会自动修改 VirtualService 资源,以控制 stable 和 canary 应用程序版本之间的流量分割百分比。在以下示意图中,在第一个提升后,20% 的流量发送到 Canary 应用版本,然后由 stable 服务将 80% 发送到稳定版本。

stable 版本中的 80% 的流量和 Canary 版本中的 20%

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

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

  • 网关
  • 两个 Kubernetes 服务:stable 和 canary,指向服务的每个版本中的 pod
  • VirtualService
  • rollout 自定义资源(CR)

在以下示例中,rollout 将 20% 流量路由到应用程序的 canary 版本。手动提升后,推出部署路由 40% 的流量。在进行另一个手动提升后,推出部署会执行多个自动化提升,直到所有流量都路由到新的应用程序版本。

先决条件

流程

  1. 创建 Gateway 对象以接受网格的入站流量。

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

      名为 rollouts-demo-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
      网关的名称。
      2
      指定入口网关的名称。网关配置公开的端口和协议,但不包括任何流量路由配置。
    2. 运行以下命令来应用 YAML 文件。

      $ oc apply -f gateway.yaml
  2. 为应用的 canary 和 stable 版本创建服务。

    1. 在 Web 控制台的 Administrator 视角中,进入 Networking Services
    2. Create Service
    3. Create Service 页面中,点 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
      确保 selector 字段的内容在 stable 服务和 Rollout CR 中相同。
    4. Create 创建稳定服务。
    5. Create Service 页面中,点 YAML 视图 并添加以下代码片段。以下示例创建一个名为 rollouts-demo-canary 的 Canary 服务。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
      确保 selector 字段的内容在 canary service 和 Rollout CR 中相同。
    6. 单击 Create 以创建 Canary 服务。
  3. 创建一个 VirtualService,将传入的流量路由到 stable 和 canary 服务。

    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
      网关的名称。
      2
      目标稳定服务的名称。
      3
      指定用于侦听流量的端口号。
      4
      目标 canary 服务的名称。
      5
      指定用于保护 VirtualService 的 TLS 配置。
    2. 运行以下命令来应用 YAML 文件。

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

    1. 在 Web 控制台的 Administrator 视角中,进入 Operators Installed Operators Red Hat OpenShift GitOps Rollout
    2. Create 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
      这个值必须与创建的 canary Service 的名称匹配。
      2
      这个值必须与创建的 stable Service 的名称匹配。
      3
      指定推出部署的步骤。这个示例逐步将 20%、40%、60% 和 100% 流量路由到 Canary 版本。
      4
      确保 selector 字段的内容与 Canary 和 stable 服务中的相同。
    3. Create
    4. Rollout 选项卡中,验证 rollout 的 Status 字段显示 Phase: Healthy
  5. 验证路由是否将 100% 的流量定向到应用程序的稳定版本。

    1. 运行以下命令监控推出部署的进度:

      $ 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 规定了定向到 stable 和 canary 应用程序版本的流量数量。在初始实例中,Rollout 资源的创建会将所有流量路由到应用程序的稳定版本,并跳过流量发送到 canary 版本的部分。

    2. 要验证服务网格是否为 stable 服务发送 100% 的流量,对 canary 服务发送 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% 的流量被定向到 Canary 版本。
  6. 通过修改推出部署中部署的容器镜像,模拟应用程序的新 canary 版本。

    1. 运行以下命令,修改 argoproj/rollouts-demo:blueargoproj/rollouts-demo:yellow.spec.template.spec.containers.image 值。

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

      因此,在 rollout 中部署的容器镜像会被修改,rollout 会启动新的 canary 部署。

      注意

      根据 Rollout 资源的 .spec.strategy.canary.steps 字段中定义的 setWeight 属性,最初到路由的 20% 到达 Canary 版本,并且 80% 的流量被定向到稳定版本。rollout 在 20% 的流量被定向到 Canary 版本后暂停。

    2. 运行以下命令,观察推出部署的进度。

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

      在以下示例中,80% 的流量被路由到 stable 服务,20% 的流量路由到 Canary 服务。然后,部署会无限期暂停,直到您手动将它提升到下一级别。

      输出示例

      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% 的流量定向到 Canary 版本。

      route
      - destination:
          host: rollouts-demo-stable
        weight: 80 1
      - destination:
          host: rollouts-demo-canary
        weight: 20 2

      1
      80 表示 80% 的流量被定向到稳定版本。
      2
      20 表示 20% 的流量被定向到 Canary 版本。
  7. 手动将部署提升到下一个提升步骤。

    $ oc argo rollouts promote rollouts-demo -n <namespace> 1
    1
    指定定义 Rollout 资源的命名空间。
    1. 运行以下命令监控推出部署的进度:

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

      在以下示例中,60% 的流量被路由到 stable 服务,40% 的流量路由到 Canary 服务。然后,部署会无限期暂停,直到您手动将它提升到下一级别。

      输出示例

      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

      指向稳定版本和 40% 的流量示例,指向 Canary 版本。

      route
      - destination:
          host: rollouts-demo-stable
        weight: 60 1
      - destination:
          host: rollouts-demo-canary
        weight: 40 2

      1
      60 表示 60% 的流量被定向到稳定版本。
      2
      40 表示 40% 的流量被定向到 Canary 版本。
  8. 运行以下命令,将 canary 版本中的流量权重增加到 100%,并丢弃应用程序之前稳定版本中的流量:

    $ oc argo rollouts promote rollouts-demo -n <namespace> 1
    1
    指定定义 Rollout 资源的命名空间。
    1. 运行以下命令监控推出部署的进度:

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

在成功完成后,stable 服务的权重为 100% 和 Canary 服务上的 0%。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.