声明性集群配置


Red Hat OpenShift GitOps 1.16

使用 OpenShift GitOps 配置 OpenShift 集群,并使用 GitOps CLI 在默认和代码模式中创建并同步应用程序

Red Hat OpenShift Documentation Team

摘要

本文档提供了配置 Argo CD 以将 Git 目录的内容与包含集群的自定义配置的应用程序递归同步的说明。它还讨论如何使用 GitOps CLI 在默认模式和代码模式中创建和同步应用程序。

第 1 章 通过部署带有集群配置的应用程序来配置 OpenShift 集群

使用 Red Hat OpenShift GitOps,您可以将 Argo CD 配置为将 Git 目录的内容与包含集群自定义配置的应用程序递归同步。

1.1. 先决条件

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

1.2. 使用 Argo CD 实例管理集群范围的资源

警告

不要将 Argo CD 实例的权限提升为集群范围的,除非您具有不同的用例需要它。只有具有 cluster-admin 特权的用户才应管理您提升的实例。有权访问集群范围实例的任何人都可以提升其对集群的权限,使其具有集群管理员本身。

要管理集群范围的资源,请更新 Red Hat OpenShift GitOps Operator 的现有 Subscription 对象,并将 Argo CD 实例的命名空间添加到 spec 部分中的 ARGOCD_CLUSTER_CONFIG_NAMESPACES 环境变量中。

流程

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

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: openshift-gitops-operator
      namespace: openshift-gitops-operator
    # ...
    spec:
      config:
        env:
        - name: ARGOCD_CLUSTER_CONFIG_NAMESPACES
          value: openshift-gitops, <list of namespaces of cluster-scoped Argo CD instances>
    # ...
  4. 单击 Save and Reload
  5. 要验证 Argo CD 实例是否已配置有集群角色来管理集群范围的资源,请执行以下步骤:

    1. 导航到 User ManagementRoles,然后从 Filter 列表中选择 Cluster-wide Roles
    2. 使用 Search by name 字段搜索 argocd-application-controller

      Roles 页面显示创建的集群角色。

      提示

      或者,在 OpenShift CLI 中运行以下命令:

      oc auth can-i create oauth -n openshift-gitops --as system:serviceaccount:openshift-gitops:openshift-gitops-argocd-application-controller

      输出 yes 代表 Argo 实例配置了集群角色来管理集群范围的资源。否则,检查您的配置并根据需要执行必要的步骤。

1.3. Argo CD 实例的默认权限

默认情况下,Argo CD 实例具有以下权限:

  • Argo CD 实例具有 admin 权限,以便仅管理部署它的命名空间中的资源。例如,在 foo 命名空间中部署的 Argo CD 实例具有 admin 权限,仅管理该命名空间的资源。
  • Argo CD 具有以下集群范围的权限,因为 Argo CD 需要对资源进行集群范围的读取权限才能正常工作:

    - verbs:
        - get
        - list
        - watch
       apiGroups:
        - '*'
       resources:
        - '*'
     - verbs:
        - get
        - list
       nonResourceURLs:
        - '*'
注意
  • 您可以编辑运行 Argo CD 的 argocd-serverargocd-application-controller 组件使用的集群角色,以便写入权限仅限于您希望 Argo CD 管理的命名空间和资源。

    $ oc edit clusterrole argocd-server
    $ oc edit clusterrole argocd-application-controller

1.4. 在集群级别运行 Argo CD 实例

默认 Argo CD 实例和附带的控制器(由 Red Hat OpenShift GitOps Operator 安装)现在可以通过设置一个简单的配置切换在集群的基础架构节点上运行。

流程

  1. 标记现有节点:

    $ oc label node <node-name> node-role.kubernetes.io/infra=""
  2. 可选:如果需要,您还可以在基础架构节点上应用污点并隔离工作负载,并防止其他工作负载在这些节点上调度:

    $ oc adm taint nodes -l node-role.kubernetes.io/infra \
    infra=reserved:NoSchedule infra=reserved:NoExecute
  3. GitOpsService 自定义资源中添加 runOnInfra 切换:

    apiVersion: pipelines.openshift.io/v1alpha1
    kind: GitopsService
    metadata:
      name: cluster
    spec:
      runOnInfra: true
  4. 可选:如果将污点添加到节点,则将 容限 添加到 GitOpsService 自定义资源中。

    Example

    apiVersion: pipelines.openshift.io/v1alpha1
    kind: GitopsService
    metadata:
      name: cluster
      spec:
        runOnInfra: true
        tolerations:
        - effect: NoSchedule
          key: infra
          value: reserved
        - effect: NoExecute
          key: infra
          value: reserved

  5. 通过在控制台 UI 中查看 PodsPod details,验证 openshift-gitops 命名空间中的工作负载现在已调度到基础架构节点上。
注意

任何手工添加到默认 Argo CD 自定义资源中的 nodeSelectorstolerations,都会被 GitOpsService 自定义资源的 tolerations 覆盖。

其他资源

1.5. 使用 Argo CD 仪表板创建应用程序

Argo CD 提供了一个仪表板,供您创建应用程序。

此示例工作流逐步指导您完成将 Argo CD 配置为递归将 cluster 目录中的内容同步到 cluster-configs- 应用程序。目录定义了 OpenShift Container Platform Web 控制台集群配置,在 web 控制台中的 red hat applications menu icon 菜单下向 Red Hat Developer Blog - Kubernetes 添加链接,并在集群中定义命名空间 spring-petclinic

先决条件

  • 以管理员身份登录到 OpenShift Container Platform 集群。
  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps Operator。
  • 已登陆到 Argo CD 实例。

流程

  1. 在 Argo CD 控制面板中,单击 NEW APP 以添加新 Argo CD 应用。
  2. 对于此工作流,使用以下配置创建一个 cluster-configs 应用程序:

    应用程序名称
    cluster-configs
    project
    default
    同步策略
    Manual(手动)
    仓库 URL
    https://github.com/redhat-developer/openshift-gitops-getting-started
    修订
    HEAD
    路径
    cluster
    目的地
    https://kubernetes.default.svc
    命名空间
    spring-petclinic
    Directory Recurse
    checked
  3. 单击 CREATE 以创建应用程序。
  4. 打开 Web 控制台的 Administrator 视角,再展开 AdministrationNamespaces
  5. 搜索并选择命名空间,然后在 Label 字段中输入 argocd.argoproj.io/managed-by=openshift-gitops,以便 openshift-gitops 命名空间中的 Argo CD 实例可以管理您的命名空间。

1.6. 使用 oc 工具创建应用程序

您可以使用 oc 工具在终端中创建 Argo CD 应用程序。

先决条件

  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps Operator。
  • 已登陆到 Argo CD 实例。

流程

  1. 下载 示例应用程序

    $ git clone git@github.com:redhat-developer/openshift-gitops-getting-started.git
  2. 创建应用程序:

    $ oc create -f openshift-gitops-getting-started/argo/app.yaml
  3. 运行 oc get 命令以查看所创建的应用程序:

    $ oc get application -n openshift-gitops
  4. 在部署应用程序的命名空间中添加标签,以便 openshift-gitops 命名空间中的 Argo CD 实例可以管理它:

    $ oc label namespace spring-petclinic argocd.argoproj.io/managed-by=openshift-gitops

