1.7. Argo CD プッシュモデル用のカスタマイズされたサービスアカウントの作成


ハブクラスター上に ManagedServiceAccount リソースを作成することにより、マネージドクラスター上にサービスアカウントを作成します。ClusterPermission リソースを使用して、特定のパーミッションをサービスアカウントに付与します。

Argo CD プッシュモデルで使用するカスタマイズされたサービスアカウントを作成すると、次の利点があります。

  • アプリケーションマネージャーアドオンは、各マネージドクラスター上で実行されます。デフォルトでは、Argo CD コントローラーはサービスアカウントアプリケーションマネージャーを使用して、これらのリソースをマネージドクラスターにプッシュします。
  • アプリケーションサブスクリプションアドオンはアプリケーションマネージャーサービスを使用してマネージドクラスターにアプリケーションをデプロイするため、アプリケーションマネージャーサービスアカウントには大規模なアクセスパーミッションのセットがあります。制限された権限セットが必要な場合は、アプリケーションマネージャーサービスアカウントを使用しないでください。
  • Argo CD プッシュモデルで使用する別のサービスアカウントを指定できます。Argo CD コントローラーが集中ハブクラスターからマネージドクラスターにリソースをプッシュする場合、デフォルトのアプリケーションマネージャーとは異なるサービスアカウントを使用できます。別のサービスアカウントを使用すると、このサービスアカウントに付与されるアクセス許可を制御できます。
  • サービスアカウントはマネージドクラスター上に存在している必要があります。関連するアクセスパーミッションが割り当てられたサービスアカウントの作成を容易にするには、一元化されたハブクラスターで ManagedServiceAccount リソースと新しい ClusterPermission リソースを使用します。

次の手順をすべて完了すると、マネージドサービスアカウントにクラスターのアクセスパーミッションを付与できます。クラスター権限があると、マネージドサービスアカウントには、マネージドクラスターにアプリケーションリソースをデプロイするために必要な権限が与えられます。以下の手順を実行します。

1.7.1. マネージドサービスアカウントの作成

ハブ上の ManagedServiceAccount カスタムリソースは、マネージドクラスター上に ServiceAccount を作成する場合に便利です。ハブクラスターの <managed-cluster> namespace に ManagedServiceAccount カスタムリソースが作成されると、マネージドクラスターに ServiceAccount が作成されます。

マネージドサービスアカウントを作成するには、ManagedServiceAccount アドオンの有効化 を参照してください。

1.7.2. クラスターパーミッションの作成

サービスアカウントの作成時には、パーミッションはそのアカウントに関連付けられません。新規サービスアカウントにパーミッションを付与するには、ClusterPermission リソースを使用します。ClusterPermission リソースは、ハブのマネージドクラスター namespace に作成されます。このリソースを使用すると、ロール、マネージドクラスター上のクラスターロールリソースを作成し、RoleBinding または ClusterRoleBinding リソースを使用して、サービスアカウントにバインドする場合に便利です。

  1. <managed-sa-sample> サービスアカウントのアクセス許可を、<managed-cluster> 上の mortgage namespace にデプロイされるサンプルの住宅ローンアプリケーションに付与するには、以下の内容を含む YAML を作成します。
apiVersion: rbac.open-cluster-management.io/v1alpha1
kind: ClusterPermission
metadata:
  name: <clusterpermission-msa-subject-sample>
  namespace: <managed cluster>
spec:
  roles:
  - namespace: default
    rules:
    - apiGroups: ["apps"]
      resources: ["deployments"]
      verbs: ["get", "list", "create", "update", "delete", "patch"]
    - apiGroups: [""]
      resources: ["configmaps", "secrets", "pods", "podtemplates", "persistentvolumeclaims", "persistentvolumes"]
      verbs: ["get", "update", "list", "create", "delete", "patch"]
    - apiGroups: ["storage.k8s.io"]
      resources: ["*"]
      verbs: ["list"]
  - namespace: mortgage
    rules:
    - apiGroups: ["apps"]
      resources: ["deployments"]
      verbs: ["get", "list", "create", "update", "delete", "patch"]
    - apiGroups: [""]
      resources: ["configmaps", "secrets", "pods", "services", "namespace"]
      verbs: ["get", "update", "list", "create", "delete", "patch"]
  clusterRole:
    rules:
    - apiGroups: ["*"]
      resources: ["*"]
      verbs: ["get", "list"]
  roleBindings:
  - namespace: default
    roleRef:
      kind: Role
    subject:
      apiGroup: authentication.open-cluster-management.io
      kind: ManagedServiceAccount
      name: <managed-sa-sample>
  - namespace: mortgage
    roleRef:
      kind: Role
    subject:
      apiGroup: authentication.open-cluster-management.io
      kind: ManagedServiceAccount
      name: <managed-sa-sample>
  clusterRoleBinding:
    subject:
      apiGroup: authentication.open-cluster-management.io
      kind: ManagedServiceAccount
      name: <managed-sa-sample>
