Argo Rollouts


Red Hat OpenShift GitOps 1.15

使用 Argo Rollouts 进行进度交付

Red Hat OpenShift Documentation Team

摘要

本文档提供了有关使用 Argo Rollouts 来封装声明推出部署策略所需的所有定义的说明。它还讨论了作为 GitOps 工作流的一部分如何启动、管理和自动交付部署。

第 1 章 Argo Rollouts 概述

在 GitOps 上下文中,进度交付是一个以受控和逐步方式发布应用程序更新的过程。通过只向用户的子集公开新版本的应用更新,从而降低了发行版本的风险。这个过程涉及持续观察和分析这个新应用程序版本,以验证其行为是否与要求和预期集匹配。验证过程会逐渐向更广泛的和更广泛的受众公开应用程序更新。

OpenShift Container Platform 通过使用路由来分隔不同服务间的网络数据来实现渐进式交付的功能,但这通常需要人工的干预和管理。

使用 Argo Rollouts 作为集群管理员,您可以自动化进度部署交付,并管理 Kubernetes 和 OpenShift Container Platform 集群上托管的应用程序的进度部署。Argo Rollouts 是一个具有自定义资源定义(CRD)的控制器,它提供高级部署功能,如蓝绿、canary、canary Canary 分析和实验等高级部署功能。

1.1. 为什么使用 Argo Rollouts?

作为集群管理员,在传统基础架构中管理和协调高级部署策略通常涉及长时间维护窗口。使用 OpenShift Container Platform 和 Red Hat OpenShift GitOps 等工具实现自动化可以减少这些窗口,但设置这些策略仍具有挑战性。

使用 Argo Rollouts 通过允许应用程序团队以声明性方式定义其 rollout 策略来简化进度交付。团队不再需要定义多个部署和服务,或为测试的流量控制和集成创建自动化。

您可以使用以下原因来使用 Argo Rollouts:

  • 您的用户可以在最终用户环境中更轻松地采用进度交付。
  • 通过 Argo Rollouts 的可用结构和指南,您的团队不必了解流量管理器和复杂基础架构。
  • 在更新过程中,您可以根据部署策略,通过逐步将流量转换为新版本来优化已部署应用程序版本的现有流量限制能力。
  • 您可以将 Argo Rollouts 与 Prometheus 等指标供应商相结合,根据参数集进行基于指标和策略驱动的推出部署和回滚。
  • 您的最终用户环境可获取 Red Hat OpenShift GitOps Operator 的安全性,并帮助管理资源、成本和时间。
  • 您的现有用户使用 Argo CD 进行安全性和自动化部署的用户会提前获得相应的反馈,以避免对它们造成影响的问题。

1.1.1. Argo Rollouts 的好处

在 Red Hat OpenShift GitOps 中使用 Argo Rollouts 作为默认工作负载提供以下优点:

  • 作为 GitOps 工作流的一部分的自动化进度交付
  • 高级部署功能
  • 优化现有的高级部署策略,如 blue-green 或 canary
  • 部署可以实现零停机时间更新
  • 细粒度、加权流量转换
  • 能够在没有达到生产环境的新流量的情况下进行测试
  • 自动回滚和提升
  • 手工调整
  • 可自定义的指标查询和分析业务关键性能指标 (KPI)
  • 与 ingress 控制器和 Red Hat OpenShift Service Mesh 集成用于高级流量路由
  • 与指标供应商集成以进行部署策略分析
  • 使用多个供应商

1.2. 关于 RolloutManager 自定义资源和规格

要使用 Argo Rollouts,您必须在集群中安装 Red Hat OpenShift GitOps Operator,然后在您选择的命名空间中创建 RolloutManager 自定义资源 (CR) 并将其提交到 Operator。您可以为单个或多个命名空间限定 RolloutManager CR。Operator 创建一个带有以下命名空间范围的支持资源的 argo-rollouts 实例:

  • Argo Rollouts 控制器
  • Argo Rollouts 指标服务
  • Argo Rollouts 服务帐户
  • Argo Rollouts 角色
  • Argo Rollouts 角色绑定
  • Argo Rollouts secret

您可以在 RolloutsManager CR 的 spec 中指定命令参数、环境变量、自定义镜像名称等。RolloutManager CR spec 定义 Argo Rollouts 的所需状态。

示例: RolloutManager CR

apiVersion: argoproj.io/v1alpha1
kind: RolloutManager
metadata:
  name: argo-rollout
  labels:
    example: basic
spec: {}
Copy to Clipboard Toggle word wrap

1.2.1. Argo Rollouts 控制器

使用 Argo Rollouts 控制器资源,您可以管理命名空间中的渐进式应用程序交付。Argo Rollouts 控制器资源监控集群的事件,并在任何与 Argo Rollouts 相关的资源有变化时做出反应。控制器读取所有推出部署详情,并将集群引入相同的状态,如 rollout 定义中所述。

1.3. Argo Rollouts 架构概述

通过安装 Red Hat OpenShift GitOps Operator 并配置 RolloutManager 自定义资源(CR)实例,在集群中启用了 Argo Rollouts 支持。

创建 RolloutManager CR 后,Red Hat OpenShift GitOps Operator 会将 Argo Rollouts 安装到同一命名空间中。此步骤包括安装 Argo Rollouts 控制器,以及处理 Argo Rollouts 所需的资源,如 CR、角色、角色绑定和配置数据。

Argo Rollouts 控制器以两种不同的模式安装:

  • 集群范围的模式 (默认):控制器在集群的所有命名空间中超载资源。
  • 命名空间范围的模式 :控制器监控部署 Argo Rollouts 的命名空间中的资源。

Argo Rollouts 的架构构建为组件和资源。组件用于管理资源。例如,A AnalysisRun 控制器管理 AnalysisRun CR。

Argo Rollouts 包括收集分析指标的多个机制,以验证是否部署了新应用程序版本:

  • Prometheus metrics: AnalysisTemplate CR 配置为连接到 Prometheus 实例,以评估一个或多个指标的成功或失败。
  • Kubernetes 作业指标 :Argo Rollouts 支持 Kubernetes 任务 资源,对资源指标运行分析。您可以根据成功运行 Kubernetes 作业,验证应用程序是否成功部署。

1.3.1. Argo Rollouts 组件

Argo Rollouts 由多个组件组成,允许用户在 OpenShift Container Platform 中练习进度交付。

Expand
表 1.1. Argo Rollouts 组件
Name描述

Argo Rollouts 控制器

Argo Rollouts Controller 是标准 Deployment 资源的替代方案,并与之合作。此控制器只响应 Argo Rollouts 资源中的更改,并管理 Rollout CR。Argo Rollouts Controller 不会修改标准部署资源。

AnalysisRun 控制器

AnalysisRun 控制器管理并执行 AnalysisRunAnalysisTemplate CR 的分析。它将推出部署连接到指标提供程序,并为指标定义阈值,来确定应用程序的部署更新是否成功。

试用控制器

Experiment 控制器在短期副本集上运行分析,并管理 Experiment 自定义资源。控制器也可以通过在 canary 部署策略 字段中的 试验 步骤与 Rollout 资源集成。

服务和 Ingress 控制器

Service 控制器管理 Service 资源,Ingress 控制器管理由 Argo Rollouts 修改的 Ingress 资源。这些控制器在应用程序实例中注入额外的元数据注解,以进行流量管理。

Argo Rollouts CLI 和 UI

Argo Rollouts 支持名为 Argo Rollouts CLI 的 oc/kubectl 插件。您可以从命令行与 rollouts、analyses 和 experiments 等资源交互。它可以执行操作,如 暂停提升重试。Argo Rollouts CLI 插件可以在浏览器中启动本地 Web UI 仪表板,以增强视觉化 Argo Rollouts 资源的体验。