1.7. 使用 GitOps CLI 在默认模式中创建应用程序

您可以使用 GitOps argocd CLI 在默认模式中创建应用程序。

此示例工作流逐步指导您完成将 Argo CD 配置为递归将 cluster 目录中的内容同步到 cluster-configs- 应用程序。目录定义 OpenShift Container Platform 集群配置和集群中的 spring-petclinic 命名空间。

先决条件

  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps Operator。
  • 已安装 OpenShift CLI(oc)。
  • 已安装 Red Hat OpenShift GitOps argocd CLI。
  • 已登陆到 Argo CD 实例。

流程

  1. 获取 Argo CD 服务器的 admin 帐户密码:

    $ ADMIN_PASSWD=$(oc get secret openshift-gitops-cluster -n openshift-gitops -o jsonpath='{.data.admin\.password}' | base64 -d)
  2. 获取 Argo CD 服务器 URL:

    $ SERVER_URL=$(oc get routes openshift-gitops-server -n openshift-gitops -o jsonpath='{.status.ingress[0].host}')
  3. 使用 admin 帐户密码以单引号登录到 Argo CD 服务器:

    重要

    将密码包含在单引号中,确保 shell 无法错误地解译特殊字符,如 $。始终使用单引号括起密码的字面值。

    $ argocd login --username admin --password ${ADMIN_PASSWD} ${SERVER_URL}

    Example

    $ argocd login --username admin --password '<password>' openshift-gitops.openshift-gitops.apps-crc.testing

  4. 通过列出所有应用程序,验证您是否可以在默认模式下运行 argocd 命令:

    $ argocd app list

    如果配置正确,则使用以下标头列出现有应用程序:

    输出示例

    NAME CLUSTER NAMESPACE  PROJECT  STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO PATH TARGET

  5. 在默认模式中创建应用程序:

    $ argocd app create app-cluster-configs \
        --repo https://github.com/redhat-developer/openshift-gitops-getting-started.git \
        --path cluster \
        --revision main \
        --dest-server  https://kubernetes.default.svc \
        --dest-namespace spring-petclinic \
        --directory-recurse \
        --sync-policy none \
        --sync-option Prune=true \
        --sync-option CreateNamespace=true
  6. spring-petclinic 目标命名空间标记为由 openshif-gitops Argo CD 实例管理:

    $ oc label ns spring-petclinic "argocd.argoproj.io/managed-by=openshift-gitops"
  7. 列出可用的应用程序,以确认应用程序已创建成功:

    $ argocd app list

    虽然 cluster-configs Argo CD 应用程序具有 Healthy 状态,但它不会 因为没有 同步策略而自动同步,从而导致它保留在 OutOfSync 状态。

1.8. 使用 GitOps CLI 以核心模式创建应用程序

您可以使用 GitOps argocd CLI 以 核心 模式创建应用程序。

此示例工作流逐步指导您完成将 Argo CD 配置为递归将 cluster 目录中的内容同步到 cluster-configs- 应用程序。目录定义 OpenShift Container Platform 集群配置和集群中的 spring-petclinic 命名空间。

先决条件

  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps Operator。
  • 已安装 OpenShift CLI(oc)。
  • 已安装 Red Hat OpenShift GitOps argocd CLI。

流程

  1. 使用 oc CLI 工具登录到 OpenShift Container Platform 集群:

    $ oc login -u <username> -p <password> <server_url>

    Example

    $ oc login -u kubeadmin -p '<password>' https://api.crc.testing:6443

  2. 检查 kubeconfig 文件中是否正确设置了上下文:

    $ oc config current-context
  3. 将当前上下文的默认命名空间设置为 openshift-gitops

    $ oc config set-context --current --namespace openshift-gitops
  4. 设置以下环境变量来覆盖 Argo CD 组件名称:

    $ export ARGOCD_REPO_SERVER_NAME=openshift-gitops-repo-server
  5. 通过列出所有应用程序,验证您能够在 核心 模式下运行 argocd 命令:

    $ argocd app list --core

    如果配置正确,则使用以下标头列出现有应用程序:

    输出示例

    NAME CLUSTER NAMESPACE  PROJECT  STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO PATH TARGET

  6. 核心 模式创建应用程序:

    $ argocd app create app-cluster-configs --core \
        --repo https://github.com/redhat-developer/openshift-gitops-getting-started.git \
        --path cluster \
        --revision main \
        --dest-server  https://kubernetes.default.svc \
        --dest-namespace spring-petclinic \
        --directory-recurse \
        --sync-policy none \
        --sync-option Prune=true \
        --sync-option CreateNamespace=true
  7. spring-petclinic 目标命名空间标记为由 openshif-gitops Argo CD 实例管理:

    $ oc label ns spring-petclinic "argocd.argoproj.io/managed-by=openshift-gitops"
  8. 列出可用的应用程序,以确认应用程序已创建成功:

    $ argocd app list --core

    虽然 cluster-configs Argo CD 应用程序具有 Healthy 状态,但它不会 因为没有 同步策略而自动同步,从而导致它保留在 OutOfSync 状态。

1.9. 将应用程序与 Git 存储库同步

您可以通过修改 Argo CD 的同步策略,将应用程序与 Git 存储库同步。策略修改会自动将集群配置中的更改从 Git 存储库应用到集群。

流程

  1. 在 Argo CD 仪表板中,cluster-configs Argo CD 应用程序的状态为 MissingOutOfSync。因为应用程序配置了手动同步策略,所以 Argo CD 不会自动同步。
  2. cluster-configs 标题上的 SYNC,查看更改,然后点 SYNCHRONIZE。Argo CD 将自动检测 Git 存储库中的任何更改。如果更改了配置,Argo CD 会将 cluster-configs 的状态改为 OutOfSync。您可以修改 Argo CD 的同步策略,以自动将 Git 存储库中的更改应用到集群。
  3. 现在,cluster-configs Argo CD 应用程序的状态为 HealthySynced。点 cluster-configs 标题检查同步资源的详情及其在集群中的状态。
  4. 进入到 OpenShift Container Platform Web 控制台并点击 red hat applications menu icon 以验证 Red Hat Developer Blog - Kubernetes 的链接现在是否存在。
  5. 导航到 Project 页面并搜索 spring-petclinic 命名空间,以验证它是否已添加到集群中。

    集群配置已成功与集群同步。

1.10. 使用 GitOps CLI 在默认模式中同步应用程序

您可以使用 GitOps argocd CLI 在默认模式下同步应用程序。

此示例工作流逐步指导您完成将 Argo CD 配置为递归将 cluster 目录中的内容同步到 cluster-configs- 应用程序。目录定义 OpenShift Container Platform 集群配置和集群中的 spring-petclinic 命名空间。

先决条件

  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps Operator。
  • 已登陆到 Argo CD 实例。
  • 已安装 OpenShift CLI(oc)。
  • 已安装 Red Hat OpenShift GitOps argocd CLI。