Copy to Clipboard Toggle word wrap
  1. YAML ファイルを cluster-permission.yaml という名前のファイルとして保存します。
  2. oc apply -f cluster-permission.yaml を実行します。
  3. サンプル <clusterpermission> は、mortgage namespace に <clusterpermission-msa-subject-sample> というロールを作成します。mortgage の namespace が存在しない場合は、この namespace を作成します。
  4. <managed-cluster> で作成されたリソースを確認します。

サンプル <clusterpermission> を作成すると、以下のリソースがサンプルのマネージドクラスターに作成されます。

  • デフォルトの namespace 内の <clusterpermission-msa-subject-sample> という名前の Role が 1 つ。
  • ロールを管理されたサービスアカウントにバインドするための、default namespace にある <clusterpermission-msa-subject-sample> と呼ばれる RoleBinding が 1 つ。
  • mortgage namespace に <clusterpermission-msa-subject-sample> と呼ばれる Role が 1 つ。
  • ロールをマネージドサービスアカウントにバインドするための、mortgage namespace 内の <clusterpermission-msa-subject-sample> と呼ばれる RoleBinding が 1 つ。
  • <clusterpermission-msa-subject-sample> と呼ばれる ClusterRole が 1 つ。
  • ClusterRole をマネージドサービスアカウントにバインドするための <clusterpermission-msa-subject-sample> と呼ばれる ClusterRoleBinding が 1 つ。

1.7.3. 既存のロールを使用してクラスター権限を作成する

ClusterPermission リソースを作成すると、新しいロールが自動的に作成されます。既存のロールで ClusterPermission リソースを引き続き使用できます。

たとえば、次の YAML サンプルを適用すると、既存の ClusterRole を使用する ClusterPermission リソースが作成されます。

apiVersion: rbac.open-cluster-management.io/v1alpha1
kind: ClusterPermission
metadata:
  name: clusterpermission-existing-role-sample
spec:
  roleBindings:
    - name: default-rb-cluster1 
1

      namespace: default
      roleRef: 
2

        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: argocd-application-controller-1
      subject:
        namespace: openshift-gitops
        kind: ServiceAccount
        name: sa-sample-existing
    - name: kubevirt-rb-cluster1
      namespace: kubevirt
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: Role
        name: argocd-application-controller-2
      subject:
        apiGroup: rbac.authorization.k8s.io
        kind: User
        name: user1
  clusterRoleBinding:
      name: crb-cluster1-argo-app-con-3 
3

      roleRef: 
4

        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: argocd-application-controller-3
      subject:
        apiGroup: rbac.authorization.k8s.io
        kind: Group
        name: group1
Copy to Clipboard Toggle word wrap
1
デフォルトの ClusterPermission 名を使用する代わりに、RoleBinding フィールドを作成するためのオプションの名前。
2
マネージドクラスター上の既存の ClusterRole を参照します。
3
デフォルトの ClusterPermission 名を使用する代わりに ClusterRoleBinding フィールドを作成するためのオプションの名前。
4
マネージドクラスター上の既存の ClusterRole を参照します。

1.7.4. サブジェクトを参照するためのクラスター権限リソースの作成

異なるサブジェクトを参照する ClusterPermission リソースを作成すると、一度に 1 つのサブジェクトのみを操作するのではなく、同時に異なるサブジェクトを操作できます。

例については、指定された subject フィールドを含む次の YAML を参照してください。

apiVersion: rbac.open-cluster-management.io/v1alpha1
kind: ClusterPermission
metadata:
  name: clusterpermission-users-groups
