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


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

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

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

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

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

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

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

1.9.2. 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.9.3. 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> に伝播したロールやクラスターロールなど、指定のパーミッションがあることを確認します。

GitOpsCluster リソースが ManagedServiceAccountRef で更新されると、この GitOpsCluster の配置内の各マネージドクラスターにサービスアカウントが必要になります。複数のマネージドクラスターがある場合、マネージドクラスターごとにマネージドサービスアカウントとクラスター権限を作成するのは面倒になります。このプロセスは、ポリシーを使用してマネージドサービスアカウントとすべてのマネージドクラスターのクラスター権限を作成することで簡素化できます。

ManagedServiceAccount リソースと 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