流程

  1. 获取 Argo CD 服务器的 admin 帐户密码:

    $ ADMIN_PASSWD=$(oc get secret openshift-gitops-cluster -n openshift-gitops -o jsonpath='{.data.admin\.password}' | base64 -d)
  2. 获取 Argo CD 服务器 URL:

    $ SERVER_URL=$(oc get routes openshift-gitops-server -n openshift-gitops -o jsonpath='{.status.ingress[0].host}')
  3. 使用 admin 帐户密码以单引号登录到 Argo CD 服务器:

    重要

    将密码包含在单引号中,确保 shell 无法错误地解译特殊字符,如 $。始终使用单引号括起密码的字面值。

    $ argocd login --username admin --password ${ADMIN_PASSWD} ${SERVER_URL}

    Example

    $ argocd login --username admin --password '<password>' openshift-gitops.openshift-gitops.apps-crc.testing

  4. 因为应用程序配置了 none 同步策略,所以您必须手动触发同步操作:

    $ argocd app sync openshift-gitops/app-cluster-configs
  5. 列出应用程序,以确认应用程序具有 HealthySynced 状态:

    $ argocd app list

1.11. 使用 GitOps CLI 在核心模式中同步应用程序

您可以使用 GitOps argocd CLI 以 核心 模式同步应用程序。

此示例工作流逐步指导您完成将 Argo CD 配置为递归将 cluster 目录中的内容同步到 cluster-configs- 应用程序。目录定义 OpenShift Container Platform 集群配置和集群中的 spring-petclinic 命名空间。

先决条件

  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps Operator。
  • 已安装 OpenShift CLI(oc)。
  • 已安装 Red Hat OpenShift GitOps argocd CLI。

流程

  1. 使用 oc CLI 工具登录到 OpenShift Container Platform 集群:

    $ oc login -u <username> -p <password> <server_url>

    Example

    $ oc login -u kubeadmin -p '<password>' https://api.crc.testing:6443

  2. 检查 kubeconfig 文件中是否正确设置了上下文:

    $ oc config current-context
  3. 将当前上下文的默认命名空间设置为 openshift-gitops

    $ oc config set-context --current --namespace openshift-gitops
  4. 设置以下环境变量来覆盖 Argo CD 组件名称:

    $ export ARGOCD_REPO_SERVER_NAME=openshift-gitops-repo-server
  5. 因为应用程序配置了 none 同步策略,所以您必须手动触发同步操作:

    $ argocd app sync --core openshift-gitops/app-cluster-configs
  6. 列出应用程序,以确认应用程序具有 HealthySynced 状态:

    $ argocd app list --core

1.12. 集群配置的内置权限

默认情况下,Argo CD 实例具有管理特定集群范围资源的权限,如集群 Operator、可选 OLM Operator 和用户管理。

注意
  • Argo CD 没有 cluster-admin 权限。
  • 您可以扩展绑定到 GitOps Operator 管理的任何 Argo CD 实例的权限。但是,您不得修改权限资源,如由 GitOps Operator 创建的角色或集群角色,因为 Operator 可能会将它们协调回其初始状态。相反,创建专用角色和集群角色对象,并将它们绑定到应用程序控制器使用的适当服务帐户。

Argo CD 实例的权限:

Resources描述

资源组

配置用户或管理员

operators.coreos.com

由 OLM 管理的可选 Operator

user.openshift.io , rbac.authorization.k8s.io

组、用户及其权限

config.openshift.io

由 CVO 管理的 control plane Operator,用于配置集群范围的构建配置、registry 配置和调度程序策略

storage.k8s.io

Storage

console.openshift.io

控制台自定义

1.13. 为集群配置添加权限

您可以授予 Argo CD 实例的权限来管理集群配置。创建具有额外权限的集群角色,然后创建新的集群角色绑定以将集群角色与服务帐户关联。

先决条件

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

流程

  1. 在 Web 控制台中,选择 User ManagementRolesCreate Role。使用以下 ClusterRole YAML 模板来添加规则来指定额外权限。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: secrets-cluster-role
    rules:
    - apiGroups: [""]
      resources: ["secrets"]
      verbs: ["*"]
  2. Create 添加集群角色。
  3. 要创建集群角色绑定,请选择 User ManagementRole BindingsCreate Binding
  4. Project 列表中选择 All Projects
  5. Create binding
  6. Binding type 选择为 Cluster-wide role binding(ClusterRoleBinding)
  7. RoleBinding 名称 输入一个唯一值。
  8. 从下拉列表中选择新创建的集群角色或现有集群角色。
  9. 选择 Subject 作为 ServiceAccount,并提供 Subject 命名空间名称

    1. 主题命名空间:openshift-gitops
    2. 主题名称:openshift-gitops-argocd-application-controller

      注意

      Subject name 的值取决于您要为其创建集群角色和集群角色绑定的 GitOps control plane 组件。

  10. CreateClusterRoleBinding 对象的 YAML 文件如下:

    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: cluster-role-binding
    subjects:
      - kind: ServiceAccount
        name: openshift-gitops-argocd-application-controller
        namespace: openshift-gitops
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: secrets-cluster-role

1.14. 使用 Red Hat OpenShift GitOps 安装 OLM Operator

带有集群配置的 Red Hat OpenShift GitOps 管理特定集群范围的资源,并负责安装集群 Operator 或任何命名空间范围的 OLM Operator。

考虑作为集群管理员的情况,您必须安装 OLM Operator,如 Tekton。您可以使用 OpenShift Container Platform Web 控制台手动安装 Tekton Operator 或 OpenShift CLI,在集群中手动安装 Tekton 订阅和 Tekton Operator 组。

Red Hat OpenShift GitOps 将 Kubernetes 资源放置在 Git 存储库中。作为集群管理员,使用 Red Hat OpenShift GitOps 管理和自动化其他 OLM Operator 安装,而无需手动步骤。例如,在使用 Red Hat OpenShift GitOps 将 Tekton 订阅放在 Git 仓库后,Red Hat OpenShift GitOps 会自动从 Git 仓库获取此 Tekton 订阅,并在集群中安装 Tekton Operator。

1.14.1. 安装集群范围的 Operator

Operator Lifecycle Manager (OLM) 为集群范围的 Operator 使用 openshift-operators 命名空间中的默认 global-operators Operator 组。因此,您不必在 Gitops 仓库中管理 OperatorGroup 资源。但是,对于命名空间范围的 Operator,您必须管理该命名空间中的 OperatorGroup 资源。

要安装集群范围的 Operator,请在 Git 仓库中创建并放置所需 Operator 的 Subscription 资源。

示例:Grafana Operator 订阅

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: grafana
spec:
  channel: v4
  installPlanApproval: Automatic
  name: grafana-operator
  source: redhat-operators
  sourceNamespace: openshift-marketplace

1.14.2. 安装 namepace-scoped Operator

要安装命名空间范围的 Operator,请在 Git 仓库中创建并放置所需 Operator 的 SubscriptionOperatorGroup 资源。

示例:Ansible Automation Platform Resource Operator

# ...
apiVersion: v1
kind: Namespace
metadata:
  labels:
    openshift.io/cluster-monitoring: "true"
  name: ansible-automation-platform
# ...
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: ansible-automation-platform-operator
  namespace: ansible-automation-platform
spec:
  targetNamespaces:
    - ansible-automation-platform
