×

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

聚合集群角色

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

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

  • 您只能为集群范围的 Argo CD 实例的 Argo CD Application Controller 组件创建聚合集群角色。

  • 从 Argo CD 自定义资源 (CR) 中删除 `aggregatedClusterRoles` 字段不会删除用户定义的集群角色。您必须使用 CLI 或 UI 手动删除用户定义的集群角色。

先决条件

  • 您了解 聚合集群角色

  • 您已在 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)

  • 您已禁用集群范围实例的默认集群角色创建。

创建聚合集群角色

创建聚合集群角色的过程包括以下步骤:

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

  2. 为 Application Controller 创建用户定义的集群角色并配置用户定义的权限

启用聚合集群角色的创建

您可以通过将Argo CD自定义资源 (CR) 中的.spec.aggregatedClusterRoles字段的值设置为true来启用聚合集群角色的创建。启用聚合集群角色的创建后,{gitops} 运算符将执行以下操作:

  • 默认情况下,创建一个具有预定义aggregationRule字段的<argocd_name>-<argocd_namespace>-argocd-application-controller聚合集群角色。

  • 创建一个相应的集群角色绑定并进行管理。

  • 为 Application Controller 创建和管理viewadmin集群角色,以将用户定义的权限添加到聚合集群角色中。

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

要将用户定义的权限配置到<argocd_name>-<argocd_namespace>-argocd-application-controller-admin集群角色和聚合集群角色中,您必须创建一个或多个用户定义的集群角色,然后为 Application Controller 配置用户定义的权限。

  • 聚合集群角色继承自<argocd_name>-<argocd_namespace>-argocd-application-controller-admin<argocd_name>-<argocd_namespace>-argocd-application-controller-view集群角色的权限。

  • <argocd_name>-<argocd_namespace>-argocd-application-controller-admin集群角色继承自用户定义的集群角色的权限。

启用聚合集群角色的创建

要为集群范围的 Argo 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 运算符创建以下默认集群角色并进行管理:

    • <argocd_name>-<argocd_namespace>-argocd-application-controller 聚合集群角色

    • <argocd_name>-<argocd_namespace>-argocd-application-controller-view

    • <argocd_name>-<argocd_namespace>-argocd-application-controller-admin

  3. 通过运行以下命令,验证运算符是否已为 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 控制台进行验证。您可以分别转到用户管理角色用户管理角色绑定。您可以搜索具有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 未设置预定义权限。但是,当运算符立即创建一个<argocd_name>-<argocd_namespace>-argocd-application-controller-view集群角色时,相应的预定义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 view集群角色的名称。
    3 预定义的view权限。这些权限将添加到现有的聚合集群角色中。
    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 控制台进行验证。您可以转到用户管理角色,使用筛选器选项,选择集群范围角色,并搜索聚合集群角色、viewadmin集群角色。您必须打开集群角色才能检查详细信息和配置。

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

创建用户定义的集群角色并为 Application Controller 配置用户定义的权限

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

先决条件
  • 您已为集群范围 Argo CD 实例的 Argo CD Application Controller 组件启用了聚合集群角色的创建。

  • 您有以下默认集群角色由 Red Hat OpenShift GitOps 运算符创建和管理:

    • 具有预定义aggregationRule字段的<argocd_name>-<argocd_namespace>-argocd-application-controller聚合集群角色

    • 具有预定义view权限的<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 控制台创建用户定义的集群角色。您可以转到**用户管理** → **角色** → **创建角色**,使用前面的 YAML 模板添加权限,然后单击**创建**。

    示例输出
    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 控制台进行验证。您可以转到**用户管理** → **角色**,使用**筛选器**选项,选择**集群范围角色**,然后搜索<argocd_name>-<argocd_namespace>-argocd-application-controller-admin集群角色。您必须打开集群角色才能检查详细信息和配置。

  3. 通过运行以下命令,验证<argocd_name>-<argocd_namespace>-argocd-application-controller聚合集群角色是否继承自<argocd_name>-<argocd_namespace>-argocd-application-controller-admin<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 控制台进行验证。您可以转到**用户管理** → **角色**,使用**筛选器**选项,选择**集群范围角色**,然后搜索聚合集群角色。您必须打开集群角色才能检查详细信息和配置。