spec:
  roleBindings:
    - namespace: default
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: argocd-application-controller-users-1
      subjects:
      - namespace: openshift-gitops
        kind: ServiceAccount
        name: sa-sample-existing
      - apiGroup: rbac.authorization.k8s.io
        kind: User
        name: argo-users1
    - name: kubevirt-rb-cluster1-users1
      namespace: kube-system
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: Role
        name: argocd-application-controller-users-2
      subjects:
      - apiGroup: rbac.authorization.k8s.io
        kind: User
        name: users1
      - apiGroup: rbac.authorization.k8s.io
        kind: User
        name: users2
  clusterRoleBinding:
      name: crb-cluster1-argo-app-con-groups
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: argocd-application-controller-3
      subjects:
      - apiGroup: rbac.authorization.k8s.io
        kind: Group
        name: groups1
      - apiGroup: rbac.authorization.k8s.io
        kind: Group
        name: groups2
Copy to Clipboard Toggle word wrap

1.7.5. GitOpsCluster リソースでの管理サービスアカウントの使用

GitOpsCluster リソースは、配置を使用して、選択したマネージドクラスターを Argo CD にインポートします。これには、クラスターへのアクセスに使用される情報を含む Argo CD クラスターシークレットの作成が含まれます。デフォルトでは、Argo CD クラスターシークレットは、アプリケーションマネージャーサービスアカウントを使用してマネージドクラスターにアクセスします。

  1. マネージドサービスアカウントを使用するように GitOpsCluster リソースを更新するには、マネージドサービスアカウントの名前を指定して ManagedServiceAccountRef プロパティーを追加します。
  2. 次のサンプルを gitops.yaml ファイルとして保存し、GitOpsCluster カスタムリソースを作成します。

    apiVersion: apps.open-cluster-management.io/v1beta1
    kind: GitOpsCluster
    metadata:
      name: argo-acm-importer
      namespace: openshift-gitops
    spec:
      managedServiceAccountRef: <managed-sa-sample>
      argoServer:
        cluster: notused
        argoNamespace: openshift-gitops
      placementRef:
        kind: Placement
        apiVersion: cluster.open-cluster-management.io/v1beta1
        name: all-openshift-clusters
        namespace: openshift-gitops
    Copy to Clipboard Toggle word wrap
  3. ファイルを適用するには oc apply -f gitops.yaml を実行します。
  4. openshift-gitops namespace に移動し、<managed cluster-managed-sa-sample-cluster-secret> という名前の新しい Argo CD クラスターシークレットがあることを確認します。以下のコマンドを実行します。

    oc get secrets -n openshift-gitops <managed cluster-managed-sa-sample-cluster-secret>
    Copy to Clipboard Toggle word wrap
  5. 以下の出力を参照して確認します。

    NAME                                        TYPE     DATA   AGE
    <managed cluster-managed-sa-sample-cluster-secret>   Opaque   3      4m2s
    Copy to Clipboard Toggle word wrap

1.7.6. Argo CD アプリケーションの作成

プッシュモデルを使用して、Argo CD コンソールから Argo CD アプリケーションをデプロイします。Argo CD アプリケーションは、マネージドサービスアカウント <managed-sa-sample> でデプロイされます。

  1. Argo CD コンソールにログインします。
  2. Create a new application をクリックします。
  3. クラスター URL を選択します。
  4. Argo CD アプリケーションに移動し、<managed cluster> に伝播したロールやクラスターロールなど、指定のパーミッションがあることを確認します。
When the GitOpsCluster resource is updated with the `ManagedServiceAccountRef`, each managed cluster in the placement of this GitOpsCluster needs to have the service account. If you have several managed clusters, it becomes tedious for you to create the managed service account and cluster permission for each managed cluster. You can simply this process by using a policy to create the managed service account and cluster permission for all your managed clusters
Copy to Clipboard Toggle word wrap

ManagedServiceAccountRef リソースと ClusterPermission リソースをハブクラスターに適用すると、このポリシーの配置はローカルクラスターにバインドされます。これらのリソースを、GitOpsCluster リソースの配置内のすべてのマネージドクラスターのマネージドクラスター namespace に複製します。