# ...
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: ansible-automation-platform
  namespace: ansible-automation-platform
spec:
  channel: patch-me
  installPlanApproval: Automatic
  name: ansible-automation-platform-operator
  source: redhat-operators
  sourceNamespace: openshift-marketplace
# ...

重要

当使用 Red Hat OpenShift GitOps 部署多个 Operator 时,您必须在对应的命名空间中创建单个 Operator 组。如果一个命名空间中存在多个 Operator 组,则在该命名空间中创建的任何 CSV 都会变为带有 TooManyOperatorGroups 原因的 failure 状态。在相应命名空间中的 Operator 组数量达到一个后,所有以前有 failure 状态的 CSV 都会过渡到 pending 状态。您需要手动批准待处理的安装计划以完成 Operator 安装。

1.15. 使用 Red Hat OpenShift GitOps 配置 respectRBAC

Argo CD 中的 respectRBAC 功能控制 Argo CD 如何监视集群中的资源。默认情况下,Argo CD 会尝试查看集群范围内的所有 Kubernetes 资源(CRD)。使用 respectRBAC 功能,您可以限制 ArgoCD 控制器只使用控制器 RBAC 发现或同步特定资源,而无需手动配置资源排除。

要启用此功能,请在 Argo CD 资源中设置 .spec.controller.respectRBAC 键。设置此密钥后,控制器会自动停止监视它无法列出或访问的资源。例如,这可以防止 Argo CD 集群角色限制 Argo CD 监视 OpenShift 路由,否则会导致同步过程中出现错误,表示它无法监视资源。

您可以通过命令行界面(CLI)或 Web 控制台创建 Argo CD 实例来启用 相关的RBAC 功能。

先决条件

确保您在 Subscription 资源中创建或更新一个命名空间,以便 Subscription 可以托管集群范围的 Argo CD 实例。如需更多信息,请参阅"使用 Argo CD 实例来管理集群范围的资源"。

1.15.1. 使用 CLI 配置 respectRBAC

您可以使用 CLI 配置 respectRBAC 功能。

流程

  1. 创建一个 YAML 对象文件,如 argo-cd-resource.yaml,以配置 respectRBAC 功能:

    创建 respectRBACArgoCD YAML 示例

    apiVersion: argoproj.io/v1beta1
    kind: ArgoCD
    metadata:
      name: example-argocd 1
    spec:
      controller:
        respectRBAC: strict 2

    1
    指定 Argo CD 实例的名称。
    2
    您可以将 ArgoCD 资源中的 .spec.controller.respectRBAC 键的值指定为 normalstrict。考虑 以正常方式 设置值来平衡准确性和速度,因为资源列表是一个轻量级操作。如果 Argo CD 报告错误,则将该值设为 strict,表示当您将值设为 正常的 时,它无法访问资源。设置 严格 增加对服务器的 API 调用数量,与正常相比,与 正常 相比,设置更为准确,因为 Argo CD 执行 RBAC 资源的额外验证来确定权限。
  2. 运行以下命令,将更改应用到 YAML 文件。

    $ oc apply -f argocd-resource.yaml -n argo-cd-instance 1
    1
    指定包含 ArgoCD 资源的 YAML 文件的名称和托管 ArgoCD 的命名空间。
  3. 运行以下命令,验证 .status.phase 字段的状态是否为 Available

    $ oc get argocd <argocd_instance_name> -n <argocd_namespace> -o jsonpath='{.status.phase}' 1
    1
    <argocd_instance_name > 替换为 Argo CD 实例的名称,如 example-argocd
  4. 验证 ConfigMap 资源中的 resource.respectRBAC 参数是否已成功更新:

    1. 要检索 argocd-cm 配置映射的内容,请运行以下命令:

      $ oc get cm argocd-cm -n <argocd_namespace> -o yaml
    2. 验证 argocd-cm ConfigMap 是否包含 resource.respectRBAC 参数,并确保其值设置为 strictnormal

1.15.2. 使用 Web 控制台配置 respectRBAC

您可以在 web 控制台中配置 respectRBAC

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. 在 Web 控制台的 Administrator 视角中,点 OperatorsInstalled Operators
  3. Project 列表创建或选择您要安装用户定义的 Argo CD 实例的项目。
  4. 从安装的 Operator 列表中选择 Red Hat OpenShift GitOps,然后点击 Argo CD 选项卡。
  5. Argo CD 选项卡中配置 respectRBAC 参数。

    spec:
      controller:
        respectRBAC: strict
  6. Create

    成功安装后,验证 Argo CD 实例是否在 Argo CD 选项卡下列出,StatusAvailable

  7. 创建 Argo CD 实例后,通过完成以下步骤验证 ConfigMap 资源中的 resource.respectRBAC 参数是否已成功更新。

    1. Administrator 视角中,进入 WorkloadConfigMaps
    2. Project 选项中,选择 Argo CD 命名空间。
    3. 选择 argocd-cm 配置映射。
    4. 选择 YAML 选项卡来查看 resource.respectRBAC 参数。

1.16. 其他资源

第 2 章 通过为集群范围的实例创建用户定义的集群角色来自定义权限

对于默认的集群范围的实例,Red Hat OpenShift GitOps Operator 授予管理特定集群范围资源的额外权限。因此,作为集群管理员,当您将 Argo CD 部署为集群范围的实例时,Operator 会为 GitOps control plane 组件创建额外的集群角色和集群角色绑定。这些集群角色和集群角色绑定提供了 Argo CD 在集群级别操作的额外权限。

如果您不希望集群范围的实例具有所有 Operator-given 权限,并选择向集群范围资源添加或删除权限,您必须首先禁用为集群范围的实例创建默认集群角色。然后,您可以为以下集群范围的实例自定义权限:

  • 默认 ArgoCD 实例(默认集群范围的实例)
  • 用户定义的集群范围的 Argo CD 实例

本指南提供了一些示例,可帮助您创建用户定义的集群范围的 Argo CD 实例,在定义的命名空间中部署 Argo CD 应用程序,其中包含集群的自定义配置,禁用为集群范围的实例创建默认集群角色,并通过为 GitOps control plane 组件创建新的集群角色来自定义权限。

注意

作为开发者,如果您要创建 Argo CD 应用程序并部署集群范围的资源,请确保集群管理员为它们授予必要的权限。

否则,在 Argo CD 协调后,您将在应用程序的 Status 字段中看到与以下示例类似的身份验证错误消息:

身份验证错误消息示例

persistentvolumes is forbidden: User "system:serviceaccount:gitops-demo:argocd-argocd-application-controller" cannot create resource "persistentvolumes" in API group "" at the cluster scope.

