1.7. Argo CD 내보내기 모델에 대한 사용자 지정 서비스 계정 생성
hub 클러스터에서 managedserviceaccount
리소스를 생성하여 관리 클러스터에 서비스 계정을 생성합니다. clusterpermission
리소스를 사용하여 서비스 계정에 특정 권한을 부여합니다.
Argo CD 내보내기 모델에 사용할 사용자 정의화 서비스 계정을 생성하면 다음과 같은 이점이 있습니다.
- 애플리케이션 관리자 애드온은 각 관리 클러스터에서 실행됩니다. 기본적으로 Argo CD 컨트롤러는 서비스 계정 애플리케이션 관리자를 사용하여 이러한 리소스를 관리 클러스터로 내보냅니다.
- 애플리케이션 서브스크립션 애드온에서 애플리케이션 관리자 서비스를 사용하여 관리형 클러스터에 애플리케이션을 배포하므로 애플리케이션 관리자 서비스 계정에는 많은 권한이 있습니다. 제한된 권한 집합을 원하는 경우 애플리케이션 관리자 서비스 계정을 사용하지 마십시오.
- Argo CD 내보내기 모델을 사용할 다른 서비스 계정을 지정할 수 있습니다. Argo CD 컨트롤러가 중앙 집중식 허브 클러스터에서 관리 클러스터로 리소스를 푸시하는 경우 기본 애플리케이션 관리자와 다른 서비스 계정을 사용할 수 있습니다. 다른 서비스 계정을 사용하면 이 서비스 계정에 부여된 권한을 제어할 수 있습니다.
-
서비스 계정이 관리 클러스터에 있어야 합니다. 연결된 권한으로 서비스 계정을 쉽게 생성하려면 중앙 허브 클러스터에서
managedserviceaccount
리소스 및 새clusterpermission
리소스를 사용합니다.
다음 절차를 모두 완료한 후 관리 서비스 계정에 클러스터 권한을 부여할 수 있습니다. 클러스터 권한이 있으면 관리 서비스 계정에는 관리 클러스터에 애플리케이션 리소스를 배포하는 데 필요한 권한이 있습니다. 다음 절차를 완료하십시오.
1.7.1. 관리 서비스 계정 생성
허브의 managedserviceaccount
사용자 지정 리소스는 관리 클러스터에서 serviceaccounts
를 편리하게 생성할 수 있는 방법을 제공합니다. hub 클러스터의 <managed _cluster> 네임스페이스에
사용자 정의 리소스가 생성되면 관리 클러스터에 managed
serviceccountserviceccount
가 생성됩니다.
관리 서비스 계정을 생성하려면 managedserviceaccount 애드온 활성화를 참조하십시오.
1.7.2. 클러스터 권한 생성
서비스 계정이 생성되면 연결된 권한이 없습니다. 새 서비스 계정에 권한을 부여하려면 clusterpermission
리소스를 사용합니다. clusterpermission
리소스는 허브의 관리 클러스터 네임스페이스에 생성됩니다. 역할, 관리 클러스터에서 클러스터 역할 리소스를 생성하고 rolebinding
또는 clusterrolebinding
리소스를 통해 서비스 계정에 바인딩할 수 있는 편리한 방법을 제공합니다.
<
managed-sa-sample
> 서비스 계정 권한을 <managed
-sa-sample>의 mortgage 네임스페이스에 배포된 샘플 mortgage 애플리케이션에 부여하려면 다음 콘텐츠를 사용하여 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>
-
YAML 파일을
cluster-permission.yaml
이라는 파일에 저장합니다. -
oc apply -f cluster-permission.yaml
을 실행합니다. -
샘플 <
clusterpermission
>은 mortgage 네임스페이스에서 <clusterpermission-msa-subject-sample
>이라는 역할을 생성합니다. 아직 없는 경우 네임스페이스mortgage
를 생성합니다. -
<
managed cluster>에서 생성된 리소스를 검토합니다
.
샘플 < clusterpermission>
을 생성한 후 샘플 관리 클러스터에 다음 리소스가 생성됩니다.
-
기본 네임스페이스에서 &
lt;clusterpermission-msa-subject-sample>
;이라는 하나의 역할입니다. -
역할을 관리 서비스 계정에 바인딩하기 위해 기본 네임스페이스에서 <
clusterpermission-msa-subject-sample
>이라고 하는 하나의 roleBinding. -
mortgage 네임스페이스에서 &
lt;clusterpermission-msa-subject-sample>
;이라는 하나의 역할입니다. -
역할을 관리 서비스 계정에 바인딩하기 위해 mortgage 네임스페이스에서 <
clusterpermission-msa-subject-sample
>이라고 하는 하나의 roleBinding. -
<
clusterpermission-msa-subject-sample>이라는 하나의 clusterRole
. -
clusterRole을 관리 서비스 계정에 바인딩하기 위해 <
clusterpermission-msa-subject-sample
>이라는 하나의 clusterRoleBinding.
1.7.3. GitOpsCluster 리소스에서 관리형 서비스 계정 사용
GitOpsCluster
리소스는 배치를 사용하여 클러스터에 액세스하는 데 사용되는 정보가 포함된 Argo CD 클러스터 시크릿 생성을 포함하여 선택한 관리 클러스터를 Argo CD로 가져옵니다. 기본적으로 Argo CD 클러스터 시크릿은 애플리케이션 관리자 서비스 계정을 사용하여 관리 클러스터에 액세스합니다.
-
관리 서비스 계정을 사용하도록
GitOpsCluster
리소스를 업데이트하려면 관리 서비스 계정 이름으로managedServiceAccountRef
속성을 추가합니다. 다음 샘플을
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
-
oc apply -f gitops.yaml
을 실행하여 파일을 적용합니다. openshift-gitops
네임스페이스로 이동하여 <managed cluster-managed-sa-sample-cluster-secret>이라는 이름으로 새 Argo CD 클러스터 시크릿
이 있는지 확인합니다. 다음 명령을 실행합니다.oc get secrets -n openshift-gitops <managed cluster-managed-sa-sample-cluster-secret>
다음 출력을 확인하여 확인합니다.
NAME TYPE DATA AGE <managed cluster-managed-sa-sample-cluster-secret> Opaque 3 4m2s
1.7.4. Argo CD 애플리케이션 생성
푸시 모델을 사용하여 Argo CD 콘솔에서 Argo CD 애플리케이션을 배포합니다. Argo CD 애플리케이션은 관리 서비스 계정 < managed-sa-sample>과 함께 배포됩니다
.
- Argo CD 콘솔에 로그인합니다.
- 새 애플리케이션 생성을 클릭합니다.
- 클러스터 URL을 선택합니다.
-
Argo CD 애플리케이션으로 이동하여 역할 및 클러스터 역할과 같이 <
managed cluster>로 전파한 지정된 권한이 있는지 확인합니다
.
1.7.5. 정책을 사용하여 관리 서비스 계정 및 클러스터 권한 생성
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
managedServiceAccount
및 clusterPermission
리소스를 hub 클러스터에 적용하면 이 정책의 배치가 로컬 클러스터에 바인딩됩니다. GitOpsCluster 리소스 배치에서 모든 관리 클러스터의 관리 클러스터 네임스페이스에 해당 리소스를 복제합니다.
정책을 사용하여 managedServiceAccount
및 clusterPermission
리소스를 생성하면 다음 속성이 포함됩니다.
-
정책에서
managedServiceAccount
및clusterPermission
오브젝트 템플릿을 업데이트하면 모든 관리 클러스터에서 모든managedServiceAccount
및clusterPermission
리소스가 업데이트됩니다. -
managedServiceAccount
및clusterPermission
리소스로 직접 업데이트하면 정책에 의해 적용되므로 원래 상태로 되돌아갑니다. GitOpsCluster 배치에 대한 배치 결정이 변경되면 정책은 관리 클러스터 네임스페이스의 리소스 생성 및 삭제를 관리합니다.
- 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: local-cluster
-
YAML 파일을
policy.yaml
이라는 파일에 저장합니다. -
oc apply -f policy.yaml
을 실행합니다. -
정책의 오브젝트 템플릿에서 GitOpsCluster 관련 배치 결정을 반복하고 다음
managedServiceAccount
및clusterPermission
템플릿을 적용합니다.