第 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% 的流量会在初始实例期间定向到应用程序的稳定版本。应用程序按预期运行,不会进行额外的尝试来部署新版本。
但是,在部署应用程序的新版本后,Argo Rollouts 根据应用程序的新版本创建一个新的 Canary 部署,并将某种百分比的流量路由到该新版本。
使用 Service Mesh 时,Argo Rollouts 会自动修改 VirtualService 资源,以控制 stable 和 canary 应用程序版本之间的流量分割百分比。在以下示意图中,在第一个提升后,20% 的流量发送到 Canary 应用版本,然后由 stable 服务将 80% 发送到稳定版本。
5.1. 配置 Argo Rollouts 以使用 OpenShift Service Mesh 路由流量
您可以通过创建以下项目来使用 OpenShift Service Mesh 配置 Argo Rollouts:
- 网关
- 两个 Kubernetes 服务:stable 和 canary,指向服务的每个版本中的 pod
- VirtualService
- rollout 自定义资源(CR)
在以下示例中,rollout 将 20% 流量路由到应用程序的 canary 版本。手动提升后,推出部署路由 40% 的流量。在进行另一个手动提升后,推出部署会执行多个自动化提升,直到所有流量都路由到新的应用程序版本。
先决条件
- 以管理员身份登陆到 OpenShift Container Platform 集群。
- 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps。
- 您已在 OpenShift Container Platform 集群中安装了 Argo Rollouts。
- 您在系统中安装了 Argo Rollouts CLI。
- 已在集群中安装了 OpenShift Service Mesh Operator,并配置了 ServiceMeshControlPlane。
流程
创建
Gateway
对象以接受网格的入站流量。创建包含以下代码片段内容的 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: - "*"
运行以下命令来应用 YAML 文件。
$ oc apply -f gateway.yaml
为应用的 canary 和 stable 版本创建服务。
-
在 Web 控制台的 Administrator 视角中,进入 Networking
Services。 - 点 Create Service。
在 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
- 点 Create 创建稳定服务。
在 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
- 单击 Create 以创建 Canary 服务。
-
在 Web 控制台的 Administrator 视角中,进入 Networking
创建一个 VirtualService,将传入的流量路由到 stable 和 canary 服务。
创建 YAML 文件,并将以下 YAML 复制到其中:以下示例创建一个名为
rollouts-demo-vsvc
的VirtualService
: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
运行以下命令来应用 YAML 文件。
$ oc apply -f virtual-service.yaml
创建
Rollout
CR。在这个示例中,Istio
用作流量管理器。-
在 Web 控制台的 Administrator 视角中,进入 Operators
Installed Operators Red Hat OpenShift GitOps Rollout。 在 Create Rollout 页面上,单击 YAML 视图 并添加以下代码片段。以下示例创建一个名为
rollouts-demo
的Rollout
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
- 点 Create。
- 在 Rollout 选项卡中,验证 rollout 的 Status 字段显示 Phase: Healthy。
-
在 Web 控制台的 Administrator 视角中,进入 Operators
验证路由是否将 100% 的流量定向到应用程序的稳定版本。
运行以下命令监控推出部署的进度:
$ 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 版本的部分。要验证服务网格是否为 stable 服务发送 100% 的流量,对 canary 服务发送 0%,请运行以下命令:
$ oc describe virtualservice/rollouts-demo-vsvc -n <namespace>
查看终端中显示的以下输出:
route - destination: host: rollouts-demo-stable weight: 100 1 - destination: host: rollouts-demo-canary weight: 0 2
通过修改推出部署中部署的容器镜像,模拟应用程序的新 canary 版本。
运行以下命令,修改
argoproj/rollouts-demo:blue
到argoproj/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 版本后暂停。运行以下命令,观察推出部署的进度。
$ 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
手动将部署提升到下一个提升步骤。
$ oc argo rollouts promote rollouts-demo -n <namespace> 1
- 1
- 指定定义
Rollout
资源的命名空间。
运行以下命令监控推出部署的进度:
$ 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
运行以下命令,将 canary 版本中的流量权重增加到 100%,并丢弃应用程序之前稳定版本中的流量:
$ oc argo rollouts promote rollouts-demo -n <namespace> 1
- 1
- 指定定义
Rollout
资源的命名空间。
运行以下命令监控推出部署的进度:
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> 1
- 1
- 指定定义
Rollout
资源的命名空间。
在成功完成后,stable 服务的权重为 100% 和 Canary 服务上的 0%。