第 4 章 在 Argo CD Application Controller 副本间分片集群


如果控制器管理太多集群并使用太多内存,您可以在多个 Argo CD Application Controller 副本间分片集群。

4.1. 启用循环分片算法

重要

循环 分片算法只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

默认情况下,Argo CD Application Controller 使用非统一 旧的 基于哈希的分片算法将集群分配给分片。这可能导致集群分布不均匀。您可以启用 循环 分片算法,在所有分片间实现更多相同的集群分布。

在 Red Hat OpenShift GitOps 中使用 循环 分片算法具有以下优点:

  • 确保更平衡的工作负载分布
  • 防止分片过载或使用率不足
  • 优化计算资源的效率
  • 降低瓶颈风险
  • 提高 Argo CD 系统的整体性能和可靠性

通过引入替代分片算法,可以根据具体用例进行进一步自定义。您可以选择最适合您的部署需求的算法,这会导致在各种操作场景中具有更大的灵活性和适应性。

提示

要在 GitOps 中使用替代分片算法的好处,在部署过程中启用分片至关重要。

4.1.1. 在 web 控制台中启用循环分片算法

您可以使用 OpenShift Container Platform Web 控制台启用 循环 分片算法。

先决条件

  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps Operator。
  • 访问 OpenShift Container Platform web 控制台。
  • 您可以使用 cluster-admin 权限访问集群。

流程

  1. 在 Web 控制台的 Administrator 视角中,进入 Operators Installed Operators
  2. 从安装的 operator 点 Red Hat OpenShift GitOps,再进入 Argo CD 选项卡。
  3. 点击您要启用 round-robin 分片算法的 Argo CD 实例,如 openshift-gitops
  4. YAML 选项卡并编辑 YAML 文件,如下例所示:

    启用循环分片算法的 Argo CD 实例示例

    apiVersion: argoproj.io/v1beta1
    kind: ArgoCD
    metadata:
      name: openshift-gitops
      namespace: openshift-gitops
    spec:
      controller:
        sharding:
          enabled: true 1
          replicas: 3 2
        env: 3
          - name: ARGOCD_CONTROLLER_SHARDING_ALGORITHM
            value: round-robin
        logLevel: debug 4

    1
    sharding.enabled 参数设置为 true 以启用分片。
    2
    将副本数设置为所需的值,例如 3
    3
    将分片算法设置为 round-robin
    4
    将日志级别设置为 debug,以便您可以验证每个集群附加到哪个分片。
  5. 点击 Save

    此时会出现成功通知警报 openshift-gitops 到版本 <version>

    注意

    如果编辑默认的 openshift-gitops 实例,则会显示 Managed 资源 对话框。再次单击 Save 以确认更改。

  6. 通过执行以下步骤,验证将 round-robin 作为分片算法启用了分片:

    1. 进入 Workloads StatefulSets
    2. Project 下拉列表中选择安装 Argo CD 实例的命名空间。
    3. <instance_name>-application-controller,如 openshift-gitops-application-controller,然后进入 Pods 选项卡。
    4. 观察创建的应用程序控制器 pod 的数量。它应与集合副本数对应。
    5. 点要检查的控制器 pod,再进入 Logs 选项卡来查看 pod 日志。

      控制器 pod 日志片断示例

      time="2023-12-13T09:05:34Z" level=info msg="ArgoCD Application Controller is starting" built="2023-12-01T19:21:49Z" commit=a3vd5c3df52943a6fff6c0rg181fth3248976299 namespace=openshift-gitops version=v2.9.2+c5ea5c4
      time="2023-12-13T09:05:34Z" level=info msg="Processing clusters from shard 1"
      time="2023-12-13T09:05:34Z" level=info msg="Using filter function:  round-robin" 1
      time="2023-12-13T09:05:34Z" level=info msg="Using filter function:  round-robin"
      time="2023-12-13T09:05:34Z" level=info msg="appResyncPeriod=3m0s, appHardResyncPeriod=0s"

      1
      查找 "使用过滤器函数:round-robin" 消息。
    6. 在 log Search 字段中,搜索 由分片处理,以验证分片间的集群分布是否也是如此,如下例所示。

      重要

      确保将日志级别设置为 debug 以观察这些日志。

      控制器 pod 日志片断示例

      time="2023-12-13T09:05:34Z" level=debug msg="ClustersList has 3 items"
      time="2023-12-13T09:05:34Z" level=debug msg="Adding cluster with id= and name=in-cluster to cluster's map"
      time="2023-12-13T09:05:34Z" level=debug msg="Adding cluster with id=068d8b26-6rhi-4w23-jrf6-wjjfyw833n23 and name=in-cluster2 to cluster's map"
      time="2023-12-13T09:05:34Z" level=debug msg="Adding cluster with id=836d8b53-96k4-f68r-8wq0-sh72j22kl90w and name=in-cluster3 to cluster's map"
      time="2023-12-13T09:05:34Z" level=debug msg="Cluster with id= will be processed by shard 0" 1
      time="2023-12-13T09:05:34Z" level=debug msg="Cluster with id=068d8b26-6rhi-4w23-jrf6-wjjfyw833n23 will be processed by shard 1" 2
      time="2023-12-13T09:05:34Z" level=debug msg="Cluster with id=836d8b53-96k4-f68r-8wq0-sh72j22kl90w will be processed by shard 2" 3

      1 2 3
      在本例中,3 集群连续附加到分片 0、分片 1 和分片 2。
      注意

      如果集群 "C" 的数量是分片副本 "R" 的数量,则每个分片必须具有相同的分配的集群 "N",它等于 "C" 除以 "R"。上例演示了 3 个集群和 3 个副本,因此每个分片都有分配 1 个集群。