1.3.2. Argo Rollouts 资源

Argo Rollout 组件管理几个资源以启用进度交付:

  • 特定于推出部署的资源 :例如,Rollout、AAnalysisRunExperiment
  • Kubernetes 网络资源 :例如,用于网络流量的 ServiceIngressRoute。Argo Rollouts 与这些资源集成,称为流量管理。

这些资源对于通过 Rollout CR 自定义应用程序部署至关重要。

Argo Rollouts 支持以下操作:

  • 路由 canary 部署基于百分比的流量。
  • 使用 ServiceIngress 资源将传入的用户流量转发到正确的应用程序版本。
  • 使用多个机制来收集分析指标,以验证应用的部署。
Expand
表 1.2. Argo Rollouts 资源
Name描述

rollout

此 CR 使用 Canary 或蓝绿部署策略启用应用程序的部署。它取代了内置的 Kubernetes Deployment 资源。

AnalysisRun

此 CR 用于执行分析,并汇总分析结果,将用户指导用户成功部署应用程序。AnalysisRun CR 是 AnalysisTemplate CR 的实例。

AnalysisTemplate

AnalysisTemplate CR 是一个模板文件,提供有关如何查询指标的说明。这些指令的结果以 AnalysisRun CR 的形式附加到推出部署中。AnalysisTemplate CR 可以在集群或特定推出部署上进行全局定义。您可以通过创建 Experiment 自定义资源来链接要在副本集上使用的 AnalysisTemplate 列表。

试用

Experiment CR 用于在部署过程中对应用程序运行简短分析,以确保正确部署应用程序。Experiment CR 可以独立使用,或作为 Rollout CR 的一部分运行。

服务和 Ingress

Argo Rollouts 使用 Service 和 Ingress 控制器通过服务和入口控制器原生支持路由流量。

RouteVirtualService

OpenShift Route 和 Red Hat OpenShift Service Mesh VirtualService 资源用于在不同应用程序版本间执行流量分割。

1.4. Argo Rollouts CLI 概述

您可以使用 Argo Rollouts CLI (是可选的插件)直接管理和监控 Argo Rollouts 资源,绕过使用 OpenShift Container Platform Web 控制台或 CLI (oc)的需求。

使用 Argo Rollouts CLI 插件,您可以执行以下操作:

  • 更改 Argo Rollouts 镜像。
  • 监控 Argo Rollouts 提升的进度。
  • 在 canary 部署中继续执行提升步骤。
  • 终止失败的 Argo Rollouts 部署。

Argo Rollouts CLI 插件直接与 ockubectl 命令集成。

要使用 Argo Rollouts 并管理进度交付,请在集群上安装 {gitops-titel} Operator 后,您可以在您选择的命名空间中创建和配置 RolloutManager 自定义资源(CR)实例。您可以为单个或多个命名空间限定 RolloutManager CR。

2.1. 先决条件

  • 您可以使用 cluster-admin 权限访问集群。
  • 访问 OpenShift Container Platform web 控制台。
  • 在集群中安装了 Red Hat OpenShift GitOps 1.9.0 或更新版本。

2.2. 创建 RolloutManager 自定义资源

要使用 Red Hat OpenShift GitOps 中的 Argo Rollouts 管理部署的进度交付,您必须在您选择的命名空间中创建并配置 RolloutManager 自定义资源 (CR)。默认情况下,任何新的 argo-rollouts 实例都只能管理部署它的命名空间中的资源,但您可以根据需要在多个命名空间中使用 Argo Rollouts。

先决条件

  • 在集群中安装了 Red Hat OpenShift GitOps 1.9.0 或更新版本。

流程

  1. 以集群管理员身份登录 OpenShift Container Platform Web 控制台。
  2. Administrator 视角中,点 OperatorsInstalled Operators
  3. Project 下拉菜单中选择您要创建和配置 RolloutManager 自定义资源 (CR) 的项目。
  4. 从安装的 Operator 中选择 Red Hat OpenShift GitOps
  5. Details 选项卡中,在 Provided APIs 部分下,点 RolloutManager 窗格中的 Create instance
  6. Create RolloutManager 页面中,选择 YAML 视图,并使用默认 YAML 或根据您的要求编辑它:

    示例: RolloutManager CR

    apiVersion: argoproj.io/v1alpha1
    kind: RolloutManager
    metadata:
      name: argo-rollout
      namespace: openshift-gitops
    spec: {}
    Copy to Clipboard Toggle word wrap

  7. Create
  8. RolloutManager 选项卡中,在 RolloutManagers 部分下,验证 RolloutManager 实例的 Status 字段显示为 Phase: Available
  9. 在左侧导航窗格中,验证命名空间范围的支持资源的创建:

    • WorkloadsDeployments 来验证 argo-rollouts 部署是否可用,Status 显示为 1 of 1 pods running。
    • WorkloadsSecrets 来验证 argo-rollouts-notification-secret secret 是否可用。
    • NetworkingServices 来验证 argo-rollouts-metrics 服务是否可用。
    • User ManagementRoles 来验证 argo-rollouts 角色和 argo-rollouts-aggregate-to-adminargo-rollouts-aggregate-to-edit 以及 argo-rollouts-aggregate-to-view 集群角色是否可用。
    • User ManagementRoleBindings 来验证 argo-rollouts 角色绑定是否可用。

2.3. 删除 RolloutManager 自定义资源

卸载 Red Hat OpenShift GitOps Operator 不会删除在安装过程中创建的资源。在卸载 Red Hat OpenShift GitOps Operator 前,您必须手动删除 RolloutManager 自定义资源(CR)。

先决条件

  • 在集群中安装了 Red Hat OpenShift GitOps 1.9.0 或更新版本。
  • 命名空间中已存在 RolloutManager CR。

流程

  1. 以集群管理员身份登录 OpenShift Container Platform Web 控制台。
  2. Administrator 视角中,点 OperatorsInstalled Operators
  3. Project 下拉菜单,再选择包含 RolloutManager CR 的项目。
  4. 从安装的 Operator 中选择 Red Hat OpenShift GitOps
  5. RolloutManager 选项卡,以查找 RolloutManagers 部分下的 RolloutManager 实例。
  6. 点实例。
  7. 从下拉菜单中选择 ActionsDelete RolloutManager,然后点 Delete 在对话框中进行确认。
  8. RolloutManager 选项卡中,在 RolloutManagers 部分下,验证 RolloutManager 实例已不再可用。
  9. 在左侧导航窗格中,验证删除命名空间范围的支持资源:

    • WorkloadsDeployments 来验证 argo-rollouts 部署已被删除。
    • WorkloadsSecrets 来验证 argo-rollouts-notification-secret secret 已被删除。
    • NetworkingServices 来验证 argo-rollouts-metrics 服务已被删除。
    • User ManagementRoles 来验证 argo-rollouts 角色和 argo-rollouts-aggregate-to-adminargo-rollouts-aggregate-to-edit 以及 argo-rollouts-aggregate-to-view 集群角色已被删除。
    • User ManagementRoleBindings 来验证 argo-rollouts 角色绑定已被删除。

2.4. 在 Linux 上安装 Argo Rollouts CLI

您可以在 Linux 上安装 Argo Rollouts CLI。

先决条件

  • 已安装 OpenShift Container Platform CLI (oc)。