2.1. 先决条件

  • 您已在 OpenShift Container Platform 集群上安装 Red Hat OpenShift GitOps 1.13.0 或更高版本。
  • 已安装 OpenShift CLI(oc)。
  • 已安装 Red Hat OpenShift GitOps argocd CLI。
  • 您已在定义的命名空间中安装了 集群范围的 Argo CD 实例。例如,spring-petclinic 命名空间。
  • 您已验证了用户定义的集群范围的实例配置了以下组件的集群角色和集群角色绑定:

    • Argo CD Application Controller
    • Argo CD 服务器
    • Argo CD ApplicationSet Controller (提供 ApplicationSet Controller 会被创建)
  • 您已使用 spring-petclinic 命名空间中的 customclusterrole 路径 部署了 cluster-configs Argo CD 应用程序,并创建了 test-gitops-ns 命名空间和 test-gitops-pv 持久性卷资源。

    注意

    cluster-configs Argo CD 应用程序必须由用户定义的集群范围的实例管理,并设置以下参数:

    • selfHeal 字段值设为 true
    • syncPolicy 字段值设置为 automated
    • Label 字段设置为 app.kubernetes.io/part-of=argocd
    • Label 字段设置为 argocd.argoproj.io/managed-by=<user_defined_namespace > 值,以便定义的命名空间中的 Argo CD 实例可以管理您的命名空间
    • Label 字段被设置为 app.kubernetes.io/name=<user_defined_argocd_instance>

2.2. 禁用为集群范围的实例创建默认集群角色

要根据需要为集群范围的资源添加或删除权限,您必须通过编辑 Argo CD 自定义资源(CR)的 YAML 文件来禁用为集群范围的实例创建默认集群角色。

流程

  1. 在 Argo CD CR 中,将 .spec.defaultClusterScopedRoleDisabled 字段的值设置为 true

    Argo CD CR 示例

    apiVersion: argoproj.io/v1beta1
    kind: ArgoCD
    metadata:
      name: example 1
      namespace: spring-petclinic 2
    # ...
    spec:
      defaultClusterScopedRoleDisabled: true 3
    # ...

    1
    集群范围的实例的名称。
    2
    要运行集群范围实例的命名空间。
    3
    标志值,用于禁用为集群范围的实例创建默认集群角色。如果您希望 Operator 为集群范围的实例重新创建默认集群角色和集群角色绑定,请将字段值设置为 false

    输出示例

    argocd.argoproj.io/example configured

  2. 运行以下命令,验证 Red Hat OpenShift GitOps Operator 是否已删除 GitOps control plane 组件的默认集群角色和集群角色绑定:

    $ oc get ClusterRoles/<argocd_name>-<argocd_namespace>-<control_plane_component>
    $ oc get ClusterRoleBindings/<argocd_name>-<argocd_namespace>-<control_plane_component>

    输出示例

    No resources found

    不创建集群范围的实例的默认集群角色和集群角色绑定。作为集群管理员,您可以通过为 GitOps control plane 组件创建新集群角色和集群角色绑定来为集群范围的实例创建和自定义权限。

2.3. 自定义集群范围的实例的权限

作为集群管理员,若要自定义集群范围的实例的权限,您必须为 GitOps control plane 组件创建新的集群角色和集群角色绑定。

例如,以下说明仅侧重于用户定义的集群范围的实例。

流程

  1. 打开 Web 控制台的 Administrator 视角,再进入 User ManagementRolesCreate Role
  2. 使用以下 ClusterRole YAML 模板来添加规则来指定额外权限。

    集群角色 YAML 模板示例

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: example-spring-petclinic-argocd-application-controller 1
    rules:
      - verbs:
          - get
          - list
          - watch
        apiGroups:
          - '*'
        resources:
          - '*'
      - verbs:
          - '*'
        apiGroups:
          - ''
        resources: 2
          - namespaces
          - persistentvolumes

    1
    根据 <argocd_name>-<argocd_namespace>-<control_plane_component> 命名规则的集群角色名称。
    2
    要在集群级别授予权限的资源。
  3. Create 添加集群角色。
  4. 通过执行以下步骤查找您要自定义权限的 control plane 组件使用的服务帐户:

    1. 进入 WorkloadsPods
    2. Project 列表中,选择安装用户定义的集群范围实例的项目。
    3. 点 control plane 组件的 pod,再进入 YAML 选项卡。
    4. 找到 spec.ServiceAccount 字段并记录服务帐户。
  5. 进入 User ManagementRoleBindingsCreate binding
  6. Create binding
  7. Binding type 选择为 Cluster-wide role binding(ClusterRoleBinding)
  8. 按照 <argocd_ name>-<argocd_namespace>-<control_plane_component> 命名约定输入 RoleBinding 名称的唯一值。
  9. Role name 的下拉列表中,选择新创建的集群角色。
  10. 选择 Subject 作为 ServiceAccount,并提供 Subject 命名空间名称

    1. 主题命名空间spring-petclinic
    2. 主题名称:example-argocd-application-controller

      注意

      对于 Subject name,请确保配置的值与您要自定义权限的 control plane 组件的 spec.ServiceAccount 字段的值相同。

  11. Create

    您已为 control plane 组件的服务帐户和命名空间创建了所需的权限。ClusterRoleBinding 对象的 YAML 文件类似以下示例:

    集群角色绑定的 YAML 文件示例

    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: example-spring-petclinic-argocd-application-controller
    subjects:
      - kind: ServiceAccount
        name: example-argocd-application-controller
        namespace: spring-petclinic
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: example-spring-petclinic-argocd-application-controller

2.4. 其他资源

第 3 章 通过创建聚合的集群角色来自定义权限

Argo CD Application Controller 的默认集群角色具有特定的一组硬编码权限。Red Hat OpenShift GitOps Operator 管理这个集群角色,因此您无法修改它。作为集群管理员,您可以使用以下方法之一自定义权限:

3.1. 聚合的集群角色

通过使用聚合的集群角色,您不必从头开始创建新集群角色来定义权限。相反,您可以将多个集群角色组合为一个。

使用 Red Hat OpenShift GitOps 1.14 及之后的版本,作为集群管理员,您可以使用聚合的集群角色,并允许用户轻松为 Argo CD Application Controller 添加用户定义的权限。

重要
  • 聚合的集群角色功能是可选的并默认禁用。您只能为集群范围的 Argo CD 实例的 Argo CD Application Controller 组件创建聚合的集群角色。
  • 从 Argo CD 自定义资源(CR)中删除 aggregatedClusterRoles 字段不会删除用户定义的集群角色。您必须使用 CLI 或 UI 手动删除用户定义的集群角色。

3.2. 先决条件

  • 您了解了 聚合的集群角色
  • 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps。
  • 已安装 OpenShift CLI(oc)。
  • 已安装 Red Hat OpenShift GitOps argocd CLI。
  • 您已在定义的命名空间中安装了 集群范围的 Argo CD 实例
  • 您已验证了用户定义的集群范围的实例配置了以下组件的集群角色和集群角色绑定:

    • Argo CD Application Controller
    • Argo CD 服务器
    • Argo CD ApplicationSet Controller,如果创建了 ApplicationSet Controller
  • 您已 禁用 为集群范围的实例创建默认集群角色。

3.3. 创建聚合的集群角色

创建聚合的集群角色的过程由以下流程组成:

  1. 启用创建聚合集群角色
  2. 创建用户定义的集群角色并为应用程序控制器配置用户定义的权限

3.3.1. 启用创建聚合集群角色

