第 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
对象以接受网格的入站流量。为应用的 canary 和 stable 版本创建服务。
-
在 Web 控制台的 Administrator 视角中,进入 Networking
Services。 - 点 Create Service。
在 Create Service 页面中,点 YAML 视图 并添加以下代码片段。以下示例创建一个名为
rollouts-demo-stable
的稳定服务。稳定的流量定向到此服务。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 点 Create 创建稳定服务。
在 Create Service 页面中,点 YAML 视图 并添加以下代码片段。以下示例创建一个名为
rollouts-demo-canary
的 Canary 服务。Canary 流量定向到此服务。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 单击 Create 以创建 Canary 服务。
-
在 Web 控制台的 Administrator 视角中,进入 Networking
创建一个 VirtualService,将传入的流量路由到 stable 和 canary 服务。
创建 YAML 文件,并将以下 YAML 复制到其中:以下示例创建一个名为
rollouts-demo-vsvc
的VirtualService
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用 YAML 文件。
oc apply -f virtual-service.yaml
$ oc apply -f virtual-service.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建
Rollout
CR。在这个示例中,Istio
用作流量管理器。-
在 Web 控制台的 Administrator 视角中,进入 Operators
Installed Operators Red Hat OpenShift GitOps Rollout。 在 Create Rollout 页面上,单击 YAML 视图 并添加以下代码片段。以下示例创建一个名为
rollouts-demo
的Rollout
CR:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 点 Create。
- 在 Rollout 选项卡中,验证 rollout 的 Status 字段显示 Phase: Healthy。
-
在 Web 控制台的 Administrator 视角中,进入 Operators
验证路由是否将 100% 的流量定向到应用程序的稳定版本。
运行以下命令监控推出部署的进度:
oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定定义
Rollout
资源的命名空间。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意创建
Rollout
资源的第一个实例时,rollout 规定了定向到 stable 和 canary 应用程序版本的流量数量。在初始实例中,Rollout
资源的创建会将所有流量路由到应用程序的稳定版本,并跳过流量发送到 canary 版本的部分。要验证服务网格是否为 stable 服务发送 100% 的流量,对 canary 服务发送 0%,请运行以下命令:
oc describe virtualservice/rollouts-demo-vsvc -n <namespace>
$ oc describe virtualservice/rollouts-demo-vsvc -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看终端中显示的以下输出:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
通过修改推出部署中部署的容器镜像,模拟应用程序的新 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>
$ oc argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 因此,在 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>
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定定义
Rollout
资源的命名空间。
在以下示例中,80% 的流量被路由到 stable 服务,20% 的流量路由到 Canary 服务。然后,部署会无限期暂停,直到您手动将它提升到下一级别。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,80% 定向到稳定版本,20% 的流量定向到 Canary 版本。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手动将部署提升到下一个提升步骤。
oc argo rollouts promote rollouts-demo -n <namespace>
$ oc argo rollouts promote rollouts-demo -n <namespace>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定定义
Rollout
资源的命名空间。
运行以下命令监控推出部署的进度:
oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定定义
Rollout
资源的命名空间。
在以下示例中,60% 的流量被路由到 stable 服务,40% 的流量路由到 Canary 服务。然后,部署会无限期暂停,直到您手动将它提升到下一级别。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指向稳定版本和 40% 的流量示例,指向 Canary 版本。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
运行以下命令,将 canary 版本中的流量权重增加到 100%,并丢弃应用程序之前稳定版本中的流量:
oc argo rollouts promote rollouts-demo -n <namespace>
$ oc argo rollouts promote rollouts-demo -n <namespace>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定定义
Rollout
资源的命名空间。
运行以下命令监控推出部署的进度:
oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
$ oc argo rollouts get rollout rollouts-demo --watch -n <namespace>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定定义
Rollout
资源的命名空间。
在成功完成后,stable 服务的权重为 100% 和 Canary 服务上的 0%。