流程

  1. 运行以下命令,下载 Argo Rollouts CLI 二进制文件 kubectl-argo-rollouts 的最新版本:

    $ curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,确保 kubectl-argo-rollouts 二进制文件可执行:

    $ chmod +x ./kubectl-argo-rollouts-linux-amd64
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令,将 kubectl-argo-rollouts 二进制文件移到系统路径中:

    # mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts
    Copy to Clipboard Toggle word wrap
    重要

    确保您有超级用户权限来运行这个命令。

  4. 运行以下命令并收到类似的输出来验证插件是否已正确安装:

    $ oc argo rollouts version
    Copy to Clipboard Toggle word wrap

    输出示例

    kubectl-argo-rollouts: v1.6.6+737ca89
      BuildDate: 2024-02-13T15:39:31Z 
    1
    
      GitCommit: 737ca89b42e4791e96e05b438c2b8540737a2a1a
      GitTreeState: clean
      GoVersion: go1.20.14 
    2
    
      Compiler: gc
      Platform: linux/amd64 
    3
    Copy to Clipboard Toggle word wrap

    1
    Argo Rollouts 二进制文件的构建日期信息。
    2
    用于构建 Argo Rollouts 二进制文件的 Go 语言版本。
    3
    用于构建 Argo Rollouts 二进制文件的平台。

2.5. 在 Mac OS 上安装 Argo Rollouts CLI

如果您是 macOS 用户,您可以使用 Homebrew 软件包管理器安装 Argo Rollouts CLI。

先决条件

  • 已安装 Homebrew (brew)软件包管理器。

流程

  • 运行以下命令来安装 Argo Rollouts CLI:

    $ brew install argoproj/tap/kubectl-argo-rollouts
    Copy to Clipboard Toggle word wrap

2.6. 在 Argo CD 实例上启用 Argo Rollouts UI

要在 Argo CD 实例上启用 Argo Rollouts UI,请完成以下步骤。

先决条件

  • 您可以使用 cluster-admin 权限访问集群。
  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps Operator。
  • 您已配置了 RolloutManager 自定义资源(CR)。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. 在 Web 控制台的 Administrator 视角中,点 OperatorsInstalled Operators
  3. 从安装的 Operator 列表中选择 Red Hat OpenShift GitOps,然后点击 Argo CD 选项卡。
  4. openshift-gitops 命名空间下的 Argo CD 选项卡中选择 Argo CD 实例。
  5. YAML 并添加以下配置来配置 Argo Rollouts UI:

    在 Argo CD CR 中启用 Argo Rollouts UI 示例

    apiVersion: argoproj.io/v1beta1
    kind: ArgoCD
    metadata:
      name: argocd
    spec:
      server:
        enableRolloutsUI: true 
    1
    Copy to Clipboard Toggle word wrap

    1
    将此值设置为 true,以配置 enableRolloutsUI 字段。
  6. 点击 Save
  7. 在 Web 控制台的 Administrator 视角中,导航到 red hat applications menu icon menu → OpenShift GitOpsCluster Argo CD。Argo CD Web UI 的登录页面显示在新窗口中。
  8. 要在 Argo CD Web UI 中访问 Argo Rollouts UI,请配置一个包含 Argo Rollouts 资源的示例应用程序。

    注意

    enableRolloutsUI 字段重启 Argo CD 服务器部署 pod,因此在 Argo CD Web UI 中需要几秒钟才能启用 Argo CD Web UI。

第 3 章 Argo Rollouts 入门

Argo Rollouts 支持 Canary蓝绿部署 策略。本指南提供了使用 canary 部署策略来帮助您部署、更新、提升和手动中止推出部署的示例。

使用基于 canary 的部署策略,您可以在两个应用程序版本间分割流量:

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

3.1. 先决条件

  • 以管理员身份登录到 OpenShift Container Platform 集群。
  • 访问 OpenShift Container Platform web 控制台。
  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps
  • 您已在 OpenShift Container Platform 集群中安装了 Argo Rollouts
  • 您已在系统中安装了 Argo Rollouts CLI

3.2. 部署推出部署

作为集群管理员,您可以将 Argo Rollouts 配置为逐渐将用户流量的子集路由到新应用程序版本。然后您可以测试应用程序是否部署并正常工作。

以下示例步骤会创建一个 rollouts-demo rollout 和 service。然后,推出部署会将 20% 的流量路由到应用程序的 canary 版本,等待手动提升,然后执行多个自动化提升,直到其将整个流量路由到新应用程序版本。

流程

  1. 在 Web 控制台的 Administrator 视角中,点 OperatorsInstalled OperatorsRed Hat OpenShift GitOpsRollout
  2. Project 下拉菜单中选择您要创建和配置 Rollout 自定义资源(CR)的项目。
  3. Create Rollout,然后在 YAML 视图中输入以下配置:

    apiVersion: argoproj.io/v1alpha1
    kind: Rollout
    metadata:
      name: rollouts-demo
    spec:
      replicas: 5
      strategy:
        canary: 
    1
    
          steps: 
    2
    
          - setWeight: 20 
    3
    
          - pause: {}  
    4
    
          - setWeight: 40
          - pause: {duration: 45}  
    5
    
          - setWeight: 60
          - pause: {duration: 20}
          - setWeight: 80
          - pause: {duration: 10}
      revisionHistoryLimit: 2
      selector:
        matchLabels:
          app: rollouts-demo
      template: 
    6
    
        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
    Copy to Clipboard Toggle word wrap
    1
    rollout 必须使用的部署策略。
    2
    指定推出部署的步骤。这个示例逐步将 20%、40%、60% 和 80% 的流量路由到 Canary 版本。
    3
    必须定向到 Canary 版本的流量百分比。20 表示 20% 的流量被定向到 Canary 版本。
    4
    指定 Argo Rollouts 控制器,以无限期暂停,直到找到用于提升的请求。
    5
    指定 Argo Rollouts 控制器在 45 秒期间暂停 45 秒。您可以以秒为单位设置持续时间值(s)、分钟(m)或小时(h)。例如,您可以指定 1h,表示一小时。如果没有指定值,则持续时间值默认为 seconds。
    6
    指定要创建的 pod。
  4. Create

    注意

    为确保推出部署在创建时快速可用,Argo Rollouts 控制器会自动将 argoproj/rollouts-demo:blue 初始容器镜像(在 .spec.template.spec.containers.image 字段中指定)视为稳定版本。在初始实例中,Rollout 资源的创建会将所有流量路由到应用程序的稳定版本,并跳过流量发送到 canary 版本的部分。但是,对于所有后续应用程序升级,对 .spec.template.spec.containers.image 字段进行修改,Argo Rollouts 控制器照常执行 canary 步骤。

  5. 运行以下命令验证您的 rollout 是否已正确创建:

    $ oc argo rollouts list rollouts -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定定义 Rollout 资源的命名空间。

    输出示例

    NAME           STRATEGY   STATUS        STEP  SET-WEIGHT  READY  DESIRED  UP-TO-DATE  AVAILABLE
    rollouts-demo  Canary     Healthy       8/8   100         5/5    5        5           5
    Copy to Clipboard Toggle word wrap

  6. 创建以 rollouts-demo rollout 为目标的 Kubernetes 服务。

    1. 在 Web 控制台的 Administrator 视角中,点 NetworkingServices
    2. Create Service,然后在 YAML 视图中输入以下配置:

      apiVersion: v1
      kind: Service
      metadata:
        name: rollouts-demo
      spec:
        ports: 
      1
      
        - port: 80
          targetPort: http
          protocol: TCP
          name: http
      
        selector: 
      2
      
          app: rollouts-demo
      Copy to Clipboard Toggle word wrap
      1
      指定应用程序用来在容器内运行的端口名称。
      2
      确保 selector 字段的内容与 Rollout 自定义资源(CR)中的相同。
    3. Create

      rollouts 会自动使用 canary ReplicaSet 的 pod 模板哈希更新创建的服务。例如: rollouts-pod-template-hash: 687d76d795

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

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

    输出示例

    Name:            rollouts-demo
    Namespace:       spring-petclinic
    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
    Copy to Clipboard Toggle word wrap

    创建推出部署后,您可以验证 rollout 的 Status 字段显示 Phase: Healthy

  8. Rollout 选项卡中,验证 rollouts-demo rollout 的 Status 字段显示为 Phase: Healthy

    提示

    另外,您可以运行以下命令来验证 rollout 是否健康:

    $ oc argo rollouts status rollouts-demo -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定定义 Rollout 资源的命名空间。

    输出示例

    Healthy
    Copy to Clipboard Toggle word wrap