4.1.2. 使用 CLI 启用循环分片算法

您可以使用命令行界面启用 循环 分片算法。

先决条件

  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps Operator。
  • 您可以使用 cluster-admin 权限访问集群。

流程

  1. 运行以下命令,启用分片并将副本数设置为所需的值:

    $ oc patch argocd <argocd_instance> -n <namespace> --patch='{"spec":{"controller":{"sharding":{"enabled":true,"replicas":<value>}}}}' --type=merge

    输出示例

    argocd.argoproj.io/<argocd_instance> patched

  2. 运行以下命令,将分片算法配置为 round-robin

    $ oc patch argocd <argocd_instance> -n <namespace> --patch='{"spec":{"controller":{"env":[{"name":"ARGOCD_CONTROLLER_SHARDING_ALGORITHM","value":"round-robin"}]}}}' --type=merge

    输出示例

    argocd.argoproj.io/<argocd_instance> patched

  3. 运行以下命令,验证 Argo CD Application Controller pod 的数量是否与设置副本数对应:

    $ oc get pods -l app.kubernetes.io/name=<argocd_instance>-application-controller -n <namespace>

    输出示例

    NAME                                        READY   STATUS    RESTARTS   AGE
    <argocd_instance>-application-controller-0   1/1     Running   0          11s
    <argocd_instance>-application-controller-1   1/1     Running   0          32s
    <argocd_instance>-application-controller-2   1/1     Running   0          22s

  4. 运行以下命令,验证分片是否使用 round-robin 作为分片算法启用:

    $ oc logs <argocd_application_controller_pod> -n <namespace>

    输出片断示例

    time="2023-12-13T09:05:34Z" level=info msg="ArgoCD Application Controller is starting" built="2023-12-01T19:21:49Z" commit=a3vd5c3df52943a6fff6c0rg181fth3248976299 namespace=<namespace> version=v2.9.2+c5ea5c4
    time="2023-12-13T09:05:34Z" level=info msg="Processing clusters from shard 1"
    time="2023-12-13T09:05:34Z" level=info msg="Using filter function:  round-robin" 1
    time="2023-12-13T09:05:34Z" level=info msg="Using filter function:  round-robin"
    time="2023-12-13T09:05:34Z" level=info msg="appResyncPeriod=3m0s, appHardResyncPeriod=0s"

    1
    查找 "使用过滤器函数:round-robin" 消息。
  5. 通过执行以下步骤验证跨分片的集群分布是否是:

    1. 运行以下命令,将日志级别设置为 debug

      $ oc patch argocd <argocd_instance> -n <namespace> --patch='{"spec":{"controller":{"logLevel":"debug"}}}' --type=merge

      输出示例

      argocd.argoproj.io/<argocd_instance> patched

    2. 运行以下命令,查看日志 并搜索由分片处理 的日志,以观察每个集群所附加的分片:

      $ oc logs <argocd_application_controller_pod> -n <namespace> | grep "processed by shard"

      输出片断示例

      time="2023-12-13T09:05:34Z" level=debug msg="Cluster with id= will be processed by shard 0" 1
      time="2023-12-13T09:05:34Z" level=debug msg="Cluster with id=068d8b26-6rhi-4w23-jrf6-wjjfyw833n23 will be processed by shard 1" 2
      time="2023-12-13T09:05:34Z" level=debug msg="Cluster with id=836d8b53-96k4-f68r-8wq0-sh72j22kl90w will be processed by shard 2" 3

      1 2 3
      在本例中,3 集群连续附加到分片 0、分片 1 和分片 2。
      注意

      如果集群 "C" 的数量是分片副本 "R" 的数量,则每个分片必须具有相同的分配的集群 "N",它等于 "C" 除以 "R"。上例演示了 3 个集群和 3 个副本,因此每个分片都有分配 1 个集群。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.