您可以通过在 Argo CD 自定义资源(CR)中将 .spec.aggregatedClusterRoles 字段的值设置为 true 来启用聚合的集群角色。当创建聚合的集群角色时,Red Hat OpenShift GitOps Operator 会执行以下操作:

  • 默认情况下,创建一个 < argocd_name>-<argocd_namespace>-argocd-application-controller 聚合 集群角色。
  • 创建对应的集群角色绑定并管理它。
  • 为 Application Controller 创建和管理 viewadmin 集群角色,将用户定义的权限添加到聚合的集群角色中。

3.3.2. 创建用户定义的集群角色并配置用户定义的权限

要将用户定义的权限配置为 &lt ;argocd_name>-<argocd_namespace>-argocd-application-controller-admin 集群角色和聚合集群角色,您必须使用 argocd/aggregate-to-admin: 'true' 标签创建一个或多个用户定义的集群角色,然后为 Application Controller 配置用户定义的权限。

注意
  • 聚合的集群角色从 < argocd_name>-<argocd_namespace>-argocd-application-controller-admin 和 < argocd_name>-<argocd_namespace>-argocd-application-controller-view 集群角色继承权限。
  • & lt;argocd_name>-<argocd_namespace>-argocd-application-controller-admin 集群角色继承用户定义的集群角色的权限。

3.4. 启用创建聚合集群角色

要为集群范围的 Argo CD Application CD 实例的 Argo CD Application Controller 组件启用聚合集群角色,您必须通过编辑 Argo CD 自定义资源(CR)的 YAML 文件来配置对应的字段。

流程

  1. 在 Argo CD CR 中,将 .spec.aggregatedClusterRoles 字段的值设置为 true

    Argo CD CR 示例

    apiVersion: argoproj.io/v1beta1
    kind: ArgoCD
    metadata:
      name: example 1
      namespace: spring-petclinic 2
    # ...
    spec:
      aggregatedClusterRoles: true 3
    # ...

    1
    集群范围的实例的名称。
    2
    要运行集群范围实例的命名空间。
    3
    设置为 true 可创建聚合的集群角色。如果您不想启用聚合的集群角色创建,请不要包含这一行,或者将值设为 false

    输出示例

    argocd.argoproj.io/example configured

  2. 运行以下命令,验证集群范围的 Argo CD 实例的 Status 字段显示为 Phase: Available

    $ oc describe argocd.argoproj.io/example -n spring-petclinic

    输出示例

    Name:         example
    Namespace:    spring-petclinic
    Labels:       <none>
    Annotations:  <none>
    API Version:  argoproj.io/v1beta1
    Kind:         ArgoCD
    Metadata:
      Creation Timestamp:  2024-08-14T08:20:53Z
      Finalizers:
        argoproj.io/finalizer
      Generation:        3
      Resource Version:  60437
      UID:               57940e54-d60b-4c1a-bc4a-85c81c63ab69
    Spec:
      Aggregated Cluster Roles:  true
    ...
    Status:
      Application Controller:      Running
      Application Set Controller:  Unknown
      Phase:                       Available 1
      Redis:                       Running
      Repo:                        Running
      Server:                      Running
      Sso:                         Unknown
    Events:                        <none>

    1
    Available 状态表示集群范围的 Argo CD 实例处于健康状态且可用。
    注意

    Red Hat OpenShift GitOps Operator 创建以下默认集群角色并管理它们:

    • <argocd_name>-<argocd_namespace>-argocd-application-controller 聚合集群角色
    • <argocd_name>-<argocd_namespace>-argocd-application-controller-view
    • <argocd_name>-<argocd_namespace>-argocd-application-controller-admin
  3. 运行以下命令,验证 Operator 是否为 Argo CD Application Controller 和 Argo CD 服务器组件创建了默认的集群角色和集群角色绑定:

    $ oc get ClusterRoles -l app.kubernetes.io/part-of=argocd

    输出示例

    NAME                                                           CREATED AT
    example-spring-petclinic-argocd-application-controller         2024-08-14T08:20:58Z
    example-spring-petclinic-argocd-application-controller-admin   2024-08-14T09:08:38Z
    example-spring-petclinic-argocd-application-controller-view    2024-08-14T09:08:38Z
    example-spring-petclinic-argocd-server                         2024-08-14T08:20:59Z

    $ oc get ClusterRoleBindings -l app.kubernetes.io/part-of=argocd

    输出示例

    NAME                                                     ROLE                                                                 AGE
    example-spring-petclinic-argocd-application-controller   ClusterRole/example-spring-petclinic-argocd-application-controller   54m
    example-spring-petclinic-argocd-server                   ClusterRole/example-spring-petclinic-argocd-server                   54m

    不会创建 viewadmin 集群角色的集群角色绑定。这是因为 viewadmin 集群角色仅将权限添加到聚合的集群角色中,而不直接配置 Argo CD Application Controller 的权限。

    提示

    或者,您可以使用 OpenShift Container Platform Web 控制台从 Administrator 视角进行验证。您可以分别进入 User ManagementRoles and User ManagementRoleBindings。您可以搜索具有 app.kubernetes.io/part-of:argocd 标签的集群角色和集群角色绑定。

  4. 运行以下命令,验证是否通过检查创建的角色输出的权限创建了聚合的集群角色:

    $ oc get ClusterRole/<cluster_role_name> -o yaml 1
    1
    <cluster_role_name > 替换为所创建的角色的名称。

    聚合集群角色的输出示例

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      annotations:
        argocds.argoproj.io/name: example
        argocds.argoproj.io/namespace: spring-petclinic
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"argoproj.io/v1beta1","kind":"ArgoCD","metadata":{"annotations":{},"name":"example","namespace":"spring-petclinic"},"spec":{"aggregatedClusterRoles":true}}
        rbac.authorization.kubernetes.io/autoupdate: "true"
      creationTimestamp: "2024-08-14T08:20:58Z"
      labels:
        app.kubernetes.io/managed-by: spring-petclinic
        app.kubernetes.io/name: example
        app.kubernetes.io/part-of: argocd
      name: example-spring-petclinic-argocd-application-controller 1
      resourceVersion: "78640"
      uid: aeeb2ef5-b531-4fe3-a61a-b5ad8dd8ca6e
    aggregationRule: 2
      clusterRoleSelectors:
      - matchLabels:
          app.kubernetes.io/managed-by: spring-petclinic
          argocd/aggregate-to-controller: "true"
    rules: [] 3

    1
    聚合的集群角色的名称。
    2
    预定义的标签列表表示聚合的集群角色可以从其他用户定义的集群角色继承权限。
    3
    没有设置预定义的权限。但是,当 Operator 立即创建 &lt ;argocd_name>-<argocd_namespace>-argocd-application-controller- view 集群角色时,对应的预定义视图权限将添加到聚合的集群角色中。

    view 集群角色的输出示例

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      annotations:
        argocds.argoproj.io/name: example
        argocds.argoproj.io/namespace: spring-petclinic
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"argoproj.io/v1beta1","kind":"ArgoCD","metadata":{"annotations":{},"name":"example","namespace":"spring-petclinic"},"spec":{"aggregatedClusterRoles":true}}
      creationTimestamp: "2024-08-14T09:59:14Z"
      labels: 1
        app.kubernetes.io/managed-by: spring-petclinic
        app.kubernetes.io/name: example
        app.kubernetes.io/part-of: argocd
        argocd/aggregate-to-controller: "true"
      name: example-spring-petclinic-argocd-application-controller-view 2
      resourceVersion: "78639"
      uid: 068b8867-7a0c-4af3-a17a-0560a00eba41
    rules: 3
    - apiGroups:
      - '*'
      resources:
      - '*'
      verbs:
      - get
      - list
      - watch
    - nonResourceURLs:
      - '*'
      verbs:
      - get
      - list

    1
    标签与现有聚合集群角色的预定义列表匹配。
    2
    查看集群 角色的名称
    3
    预定义的 查看 权限。这些权限添加到现有的聚合集群角色中。

    admin 集群角色的输出示例

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      annotations:
        argocds.argoproj.io/name: example
        argocds.argoproj.io/namespace: spring-petclinic
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"argoproj.io/v1beta1","kind":"ArgoCD","metadata":{"annotations":{},"name":"example","namespace":"spring-petclinic"},"spec":{"aggregatedClusterRoles":true}}
        rbac.authorization.kubernetes.io/autoupdate: "true"
      creationTimestamp: "2024-08-14T09:59:15Z"
      labels: 1
        app.kubernetes.io/managed-by: spring-petclinic
        app.kubernetes.io/name: example
        app.kubernetes.io/part-of: argocd
        argocd/aggregate-to-controller: "true"
      name: example-spring-petclinic-argocd-application-controller-admin 2
      resourceVersion: "78642"
      uid: e2d35b6f-0832-4993-8b24-915a725454f9
    aggregationRule: 3
      clusterRoleSelectors:
      - matchLabels:
          app.kubernetes.io/managed-by: spring-petclinic
          argocd/aggregate-to-admin: "true"
    rules: null 4

    1
    标签与现有聚合集群角色的预定义列表匹配。
    2
    admin 集群角色的名称。
    3
    预定义的标签列表表示现有的 < argocd_name>-<argocd_namespace>-argocd-application-controller-admin 集群角色可以从其他用户定义的集群角色继承权限。
    4
    指定还没有在一个或多个用户定义的集群角色中定义权限。
    提示

    或者,您可以使用 OpenShift Container Platform Web 控制台从 Administrator 视角进行验证。您可以进入 User ManagementRoles,使用 Filter 选项,选择 Cluster-wide Roles,并搜索聚合的集群角色,查看,以及 admin 集群角色。您必须打开集群角色来检查详情和配置。

    作为集群管理员,您可以创建一个或多个用户定义的集群角色,并为 Argo CD Application Controller 配置用户定义的权限。