现在,您可以执行 Rollout CR 的 Canary 部署。

3.3. 更新推出部署

当您使用对 .spec.template.spec 字段的修改来更新 Rollout 自定义资源(CR)时,例如容器镜像版本,然后使用更新的容器镜像版本通过 ReplicaSet 创建新的 pod。

流程

  1. 通过修改推出部署中部署的容器镜像,模拟应用程序的新 canary 版本。

    1. 在 Web 控制台的 Administrator 视角中,进入 OperatorsInstalled OperatorsRed Hat OpenShift GitOpsRollout
    2. 选择现有的 rollouts-demo rollout,并在 YAML 视图中修改 .spec.template.spec.containers.image 值从 argoproj/rollouts-demo:blue 改为 argoproj/rollouts-demo:yellow
    3. 单击 Save,然后单击 Reload

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

      注意

      根据 Rollout CR 的 .spec.strategy.canary.steps 字段中定义的 setWeight 属性,最初到路由的 20% 到达 canary 版本,并且 rollout 会无限期暂停,直到收到提升请求为止。

      带有 20% 的流量路由到 canary 版本和 rollout 的路由会无限期暂停,直到后续步骤中指定用于提升的请求

      spec:
        replicas: 5
        strategy:
          canary: 
      1
      
            steps: 
      2
      
            - setWeight: 20 
      3
      
            - pause: {}  
      4
      
        # (...)
      Copy to Clipboard Toggle word wrap

      1
      rollout 必须使用的部署策略。
      2
      推出部署的步骤。这个示例逐步将 20%、40%、60% 和 80% 的流量路由到 Canary 版本。
      3
      必须定向到 Canary 版本的流量百分比。20 表示 20% 的流量被定向到 Canary 版本。
      4
      Argo Rollouts 控制器的规格,以无限期暂停,直到找到用于提升的请求。
  2. 运行以下命令监控推出部署的进度:

    $ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定定义 Rollout CR 的命名空间。

    输出示例

    Name:            rollouts-demo
    Namespace:       spring-petclinic
    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:       5
      Updated:       1
      Ready:         5
      Available:     5
    
    NAME                                       KIND        STATUS     AGE    INFO
    ⟳ rollouts-demo                            Rollout     ॥ Paused   9m51s
    ├──# 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
    Copy to Clipboard Toggle word wrap

    rollout 现在处于暂停状态,因为 rollout 的更新策略配置中没有指定暂停持续时间。

  3. 重复上一步来测试新部署的应用程序版本,并确保它按预期工作。例如,通过浏览器与应用交互并尝试运行测试或观察容器日志来验证应用。

    推出部署将保持暂停,直到您将其提升到下一步。

验证新版本应用程序是否按预期工作后,您可以决定是否继续提升或中止推出部署。因此,请按照 "Promoting the rollout" 或 "Manually abort the rollout" 中的说明进行操作。

3.4. 提升推出部署

因为您的推出部署现在处于暂停状态,作为集群管理员,因此您必须手动提升推出部署以允许其进入下一步。

流程

  1. 在 Argo Rollouts CLI 中运行以下命令来模拟另一个新的 canary 版本:

    $ oc argo rollouts promote rollouts-demo -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定定义 Rollout 资源的命名空间。

    输出示例

    rollout 'rollouts-demo' promoted
    Copy to Clipboard Toggle word wrap

    这会在 canary 版本中将流量权重增加到 40%。

  2. 运行以下命令,验证推出部署是否通过步骤的其余部分:

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

    因为 Rollout CR 中定义的其余步骤设置了持续时间,例如 pause: {duration: 45},所以 Argo Rollouts 控制器会等待该持续时间,然后自动移到下一步。

    成功完成所有步骤后,新的 ReplicaSet 对象会被标记为 stable 副本集。

    输出示例

    Name:            rollouts-demo
    Namespace:       spring-petclinic
    Status:          ✔ Healthy
    Strategy:        Canary
      Step:          8/8
      SetWeight:     100
      ActualWeight:  100
    Images:          argoproj/rollouts-demo:yellow (stable)
    Replicas:
      Desired:       5
      Current:       5
      Updated:       5
      Ready:         5
      Available:     5
    
    NAME                                       KIND        STATUS        AGE   INFO
    ⟳ rollouts-demo                            Rollout     ✔ Healthy     14m
    ├──# revision:2
    │  └──⧉ rollouts-demo-6cf78c66c5           ReplicaSet  ✔ Healthy     6m5s  stable
    │     ├──□ rollouts-demo-6cf78c66c5-zrgd4  Pod         ✔ Running     6m4s  ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-g9kd5  Pod         ✔ Running     2m4s  ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-2ptpp  Pod         ✔ Running     78s   ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-tmk6c  Pod         ✔ Running     58s   ready:1/1
    │     └──□ rollouts-demo-6cf78c66c5-zv6lx  Pod         ✔ Running     47s   ready:1/1
    └──# revision:1
       └──⧉ rollouts-demo-687d76d795           ReplicaSet  • ScaledDown  14m
    Copy to Clipboard Toggle word wrap

3.5. 手动中止推出部署

在使用 canary 部署时,推出部署会部署一个应用程序的初始 Canary 版本。您可以手动或以编程方式验证它。验证 Canary 版本并将其提升到 stable 后,会为所有用户提供新的稳定版本。

但是,有时在 canary 版本中发现错误、错误或部署问题,您可能需要中止 canary rollout 并回滚到应用程序的稳定版本。

中止 canary rollout 会删除新 canary 版本的资源,并恢复应用程序的以前的稳定版本。所有被定向到 canary 的入口流量,如 ingress、route 或虚拟服务都将返回到原始稳定版本。

以下示例步骤部署应用程序的新 红色 Canary 版本,然后在完全提升为 stable 前中止它。

