×

对于默认的集群范围实例,Red Hat OpenShift GitOps Operator 授予管理某些集群范围资源的其他权限。因此,作为集群管理员,当您部署 Argo CD 作为集群范围实例时,Operator 会为 GitOps 控制平面组件创建额外的集群角色和集群角色绑定。这些集群角色和集群角色绑定提供了 Argo CD 在集群级别运行所需的额外权限。

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

  • 默认 ArgoCD 实例(默认集群范围实例)

  • 用户定义的集群范围 Argo CD 实例

本指南提供带有示例的说明,以帮助您创建用户定义的集群范围 Argo CD 实例,在您定义的包含集群自定义配置的命名空间中部署 Argo CD 应用程序,禁用为集群范围实例创建默认集群角色,并通过为 GitOps 控制平面组件创建新的集群角色和集群角色绑定来自定义用户定义的集群范围实例的权限。

作为开发人员,如果您正在创建 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.

先决条件

  • 您已在 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 应用控制器

    • Argo CD 服务器

    • Argo CD ApplicationSet 控制器(如果已创建 ApplicationSet 控制器)

  • 您已在 `spring-petclinic` 命名空间中部署了一个包含 `customclusterrole` Argo CD 应用(路径为 path)的 `cluster-configs`,并创建了 `test-gitops-ns` 命名空间和 `test-gitops-pv` 持久卷资源。

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

    • `selfHeal` 字段值设置为 `true`

    • `syncPolicy` 字段值设置为 `automated`

    • **标签** 字段设置为 `app.kubernetes.io/part-of=argocd` 值

    • **标签** 字段设置为 `argocd.argoproj.io/managed-by=` 值,以便您定义的命名空间中的 Argo CD 实例可以管理您的命名空间

    • **标签** 字段设置为 `app.kubernetes.io/name=` 值

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

要根据需要向集群范围资源添加或删除权限,必须通过编辑 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 控制平面组件的默认集群角色和集群角色绑定:

    $ oc get ClusterRoles/<argocd_name>-<argocd_namespace>-<control_plane_component>
    $ oc get ClusterRoleBindings/<argocd_name>-<argocd_namespace>-<control_plane_component>
    示例输出
    No resources found

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

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

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

出于示例目的,以下说明仅关注用户定义的集群范围实例。

步骤
  1. 打开 Web 控制台的**管理员**视角,然后转到**用户管理** → **角色** → **创建角色**。

  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 根据 `--` 命名约定命名的集群角色名称。
    2 您想要在集群级别授予权限的资源。
  3. 单击**创建**以添加集群角色。

  4. 通过执行以下步骤,找到您要为其自定义权限的控制平面组件使用的服务帐户:

    1. 转到**工作负载** → **Pod**。

    2. 从**项目**列表中,选择安装用户定义的集群范围实例的项目。

    3. 单击控制平面组件的 Pod,然后转到**YAML** 选项卡。

    4. 找到 `spec.ServiceAccount` 字段并记下服务帐户。

  5. 转到**用户管理** → **角色绑定** → **创建绑定**。

  6. 单击**创建绑定**。

  7. 将**绑定类型**选择为**集群范围角色绑定 (ClusterRoleBinding)**。

  8. 按照 `--` 命名约定,为**角色绑定名称**输入唯一值。

  9. 从**角色名称**的下拉列表中选择新创建的集群角色。

  10. 将**主体**选择为**服务帐户**,并提供**主体命名空间**和**名称**。

    1. **主体命名空间**: `spring-petclinic`

    2. **主体名称**: `example-argocd-application-controller`

      对于**主体名称**,请确保您配置的值与您要为其自定义权限的控制平面组件的 `spec.ServiceAccount` 字段的值相同。

  11. 单击**创建**。

    您已为控制平面组件的服务帐户和命名空间创建了所需的权限。`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