3.5. 创建用户定义的集群角色并为应用程序控制器配置用户定义的权限

作为集群管理员,要将用户定义的权限添加到聚合的集群角色中,您必须创建一个或多个用户定义的集群角色,然后为集群范围的 Argo CD Application CD 实例的 Argo CD Application Controller 组件配置用户定义的权限。

先决条件

  • 您已启用了为集群范围的 Argo CD Application CD 实例的 Argo CD Application Controller 组件创建聚合的集群角色。
  • 您有以下由 Red Hat OpenShift GitOps Operator 创建和管理的默认集群角色:

    • <argocd_name>-<argocd_namespace>-argocd-application-controller 聚合集群角色带有预定义的 aggregateRule 字段
    • <argocd_name>-<argocd_namespace>-argocd-application-controller-view 带有预定义的 查看 权限
    • <argocd_name>-<argocd_namespace>-argocd-application-controller-admin 没有预定义权限

流程

  1. 使用以下命令,创建带有所需标签和权限的新集群角色:

    $ oc apply -n <namespace> -f <cluster_role_name>.yaml

    其中:

    <namespace>
    指定定义的命名空间的名称。
    <cluster_role_name>

    指定定义的集群角色 YAML 文件的名称。

    用户定义的集群角色 YAML 示例

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: user-application-controller 1
      labels: 2
        app.kubernetes.io/managed-by: spring-petclinic
        app.kubernetes.io/name: example
        app.kubernetes.io/part-of: argocd
        argocd/aggregate-to-admin: 'true'
    rules: 3
      - verbs:
          - '*'
        apiGroups:
          - ''
        resources:
          - namespaces
          - persistentvolumeclaims
          - persistentvolumes
          - configmaps
      - verbs:
          - '*'
        apiGroups:
          - compliance.openshift.io
        resources:
          - scansettingbindings

    1
    用户定义的集群角色的名称。
    2
    标签与现有 < argocd_name>-<argocd_namespace>-argocd-application-controller-admin 集群角色匹配。
    3
    用户定义的权限,通过 < argocd_name>-<argocd_namespace>-argocd-application-controller-admin 集群角色添加到聚合的集群角色中。
    提示

    另外,您可以使用 Web 控制台从 Administrator 视角创建用户定义的集群角色。您可以进入 User ManagementRolesCreate Role,使用前面的 YAML 模板添加权限,然后点 Create

    输出示例

    clusterrole.rbac.authorization.k8s.io/user-application-controller created

    创建了用户定义的集群角色。

  2. 运行以下命令,验证 < argocd_name>-<argocd_namespace>-argocd-application-controller-admin 集群角色是否继承了用户定义的集群角色的权限:

    $ oc get ClusterRole/<argocd_name>-<argocd_namespace>-argocd-application-controller-admin -o yaml

    其中:

    <argocd_name>
    指定用户定义的集群范围的 Argo CD 实例的名称。
    <argocd_namespace>

    指定安装 Argo CD 的命名空间。

    输出示例

    aggregationRule:
      clusterRoleSelectors:
      - matchLabels:
          app.kubernetes.io/managed-by: spring-petclinic
          argocd/aggregate-to-admin: "true"
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      annotations:
        argocds.argoproj.io/name: example
        argocds.argoproj.io/namespace: spring-petclinic
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"argoproj.io/v1beta1","kind":"ArgoCD","metadata":{"annotations":{},"name":"example","namespace":"spring-petclinic"},"spec":{"aggregatedClusterRoles":true}}
      creationTimestamp: "2024-08-14T09:59:15Z"
      labels:
        app.kubernetes.io/managed-by: spring-petclinic
        app.kubernetes.io/name: example
        app.kubernetes.io/part-of: argocd
        argocd/aggregate-to-controller: "true"
      name: example-spring-petclinic-argocd-application-controller-admin
      resourceVersion: "79202"
      uid: e2d35b6f-0832-4993-8b24-915a725454f9
    rules:
    - apiGroups:
      - ""
      resources:
      - namespaces
      - persistentvolumeclaims
      - persistentvolumes
      - configmaps
      verbs:
      - '*'
    - apiGroups:
      - compliance.openshift.io
      resources:
      - scansettingbindings
      verbs:
      - '*'

    提示

    或者,您可以使用 OpenShift Container Platform Web 控制台从 Administrator 视角进行验证。您可以进入 User ManagementRoles,使用 Filter 选项,选择 Cluster-wide Roles,并搜索 < argocd_name>-<argocd_namespace>-argocd-application-controller-admin 集群角色。您必须打开集群角色来检查详情和配置。

  3. 运行以下命令,验证 <argocd_name>-<argocd_namespace>-argocd-application-controller 聚合集群角色是否继承来自 & lt;argocd_name>-<argocd_namespace>-argocd-application-controller-admin 和 &lt ;argocd_name>-<argocd_namespace>-argocd-application-controller-view 集群角色的权限:

    $ oc get ClusterRole/<argocd_name>-<argocd_namespace>-argocd-application-controller -o yaml

    其中:

    <argocd_name>
    指定用户定义的集群范围的 Argo CD 实例的名称。
    <argocd_namespace>

    指定安装 Argo CD 的命名空间。

    聚合集群角色的输出示例

    aggregationRule:
      clusterRoleSelectors:
      - matchLabels:
          app.kubernetes.io/managed-by: spring-petclinic
          argocd/aggregate-to-controller: "true"
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      annotations:
        argocds.argoproj.io/name: example
        argocds.argoproj.io/namespace: spring-petclinic
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"argoproj.io/v1beta1","kind":"ArgoCD","metadata":{"annotations":{},"name":"example","namespace":"spring-petclinic"},"spec":{"aggregatedClusterRoles":true}}
        rbac.authorization.kubernetes.io/autoupdate: "true"
      creationTimestamp: "2024-08-14T08:20:58Z"
      labels:
        app.kubernetes.io/managed-by: spring-petclinic
        app.kubernetes.io/name: example
        app.kubernetes.io/part-of: argocd
      name: example-spring-petclinic-argocd-application-controller
      resourceVersion: "79203"
      uid: aeeb2ef5-b531-4fe3-a61a-b5ad8dd8ca6e
    rules:
    - apiGroups:
      - ""
      resources:
      - namespaces
      - persistentvolumeclaims
      - persistentvolumes
      - configmaps
      verbs:
      - '*'
    - apiGroups:
      - compliance.openshift.io
      resources:
      - scansettingbindings
      verbs:
      - '*'
    - apiGroups:
      - '*'
      resources:
      - '*'
      verbs:
      - get
      - list
      - watch
    - nonResourceURLs:
      - '*'
      verbs:
      - get
      - list

    提示

    或者,您可以使用 OpenShift Container Platform Web 控制台从 Administrator 视角进行验证。您可以进入 User ManagementRoles,使用 Filter 选项,选择 Cluster-wide Roles,并搜索聚合的集群角色。您必须打开集群角色来检查详情和配置。

3.6. 其他资源

第 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 视角中,进入 OperatorsInstalled 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. 进入 WorkloadsStatefulSets
    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 个集群。

4.2. 启用 Argo CD Application Controller 的分片的动态扩展

重要

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

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

默认情况下,Argo CD Application Controller 将集群分配给分片。如果您使用 循环 分片算法,则这个静态分配可能会导致分片的分布不均匀,特别是在添加或删除副本时。您可以启用动态扩展分片,以便根据给定时间由 Argo CD Application Controller 管理的集群数量自动调整分片数量。这样可确保分片被良好平衡并优化计算资源的使用。

注意

启用动态扩展后,您无法手动修改分片计数。系统根据给定时间由 Argo CD Application Controller 管理的集群数量自动调整分片数量。

4.2.1. 在 web 控制台中启用分片的动态扩展

您可以使用 OpenShift Container Platform Web 控制台启用分片的动态扩展。

先决条件

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

流程

  1. 在 OpenShift Container Platform Web 控制台的 Administator 视角中,进入 OperatorsInstalled Operators
  2. Installed Operators 列表中,选择 Red Hat OpenShift GitOps Operator,然后点 ArgoCD 选项卡。
  3. 选择您要为其启用分片动态扩展的 Argo CD 实例名称,如 openshift-gitops
  4. YAML 选项卡,然后编辑并配置 spec.controller.sharding 属性,如下所示:

    启用动态扩展的 Argo CD YAML 文件示例

    apiVersion: argoproj.io/v1beta1
    kind: ArgoCD
    metadata:
      name: openshift-gitops
      namespace: openshift-gitops
    spec:
      controller:
        sharding:
          dynamicScalingEnabled: true 1
          minShards: 1 2
          maxShards: 3 3
          clustersPerShard: 1 4

    1
    dynamicScalingEnabled 设置为 true 以启用动态扩展。
    2
    minShards 设置为您要具有的最小分片数量。该值必须设置为 1 或更高。
    3
    maxShards 设置为您要具有的最大分片数量。该值必须大于 minShards 的值。
    4
    clustersPerShard 设置为您要每个分片的集群数量。该值必须设置为 1 或更高。
  5. 点击 Save

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

    注意

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

验证

通过检查命名空间中的 pod 数量来验证分片是否已启用:

  1. 进入 WorkloadsStatefulSets
  2. Project 下拉列表中选择部署了 Argo CD 实例的命名空间,如 openshift-gitops
  3. 点具有 Argo CD 实例名称的 StatefulSet 对象的名称,如 openshift-gitops-apllication-controller
  4. Pods 选项卡,然后验证 pod 的数量等于或大于您在 Argo CD YAML 文件中设置的 minShards 的值。

4.2.2. 使用 CLI 启用分片的动态扩展

您可以使用 OpenShift CLI (oc)启用分片的动态扩展。

先决条件

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

流程

  1. 使用 oc 工具以具有 cluster-admin 权限的用户身份登录集群。
  2. 运行以下命令来启用动态扩展:

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

    示例命令

    $ oc patch argocd openshift-gitops -n openshift-gitops --type=merge --patch='{"spec":{"controller":{"sharding":{"dynamicScalingEnabled":true,"minShards":1,"maxShards":3,"clustersPerShard":1}}}}' 1

    1
    示例命令为 openshift-gitops 命名空间中的 openshift-gitops Argo CD 实例启用动态扩展,并将分片的最小分片数量设置为 1,分片的最大数量设置为 3,每个分片的集群数量设为 1minShardclustersPerShard 的值必须设置为 1 或更高。maxShard 的值必须等于或大于 minShard 的值。

    输出示例

    argocd.argoproj.io/openshift-gitops patched

验证

  1. 检查 Argo CD 实例的 spec.controller.sharding 属性:

    $ oc get argocd <argocd_instance> -n <namespace> -o jsonpath='{.spec.controller.sharding}'

    示例命令

    $ oc get argocd openshift-gitops -n openshift-gitops -o jsonpath='{.spec.controller.sharding}'

    启用分片动态扩展时的输出示例

    {"dynamicScalingEnabled":true,"minShards":1,"maxShards":3,"clustersPerShard":1}

  2. 可选:通过检查 OpenShift Container Platform Web 控制台中 Argo CD 实例的配置 YAML 文件中的 spec.controller.sharding 属性来验证是否启用了动态扩展。
  3. 检查 Argo CD Application Controller pod 的数量:

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

    示例命令

    $ oc get pods -n openshift-gitops -l app.kubernetes.io/name=openshift-gitops-application-controller

    输出示例

    NAME                                           READY   STATUS    RESTARTS   AGE
    openshift-gitops-application-controller-0      1/1     Running   0          2m  1

    1
    Argo CD Application Controller pod 的数量必须大于或等于 minShard 的值。

法律通告

Copyright © 2025 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 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

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

© 2024 Red Hat, Inc.