流程

  1. 更新容器镜像版本,并通过在 Argo Rollouts CLI 中运行以下命令 来修改 argoproj/rollouts-demo:yellowargoproj/rollouts-demo:red

    $ oc argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:red -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定定义 Rollout 自定义资源(CR)的命名空间。

    输出示例

    rollout "rollouts-demo" image updated
    Copy to Clipboard Toggle word wrap

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

  2. 等待推出部署到达暂停状态。
  3. 运行以下命令,验证 rollouts-demo:red canary 版本是否部署了 paused 状态:

    $ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定定义 Rollout CR 的命名空间。

    输出示例

    Name:            rollouts-demo
    Namespace:       spring-petclinic
    Status:          ॥ Paused
    Message:         CanaryPauseStep
    Strategy:        Canary
      Step:          1/8
      SetWeight:     20
      ActualWeight:  20
    Images:          argoproj/rollouts-demo:red (canary)
                     argoproj/rollouts-demo:yellow (stable)
    Replicas:
      Desired:       5
      Current:       5
      Updated:       1
      Ready:         5
      Available:     5
    
    NAME                                       KIND        STATUS        AGE    INFO
    ⟳ rollouts-demo                            Rollout     ॥ Paused      17m
    ├──# revision:3
    │  └──⧉ rollouts-demo-5747959bdb           ReplicaSet  ✔ Healthy     75s    canary
    │     └──□ rollouts-demo-5747959bdb-fdrsg  Pod         ✔ Running     75s    ready:1/1
    ├──# revision:2
    │  └──⧉ rollouts-demo-6cf78c66c5           ReplicaSet  ✔ Healthy     9m45s  stable
    │     ├──□ rollouts-demo-6cf78c66c5-zrgd4  Pod         ✔ Running     9m44s  ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-2ptpp  Pod         ✔ Running     4m58s  ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-tmk6c  Pod         ✔ Running     4m38s  ready:1/1
    │     └──□ rollouts-demo-6cf78c66c5-zv6lx  Pod         ✔ Running     4m27s  ready:1/1
    └──# revision:1
       └──⧉ rollouts-demo-687d76d795           ReplicaSet  • ScaledDown  17m
    Copy to Clipboard Toggle word wrap

  4. 运行以下命令中止推出部署的更新:

    $ oc argo rollouts abort rollouts-demo -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定定义 Rollout CR 的命名空间。

    输出示例

    rollout 'rollouts-demo' aborted
    Copy to Clipboard Toggle word wrap

    Argo Rollouts 控制器删除应用程序的 canary 资源,并回滚到稳定版本。

  5. 运行以下命令,在中止推出部署后验证 canary ReplicaSet 是否已扩展到 0 个副本:

    $ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定定义 Rollout CR 的命名空间。

    输出示例

    Name:            rollouts-demo
    Namespace:       spring-petclinic
    Status:          ✖ Degraded
    Message:         RolloutAborted: Rollout aborted update to revision 3
    Strategy:        Canary
      Step:          0/8
      SetWeight:     0
      ActualWeight:  0
    Images:          argoproj/rollouts-demo:yellow (stable)
    Replicas:
      Desired:       5
      Current:       5
      Updated:       0
      Ready:         5
      Available:     5
    
    NAME                                       KIND        STATUS        AGE    INFO
    ⟳ rollouts-demo                            Rollout     ✖ Degraded    24m
    ├──# revision:3
    │  └──⧉ rollouts-demo-5747959bdb           ReplicaSet  • ScaledDown  7m38s  canary
    ├──# revision:2
    │  └──⧉ rollouts-demo-6cf78c66c5           ReplicaSet  ✔ Healthy     16m    stable
    │     ├──□ rollouts-demo-6cf78c66c5-zrgd4  Pod         ✔ Running     16m    ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-2ptpp  Pod         ✔ Running     11m    ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-tmk6c  Pod         ✔ Running     11m    ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-zv6lx  Pod         ✔ Running     10m    ready:1/1
    │     └──□ rollouts-demo-6cf78c66c5-mlbsh  Pod         ✔ Running     4m47s  ready:1/1
    └──# revision:1
       └──⧉ rollouts-demo-687d76d795           ReplicaSet  • ScaledDown  24m
    Copy to Clipboard Toggle word wrap

    rollout 状态标记为 Degraded,这表示即使应用程序已回滚到以前的稳定版本 yellow,但 rollout 目前不在所需的版本 red 中,它已在 .spec.template.spec.containers.image 字段中设置。

    注意

    Degraded 状态不反映应用程序的健康状况。它仅表示想要和运行容器镜像版本之间存在不匹配。

  6. 运行以下命令,将容器镜像版本更新至以前的稳定版本 yellow,并修改 .spec.template.spec.containers.image 值:

    $ oc argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定定义 Rollout CR 的命名空间。

    输出示例

    rollout "rollouts-demo" image updated
    Copy to Clipboard Toggle word wrap

    rollout 会跳过分析和提升步骤,回滚到以前的稳定版本,黄色,并快速跟踪 stable ReplicaSet 的部署。

  7. 运行以下命令,验证 rollout 状态是否马上标记为 Healthy

    $ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定定义 Rollout CR 的命名空间。

    输出示例

    Name:            rollouts-demo
    Namespace:       spring-petclinic
    Status:          ✔ Healthy
    Strategy:        Canary
      Step:          8/8
      SetWeight:     100
      ActualWeight:  100
    Images:          argoproj/rollouts-demo:yellow (stable)
    Replicas:
      Desired:       5
      Current:       5
      Updated:       5
      Ready:         5
      Available:     5
    
    NAME                                       KIND        STATUS        AGE  INFO
    ⟳ rollouts-demo                            Rollout     ✔ Healthy     63m
    ├──# revision:4
    │  └──⧉ rollouts-demo-6cf78c66c5           ReplicaSet  ✔ Healthy     55m  stable
    │     ├──□ rollouts-demo-6cf78c66c5-zrgd4  Pod         ✔ Running     55m  ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-2ptpp  Pod         ✔ Running     50m  ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-tmk6c  Pod         ✔ Running     50m  ready:1/1
    │     ├──□ rollouts-demo-6cf78c66c5-zv6lx  Pod         ✔ Running     50m  ready:1/1
    │     └──□ rollouts-demo-6cf78c66c5-mlbsh  Pod         ✔ Running     44m  ready:1/1
    ├──# revision:3
    │  └──⧉ rollouts-demo-5747959bdb           ReplicaSet  • ScaledDown  46m
    └──# revision:1
       └──⧉ rollouts-demo-687d76d795           ReplicaSet  • ScaledDown  63m
    Copy to Clipboard Toggle word wrap

第 4 章 使用 Argo Rollouts 路由流量

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

使用 Openshift Routes,您可以配置 Argo Rollouts,以减少或增加流量数量,方法是将其定向到集群环境中的各种应用程序。

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

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

4.1. 先决条件

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

以下示例步骤会创建一个路由、推出部署和两个服务。然后,它会将流量增加的百分比路由到应用的 canary 版本,然后该 Canary 状态标记为成功,并成为新的稳定版本。

先决条件

  • 以管理员身份登录到 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 控制台的 Administrator 视角中,点 NetworkingRoutes
    2. 点击 Create Route
    3. Create Route 页面中,点 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
      Copy to Clipboard Toggle word wrap
      1
      指定应用程序用来在容器内运行的端口名称。
      2
      指定用于保护路由的 TLS 配置。
      3
      目标稳定服务的名称。
      4
      使用 Route Rollout 插件自动将此字段修改为稳定的权重。
      5
      目标 canary 服务的名称。
      6
      使用 Route Rollout 插件自动将此字段修改为 canary weight。
    4. 单击 Create 以创建路由。然后,它会在 Routes 页面中显示。
  2. 创建要在路由中引用的服务 Canary 和 stable。

    1. 在 Web 控制台的 Administrator 视角中,点 NetworkingServices
    2. Create Service
    3. Create Service 页面上,单击 YAML 视图 并添加以下代码片段:以下示例创建一个名为 argo-rollouts-canary-service 的 canary 服务。Canary 流量定向到此服务。

      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
      Copy to Clipboard Toggle word wrap
      1
      指定应用程序用来在容器内运行的端口名称。
      2
      确保 selector 字段的内容与 stable 服务和 Rollout 自定义资源(CR)相同。
      重要

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

    4. 单击 Create 以创建 Canary 服务。

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

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

      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
      Copy to Clipboard Toggle word wrap
      1
      指定应用程序用来在容器内运行的端口名称。
      2
      确保 selector 字段的内容与 canary service 和 Rollout CR 相同。
      重要

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

    6. Create 创建 stable 服务。

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

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

    1. 在 Web 控制台的 Administrator 视角中,进入 OperatorsInstalled OperatorsRed Hat OpenShift GitOpsRollout
    2. Create Rollout 页面上,点 YAML view 并添加以下代码片段:以下示例创建一个名为 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
      Copy to Clipboard Toggle word wrap
      1
      指定要创建的 pod。
      2
      这个值必须与创建的 canary Service 的名称匹配。
      3
      这个值必须与创建的 stable Service 的名称匹配。
      4
      这个值必须与创建的 Route CR 的名称匹配。
      5
      指定推出部署的步骤。这个示例逐步将 30%、60% 和 100% 流量路由到 Canary 版本。
      6
      确保 selector 字段的内容与 Canary 和 stable 服务中的相同。
    3. Create
    4. Rollout 选项卡中,验证 rollout 的 Status 字段显示 Phase: Healthy
  4. 验证路由是否将 100% 的流量定向到应用程序的稳定版本。

    注意

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

    1. 进入 NetworkingRoutes,并查找您要验证 的路由 资源。
    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
      Copy to Clipboard Toggle word wrap

      1
      0 表示 0% 的流量被定向到 Canary 版本。
      2
      100 表示 100% 的流量被定向到稳定版本。
  5. 通过修改推出部署中部署的容器镜像,模拟应用程序的新 canary 版本。

    1. 在 Web 控制台的 Administrator 视角中,进入 OperatorsInstalled OperatorsRed Hat OpenShift GitOpsRollout
    2. 选择现有的 Rollout 并将 .spec.template.spec.containers.image 值从 argoproj/rollouts-demo:blue 改为 argoproj/rollouts-demo:yellow

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

      注意

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

      带有 30% 的流量的路由会定向到 Canary 版本,70% 定向到稳定版本。

      spec:
        alternateBackends:
        - kind: Service
          name: argo-rollouts-canary-service
          weight: 30
        # (...)
        to:
          kind: Service
          name: argo-rollouts-stable-service
          weight: 70
      Copy to Clipboard Toggle word wrap

  6. 在 Argo Rollouts CLI 中运行以下命令来模拟另一个新的 canary 版本:

    $ oc argo rollouts promote rollouts-demo -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定定义 Rollout 资源的命名空间。

    在 stable 版本中,这会将 canary 版本和 40% 的流量权重增加到 60%。

    带有 60% 的流量的路由定向到 Canary 版本,40% 定向到稳定版本。

    spec:
      alternateBackends:
      - kind: Service
        name: argo-rollouts-canary-service
        weight: 60
      # (...)
      to:
        kind: Service
        name: argo-rollouts-stable-service
        weight: 40
    Copy to Clipboard Toggle word wrap

  7. 运行以下命令,将 canary 版本中的流量权重增加到 100%,并丢弃应用程序的旧稳定版本中的流量:

    $ oc argo rollouts promote rollouts-demo -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定定义 Rollout 资源的命名空间。

    带有 0% 的流量的示例路由定向到 Canary 版本,100% 定向到稳定版本。

    spec:
      # (...)
      to:
        kind: Service
        name: argo-rollouts-stable-service
        weight: 100
    Copy to Clipboard Toggle word wrap

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%

您可以通过创建以下项目来使用 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:
          - "*"
      Copy to Clipboard Toggle word wrap

      1
      网关的名称。
      2
      指定入口网关的名称。网关配置公开的端口和协议,但不包括任何流量路由配置。
    2. 运行以下命令来应用 YAML 文件。

      $ oc apply -f gateway.yaml
      Copy to Clipboard Toggle word wrap
  2. 为应用的 canary 和 stable 版本创建服务。

    1. 在 Web 控制台的 Administrator 视角中,进入 NetworkingServices
    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
      Copy to Clipboard Toggle word wrap
      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
      Copy to Clipboard Toggle word wrap
      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
      Copy to Clipboard Toggle word wrap
      1
      网关的名称。
      2
      目标稳定服务的名称。
      3
      指定用于侦听流量的端口号。
      4
      目标 canary 服务的名称。
      5
      指定用于保护 VirtualService 的 TLS 配置。
    2. 运行以下命令来应用 YAML 文件。

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

    1. 在 Web 控制台的 Administrator 视角中,进入 OperatorsInstalled OperatorsRed Hat OpenShift GitOpsRollout
    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
      Copy to Clipboard Toggle word wrap
      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
      Copy to Clipboard Toggle word wrap
      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
      Copy to Clipboard Toggle word wrap

      注意

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

    2. 要验证服务网格是否为 stable 服务发送 100% 的流量,对 canary 服务发送 0%,请运行以下命令:

      $ oc describe virtualservice/rollouts-demo-vsvc -n <namespace>
      Copy to Clipboard Toggle word wrap
    3. 查看终端中显示的以下输出:

      route
      - destination:
          host: rollouts-demo-stable
        weight: 100 
      1
      
      - destination:
          host: rollouts-demo-canary
        weight: 0 
      2
      Copy to Clipboard Toggle word wrap
      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>
      Copy to Clipboard Toggle word wrap

      因此,在 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
      Copy to Clipboard Toggle word wrap
      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
      Copy to Clipboard Toggle word wrap

      例如,80% 定向到稳定版本,20% 的流量定向到 Canary 版本。

      route
      - destination:
          host: rollouts-demo-stable
        weight: 80 
      1
      
      - destination:
          host: rollouts-demo-canary
        weight: 20 
      2
      Copy to Clipboard Toggle word wrap

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

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

      $ oc argo rollouts get rollout rollouts-demo --watch -n <namespace> 
      1
      Copy to Clipboard Toggle word wrap
      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
      Copy to Clipboard Toggle word wrap

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

      route
      - destination:
          host: rollouts-demo-stable
        weight: 60 
      1
      
      - destination:
          host: rollouts-demo-canary
        weight: 40 
      2
      Copy to Clipboard Toggle word wrap

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

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

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

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

Red Hat OpenShift GitOps 支持 Argo Rollouts 安装的两种模式:

  • 集群范围的安装 (默认):任何命名空间中定义的 Argo Rollouts 自定义资源(CR)由 Argo Rollouts 实例协调。因此,您可以在集群的任意命名空间中使用 Argo Rollouts CR。
  • 命名空间范围的安装 :Argo Rollouts 实例安装在特定命名空间中,并只处理同一命名空间中的 Argo Rollouts CR。这个安装模式包括以下优点:

    • 这个模式不需要集群范围的 ClusterRoleClusterRoleBinding 权限。您可以在单一命名空间中安装和使用 Argo Rollouts,而无需集群权限。
    • 此模式通过将单个 Argo Rollouts 实例的集群范围限制为特定命名空间来提供安全优势。
注意

为了防止意外的权限升级,Red Hat OpenShift GitOps 一次只允许一个模式 Argo Rollout 安装。

要在集群范围的 Argo Rollouts 安装间切换,请完成以下步骤。

6.1. 配置命名空间范围的 Argo Rollouts 安装

要配置命名空间范围的实例 Argo Rollouts 安装,请完成以下步骤。

先决条件

  • 以管理员身份登录到 Red Hat OpenShift GitOps 集群。
  • 您已在 Red Hat OpenShift GitOps 集群上安装了 Red Hat OpenShift GitOps。

流程

  1. 在 Web 控制台的 Administrator 视角中,进入 AdministrationCustomResourceDefinitions
  2. 搜索 Subscription 并点 Subscription CRD。
  3. Instances 选项卡,然后点 openshift-gitops-operator 订阅。
  4. YAML 选项卡并编辑 YAML 文件。

    1. 指定 NAMESPACE_SCOPED_ARGO_ROLLOUTS 环境变量,并在 .spec.config.env 属性中设置为 true

      配置命名空间范围的 Argo Rollouts 安装示例

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: openshift-gitops-operator
      spec:
        # (...)
        config:
          env:
            - name: NAMESPACE_SCOPED_ARGO_ROLLOUTS
              value: 'true' 
      1
      Copy to Clipboard Toggle word wrap

      1
      设置为 'true' 可启用命名空间范围的安装。如果值设为 'false' 或没有指定安装,则默认为集群范围的模式。
    2. 点击 Save

      Red Hat OpenShift GitOps Operator 有助于协调命名空间范围的安装中的 Argo Rollouts 自定义资源。

  5. 通过查看 GitOps 容器的日志来验证 Red Hat OpenShift GitOps Operator 是否已启用了命名空间范围的 Argo Rollouts 安装:

    1. 在 Web 控制台的 Administrator 视角中,进入 WorkloadsPods
    2. openshift-gitops-operator-controller-manager pod,然后点 Logs 选项卡。
    3. 查找以下日志语句: 在全命名空间范围模式中运行。此声明表示 Red Hat OpenShift GitOps Operator 启用了命名空间范围的 Argo Rollouts 安装。
  6. 创建一个 RolloutManager 资源,以完成命名空间范围的 Argo Rollouts 安装:

    1. 进入 OperatorsInstalled OperatorsRed Hat OpenShift GitOps,然后点击 RolloutManager 选项卡。
    2. 单击 Create RolloutManager
    3. 选择 YAML 视图 并输入以下片断:

      命名空间范围的 Argo Rollouts 安装的 RolloutManager CR 示例

      apiVersion: argoproj.io/v1alpha1
      kind: RolloutManager
      metadata:
        name: rollout-manager
        namespace: my-application 
      1
      
      spec:
        namespaceScoped: true
      Copy to Clipboard Toggle word wrap

      1
      指定要安装命名空间范围的 Argo Rollouts 实例的项目名称。
    4. Create

      创建 RolloutManager CR 后,Red Hat OpenShift GitOps 开始将命名空间范围的 Argo Rollouts 实例安装到所选命名空间中。

  7. 验证命名空间范围的安装是否成功。

    1. RolloutManager 选项卡中,确保 RolloutManagers 部分下的 Status 字段是 Phase: Available
    2. RolloutManagers 部分下的 YAML 标签页中检查以下输出,以确保安装成功:

      命名空间范围的 Argo Rollouts 安装 YAML 文件示例

      spec:
        namespaceScoped: true
      status:
        conditions:
          lastTransitionTime: '2024-07-10T14:20:5z`
          message: ''
          reason: Success
          status: 'True' 
      1
      
          type: 'Reconciled'
        phase: Available
        rolloutController: Available
      Copy to Clipboard Toggle word wrap

      1
      此状态表示命名空间范围 Argo Rollouts 安装已被成功启用。

      如果您试图在集群范围的安装已存在于集群中时安装特定于命名空间的 Argo Rollouts 实例,则会显示错误消息:

      出错信息安装示例

      spec:
        namespaceScoped: true
      status:
        conditions:
         lastTransitionTime: '2024-07-10T14:10:7z`
         message: 'when Subscription has environment variable NAMESPACE_SCOPED_ARGO_ROLLOUTS set to False, there may not exist any namespace-scoped RolloutManagers: only a single cluster-scoped RolloutManager is supported'
         reason: InvalidRolloutManagerScope
         status: 'False' 
      1
      
         type: 'Reconciled'
        phase: Failure
        rolloutController: Failure
      Copy to Clipboard Toggle word wrap

      1
      此状态表示命名空间范围的 Argo Rollouts 安装没有成功启用。安装默认为集群范围的模式。

Argo Rollouts 支持通过 RolloutManager 自定义资源(CR)直接配置流量管理和指标插件。Argo Rollouts 中对这些插件的原生支持消除了手动修改配置映射的需要,确保系统间的配置一致。因此,Argo Rollouts 不再在配置映射中保留用户定义的插件。相反,它只适用于 RolloutManager CR 中指定的插件。通过直接在 RolloutManager CR 中管理插件,您可以执行以下操作:

  • 集中插件配置控制。
  • 避免 RolloutManager CR 和配置映射之间的冲突。
  • 通过轻松添加、删除或修改插件,而无需直接编辑配置映射,从而简化插件管理。

流量管理插件控制应用程序在不同版本之间如何路由,而指标插件收集和评估指标,以确定推出部署的成功或失败。

7.1. 先决条件

  • 以管理员身份登录到 OpenShift Container Platform 集群。
  • 访问 OpenShift Container Platform web 控制台。
  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps
  • 您已在 OpenShift Container Platform 集群中安装了 Argo Rollouts

7.2. 在 Argo Rollouts 中启用流量管理和指标插件

要在 Argo Rollouts 中启用流量管理和指标插件,请完成以下步骤。

流程

  1. 以集群管理员身份登录 OpenShift Container Platform Web 控制台。
  2. Administrator 视角中,点 OperatorsInstalled Operators
  3. Project 下拉菜单中选择您要创建和配置 RolloutManager 自定义资源 (CR) 的项目。
  4. Installed Operators 中选择 Red Hat OpenShift GitOps
  5. Details 选项卡中,在 Provided APIs 部分下,点 RolloutManager 窗格中的 Create instance
  6. Create RolloutManager 页面中,选择 YAML 视图 并编辑 YAML。

    RolloutManager CR 中添加流量管理和指标插件配置示例

    apiVersion: argoproj.io/v1alpha1
    kind: RolloutManager
    metadata:
      name: argo-rollouts
    spec:
      plugins:
        trafficManagement:
          - name: argoproj-labs/gatewayAPI 
    1
    
            location: https://github.com/sample-metric-plugin 
    2
    
        metric:
          - name: argoproj-labs/sample-prometheus 
    3
    
            location: https://github.com/sample-trafficrouter-plugin 
    4
    
            sha256: dac10cbf57633c9832a17f8c27d2ca34aa97dd3d 
    5
    Copy to Clipboard Toggle word wrap

    1
    指定 trafficManagement 插件的名称。
    2
    指定 trafficManagement 插件的位置。
    3
    指定 指标插件的名称
    4
    指定 指标 插件的位置。
    5
    可选:指定插件二进制文件的 SHA256 签名,该签名由 Rollouts 控制器下载并安装。
  7. Create
  8. RolloutManager 选项卡中,在 RolloutManagers 部分下,验证 RolloutManager 实例的 Status 字段显示为 Phase: Available
  9. 通过完成以下步骤验证流量管理和指标插件是否已正确安装:

    1. Administrator 视角中,点 WorkloadsConfigMaps
    2. argo-rollouts-config 配置映射。

      因此,RolloutManager CR 中定义的插件会在 argo-rollouts-config 配置映射中更新。

      argo-rollouts-config ConfigMap中更新的流量管理和指标插件示例

      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: argo-rollouts-config
        namespace: argo-rollouts
        labels:
          app.kubernetes.io/component: argo-rollouts
          app.kubernetes.io/name: argo-rollouts
          app.kubernetes.io/part-of: argo-rollouts
      data:
        metricPlugins: |
            - name: "argoproj-labs/sample-prometheus" 
      1
      
              location: https://github.com/sample-metric-plugin 
      2
      
              sha256: dac10cbf57633c9832a17f8c27d2ca34aa97dd3d 
      3
      
        trafficRouterPlugins: |
          - name: argoproj-labs/gatewayAPI 
      4
      
            location: https://github.com/sample-metric-plugin 
      5
      
            sha256: "" 
      6
      
          - name: argoproj-labs/openshift 
      7
      
            location: file:/plugins/rollouts-trafficrouter-openshift/openshift-route-plugin 
      8
      
            sha256: "" 
      9
      Copy to Clipboard Toggle word wrap

      1
      指定 指标插件的名称
      2
      指定 指标 插件的位置。
      3
      指定 指标 插件的 sha256 签名。
      4
      指定 trafficmanagement 插件的名称。
      5
      指定 trafficmanagement 插件的位置。
      6
      指定 trafficmanagement 插件的 sha256 签名。
      7
      指定默认 trafficmanagement 插件的名称。
      8
      指定默认 trafficmanagement 插件的位置。
      9
      指定 trafficmanagement 插件的 sha256 签名。

    通过直接通过 RolloutManager CR 配置流量和指标插件,您可以简化推出部署的过程,减少错误的机会,并确保在您的环境中进行一致的插件管理。这提高了控制和灵活性,同时简化部署流程。

第 8 章 为 Argo Rollouts 启用高可用性支持

Argo Rollouts 支持在 RolloutManager 自定义资源(CR)中启用高可用性(HA)。当您在 Argo Rollouts 中配置高可用性时,Red Hat OpenShift GitOps Operator 会自动使用 RolloutManager CR 中的 .spec.ha 字段为 Argo Rollouts 控制器将 pod 数量设置为 2。它还激活领导选举机制,允许 Pod 在主动 - 被动进程中运行。单个 pod 会主动管理推出部署,而其他 pod 处于被动状态,确保额外的副本在节点失败时提供冗余和可用性。

此功能通过确保它在没有停机或人工干预的情况下运行,从而让 Rollouts 控制器受益。它还在计划维护期间运行,因为第二个副本确保控制器平稳运行。在 Argo Rollouts 中启用高可用性可确保控制器保持可靠且弹性,即使在节点故障或繁重工作负载期间也是如此。

Red Hat OpenShift GitOps Operator 还确保默认应用反关联性规则。虽然这些规则不是用户定义的,但它们可确保控制器 pod 在不同的节点上分发,以避免出现单一故障点,从而可以恢复节点故障。

先决条件

  • 以管理员身份登陆到 OpenShift Container Platform 集群。
  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps
  • 您已在 OpenShift Container Platform 集群中安装了 Argo Rollouts

8.1. 为 Argo Rollouts 配置高可用性

要启用高可用性,请完成以下步骤,在 RolloutManager 自定义资源(CR)中配置 ha 规格:

流程

  1. 以集群管理员身份登录 OpenShift Container Platform Web 控制台。
  2. Administrator 视角中,点 OperatorsInstalled Operators
  3. Project 下拉菜单中选择您要创建和配置 RolloutManager CR 的项目。
  4. 从安装的 Operator 中选择 Red Hat OpenShift GitOps
  5. Details 选项卡中,在 Provided APIs 部分下,点 RolloutManager 窗格中的 Create instance
  6. Create RolloutManager 页面中,选择 YAML 视图 并编辑 YAML。

    RolloutManager CR 中启用 ha 字段的示例

    apiVersion: argoproj.io/v1alpha1
    kind: RolloutManager
    metadata:
      name: argo-rollouts
      namespace: openshift-gitops
    spec:
      ha:
        enabled: true 
    1
    Copy to Clipboard Toggle word wrap

    1
    指定是否启用高可用性。如果值设为 true,则启用高可用性。
  7. Create
  8. RolloutManager 选项卡的 RolloutManagers 部分下,验证 RolloutManager 实例的 Status 字段显示为 Phase: Available
  9. 通过完成以下步骤验证 Rollouts 部署的状态:

    1. Administrator 视角中,点 WorkloadsDeployments
    2. 单击 argo-rollouts 部署。
    3. 单击 Details 选项卡,并确认 Rollouts 部署中副本数现在已设置为 2。
    4. YAML 选项卡,并确认显示以下配置:

      Argo Rollouts 部署配置文件示例

      kind: Deployment
      metadata:
        name: argo-rollouts
        namespace: openshift-gitops
      spec:
        replicas: 2 
      1
      
        selector:
          matchLabels:
            app.kubernetes.io/name: argo-rollouts
        template:
          metadata:
            creationTimestamp: null
            labels:
              app.kubernetes.io/name: argo-rollouts
          spec:
            containers:
                args:
                  - '--leader-elect'
                  - 'true' 
      2
      Copy to Clipboard Toggle word wrap

      1
      指定 pod 数量。
      2
      指定将 --leader-elect=true 标志传递给 Rollouts 部署。虽然此标志默认设置为 true,但明确设置它可确保领导选举保持一致强制执行。

context: use-cluster-scoped-argo-rollouts-instance-to-manage-rollouts-resources

默认情况下,Argo Rollouts 支持 Argo Rollouts 自定义资源(CR)的集群范围的模式。这个安装模式使用 CLUSTER_SCOPED_ARGO_ROLLOUTS_NAMESPACES 环境变量来指定可用于管理推出部署资源的命名空间列表。

要管理 Argo Rollouts 资源,请在集群中安装 Red Hat OpenShift GitOps Operator 后,您可以在您选择的命名空间中创建和配置 RolloutManager 自定义资源(CR)实例。然后,您可以更新 Red Hat OpenShift GitOps Operator 的现有 Subscription 对象,并将用户定义的命名空间添加到 Argo CD 实例的 spec 部分中的 CLUSTER_SCOPED_ARGO_ROLLOUTS_NAMESPACES 环境变量中。

9.1. 先决条件

  • 以管理员身份登录到 OpenShift Container Platform 集群。
  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps Operator。
  • 您已创建了 RolloutManager 自定义资源。

要配置集群范围的 Argo Rollouts 实例来管理推出部署资源,请在 Subscription 资源中添加 CLUSTER_SCOPED_ARGO_ROLLOUTS_NAMESPACES 环境变量。此变量包含用户定义的命名空间列表,可为集群范围的 Argo Rollouts 安装配置。如果 CLUSTER_SCOPED_ARGO_ROLLOUTS_NAMESPACES 环境变量为空,您可以在 openshift-gitops 命名空间中创建集群范围的 Argo Rollouts 安装。

注意

只有 NAMESPACE_SCOPED_ARGO_ROLLOUTS 变量设为 false 时,您只能创建集群范围的 Argo Rollouts 实例。默认情况下,如果没有定义 NAMESPACE_SCOPED_ARGO_ROLLOUTS 变量,则设置为 false

流程

  1. 在 Web 控制台的 Administrator 视角中,进入到 OperatorsInstalled OperatorsRed Hat OpenShift GitOpsSubscription
  2. 单击 Actions 列表,然后单击 Edit Subscription
  3. openshift-gitops-operator 订阅详情页面的 YAML 选项卡下,通过将 Argo CD 实例的命名空间添加到 spec 部分中的 CLUSTER_SCOPED_ARGO_ROLLOUTS_NAMESPACES 环境变量来编辑 Subscription YAML 文件:

    配置 CLUSTER_SCOPED_ARGO_ROLLOUTS_NAMESPACES 环境变量的示例

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: openshift-gitops-operator
    spec:
      config:
       env:
        - name: NAMESPACE_SCOPED_ARGO_ROLLOUTS
          value: 'false' 
    1
    
        - name: CLUSTER_SCOPED_ARGO_ROLLOUTS_NAMESPACES
          value: <list_of_namespaces_in_the_cluster-scoped_Argo_CD_instances> 
    2
    
     ...
    Copy to Clipboard Toggle word wrap

    1
    指定这个值来启用或禁用集群范围的安装。如果值设为 'false',这表示您已启用了集群范围的安装。如果设置为 'true',这表示您已启用了命名空间范围的安装。如果该值为空,则默认为 false
    2
    指定以逗号分隔的命名空间列表,它可以托管集群范围的 Argo Rollouts 实例,如 test-123-cluster-scoped,test-456-cluster-scoped
  4. 单击 Save and Reload

法律通告

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部