ポリシーを使用して ManagedServiceAccount および ClusterPermission リソースを作成すると、次の属性が含まれます。

  • ポリシー内の ManagedServiceAccountClusterPermission オブジェクトテンプレートを更新すると、すべてのマネージドクラスターの ManagedServiceAccount および ClusterPermission リソースがすべて更新されます。
  • ManagedServiceAccount および ClusterPermission リソースを直接更新すると、ポリシーが適用されるため、元の状態に戻されます。
  • GitOpsCluster の配置に関する決定が変更された場合、ポリシーはマネージドクラスターの namespace 内のリソースの作成と削除を管理します。

    1. マネージドサービスアカウントとクラスター権限を作成するための YAML のポリシーを作成するには、次の内容を含む YAML を作成します。
    apiVersion: policy.open-cluster-management.io/v1
    kind: Policy
    metadata:
      name: policy-gitops
      namespace: openshift-gitops
      annotations:
        policy.open-cluster-management.io/standards: NIST-CSF
        policy.open-cluster-management.io/categories: PR.PT Protective Technology
        policy.open-cluster-management.io/controls: PR.PT-3 Least Functionality
    spec:
      remediationAction: enforce
      disabled: false
      policy-templates:
    
        - objectDefinition:
            apiVersion: policy.open-cluster-management.io/v1
            kind: ConfigurationPolicy
            metadata:
              name: policy-gitops-sub
            spec:
              pruneObjectBehavior: None
              remediationAction: enforce
              severity: low
              object-templates-raw: |
                {{ range $placedec := (lookup "cluster.open-cluster-management.io/v1beta1" "PlacementDecision" "openshift-gitops" "" "cluster.open-cluster-management.io/placement=aws-app-placement").items }}
                {{ range $clustdec := $placedec.status.decisions }}
                - complianceType: musthave
                  objectDefinition:
                    apiVersion: authentication.open-cluster-management.io/v1alpha1
                    kind: ManagedServiceAccount
                    metadata:
                      name: <managed-sa-sample>
                      namespace: {{ $clustdec.clusterName }}
                    spec:
                      rotation: {}
                - complianceType: musthave
                  objectDefinition:
                    apiVersion: rbac.open-cluster-management.io/v1alpha1
                    kind: ClusterPermission
                    metadata:
                      name: <clusterpermission-msa-subject-sample>
                      namespace: {{ $clustdec.clusterName }}
                    spec:
                      roles:
                      - namespace: default
                        rules:
                        - apiGroups: ["apps"]
                          resources: ["deployments"]
                          verbs: ["get", "list", "create", "update", "delete"]
                        - apiGroups: [""]
                          resources: ["configmaps", "secrets", "pods", "podtemplates", "persistentvolumeclaims", "persistentvolumes"]
                          verbs: ["get", "update", "list", "create", "delete"]
                        - apiGroups: ["storage.k8s.io"]
                          resources: ["*"]
                          verbs: ["list"]
                      - namespace: mortgage
                        rules:
                        - apiGroups: ["apps"]
                          resources: ["deployments"]
                          verbs: ["get", "list", "create", "update", "delete"]
                        - apiGroups: [""]
                          resources: ["configmaps", "secrets", "pods", "services", "namespace"]
                          verbs: ["get", "update", "list", "create", "delete"]
                      clusterRole:
                        rules:
                        - apiGroups: ["*"]
                          resources: ["*"]
                          verbs: ["get", "list"]
                      roleBindings:
                      - namespace: default
                        roleRef:
                          kind: Role
                        subject:
                          apiGroup: authentication.open-cluster-management.io
                          kind: ManagedServiceAccount
                          name: <managed-sa-sample>
                      - namespace: mortgage
                        roleRef:
                          kind: Role
                        subject:
                          apiGroup: authentication.open-cluster-management.io
                          kind: ManagedServiceAccount
                          name: <managed-sa-sample>
                      clusterRoleBinding:
                        subject:
                          apiGroup: authentication.open-cluster-management.io
                          kind: ManagedServiceAccount
                          name: <managed-sa-sample>
                {{ end }}
                {{ end }}
    ---
    apiVersion: policy.open-cluster-management.io/v1
    kind: PlacementBinding
    metadata:
      name: binding-policy-gitops
      namespace: openshift-gitops
    placementRef:
      name: lc-app-placement
      kind: Placement
      apiGroup: cluster.open-cluster-management.io
    subjects:
      - name: policy-gitops
        kind: Policy
        apiGroup: policy.open-cluster-management.io
    ---
    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: Placement
    metadata:
      name: lc-app-placement
      namespace: openshift-gitops
    spec:
      numberOfClusters: 1
      predicates:
      - requiredClusterSelector:
          labelSelector:
            matchLabels:
              name: <your-local-cluster-name>
    Copy to Clipboard Toggle word wrap
    1. YAML ファイルを policy.yaml というファイルとして保存します。
    2. oc apply -f policy.yaml を実行します。
    3. ポリシーのオブジェクトテンプレートでは、GitOpsCluster に関連付けられた配置の決定を繰り返し処理し、次の ManagedServiceAccount および ClusterPermission テンプレートを適用します。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat