第 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
权限访问集群。
流程
-
在 Web 控制台的 Administrator 视角中,进入 Operators
Installed Operators。 - 从安装的 operator 点 Red Hat OpenShift GitOps,再进入 Argo CD 选项卡。
-
点击您要启用
round-robin
分片算法的 Argo CD 实例,如openshift-gitops
。 点 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
点击 Save。
此时会出现成功通知警报
openshift-gitops 到版本 <version>
。注意如果编辑默认的
openshift-gitops
实例,则会显示 Managed 资源 对话框。再次单击 Save 以确认更改。通过执行以下步骤,验证将
round-robin
作为分片算法启用了分片:-
进入 Workloads
StatefulSets。 - 从 Project 下拉列表中选择安装 Argo CD 实例的命名空间。
- 点 <instance_name>-application-controller,如 openshift-gitops-application-controller,然后进入 Pods 选项卡。
- 观察创建的应用程序控制器 pod 的数量。它应与集合副本数对应。
点要检查的控制器 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"
消息。
在 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
注意如果集群 "C" 的数量是分片副本 "R" 的数量,则每个分片必须具有相同的分配的集群 "N",它等于 "C" 除以 "R"。上例演示了 3 个集群和 3 个副本,因此每个分片都有分配 1 个集群。
-
进入 Workloads
4.1.2. 使用 CLI 启用循环分片算法
您可以使用命令行界面启用 循环
分片算法。
先决条件
- 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps Operator。
-
您可以使用
cluster-admin
权限访问集群。
流程
运行以下命令,启用分片并将副本数设置为所需的值:
$ oc patch argocd <argocd_instance> -n <namespace> --patch='{"spec":{"controller":{"sharding":{"enabled":true,"replicas":<value>}}}}' --type=merge
输出示例
argocd.argoproj.io/<argocd_instance> patched
运行以下命令,将分片算法配置为
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
运行以下命令,验证 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
运行以下命令,验证分片是否使用
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"
消息。
通过执行以下步骤验证跨分片的集群分布是否是:
运行以下命令,将日志级别设置为
debug
:$ oc patch argocd <argocd_instance> -n <namespace> --patch='{"spec":{"controller":{"logLevel":"debug"}}}' --type=merge
输出示例
argocd.argoproj.io/<argocd_instance> patched
运行以下命令,查看日志
并搜索由分片处理
的日志,以观察每个集群所附加的分片:$ 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
注意如果集群 "C" 的数量是分片副本 "R" 的数量,则每个分片必须具有相同的分配的集群 "N",它等于 "C" 除以 "R"。上例演示了 3 个集群和 3 个副本,因此每个分片都有分配 1 个集群。