프로젝트 네임스페이스를 사용한 선언적 멀티테넌시
이 튜토리얼에서는 구성 컨트롤러와 함께 프로젝트 네임스페이스 청사진을 사용하여 특정 프로젝트에서 Google Cloud 리소스를 관리하는 전용 네임스페이스를 만드는 방법을 보여줍니다. 인프라 관리자이면서 내부 테넌트가 프로젝트 구성을 선언적으로 관리하도록 허용하려면 다음 안내를 따르세요.
구성 컨트롤러는 Anthos 및 Google Cloud 리소스를 프로비저닝하고 조정하는 호스팅 서비스입니다. Anthos Config Management의 일부로 Google Cloud 리소스를 프로비저닝, 작동, 조정할 수 있는 API 엔드포인트를 제공합니다.
KRM 청사진은 함께 사용되는 리소스를 패키징하면서 조직 전체에 출시할 수 있는 권장사항을 코드화하는 방법입니다.
프로젝트 네임스페이스 청사진은 사용자 또는 테넌트가 Google Cloud 프로젝트 리소스를 관리할 수 있는 구성 컨트롤러에서 네임스페이스를 프로비저닝하는 데 필요한 모든 리소스가 포함된 KRM 청사진입니다. 청사진을 여러 번 인스턴스화하여 여러 프로젝트 네임스페이스를 설정할 수 있습니다.
프로젝트 네임스페이스 청사진을 사용하면 하나 이상의 프로젝트 네임스페이스를 쉽게 관리할 수 있지만 Google Cloud CLI
을 사용하여 수동 단계를 보려면 Config Connector를 구성하여 네임스페이스의 리소스 관리를 확인하세요.
목표
- 구성 컨트롤러에서 프로젝트 네임스페이스를 구성하기
kpt live apply
를 사용하여 구성 적용하기
비용
이 튜토리얼에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 네임스페이스 청사진에 포함된 전체 리소스 목록은 프로젝트 네임스페이스 청사진 패키지의 리소스 섹션을 참조하세요.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 튜토리얼을 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않도록 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
요구사항
구성 컨트롤러 인스턴스가 있어야 합니다.
Google Cloud 프로젝트가 있어야 합니다. 이것은 프로젝트 네임스페이스가 관리하는 테넌트 프로젝트입니다.
테넌트 프로젝트에 대해 청구를 사용 설정해야 합니다.
시작하기 전에
-
Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.
Google Cloud 콘솔 하단에서 Cloud Shell 세션이 시작되고 명령줄 프롬프트가 표시됩니다. Cloud Shell은 Google Cloud CLI가 사전 설치된 셸 환경으로, 현재 프로젝트의 값이 이미 설정되어 있습니다. 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.
Cloud Shell에서 이 튜토리얼의 모든 명령어를 실행합니다.
환경 설정
Cloud Shell에서 다음 명령어를 실행합니다.
Kubernetes의 기본 명령줄 인터페이스인
kubectl
을 설치합니다.gcloud components install kubectl
KRM 청사진의 기본 명령줄 인터페이스인
kpt
를 설치합니다.gcloud components install kpt
kubectl
및kpt
를 구성하여 Config Controller와 연결합니다.gcloud alpha anthos config controller get-credentials INSTANCE_NAME \ --location COMPUTE_REGION \ --project ADMIN_PROJECT_ID
다음을 바꿉니다.
INSTANCE_NAME
: 구성 컨트롤러 인스턴스의 이름COMPUTE_REGION
: 구성 컨트롤러 인스턴스의 리전(예:us-central1
)ADMIN_PROJECT_ID
: 구성 컨트롤러 인스턴스의 프로젝트 ID
Resource Manager API를 사용 설정합니다.
참고: Resource Manager API는 Config Connector에서 다른 서비스 API의 사용 설정을 관리하는 데 사용됩니다.
gcloud services enable cloudresourcemanager.googleapis.com \ --project TENANT_PROJECT_ID
TENANT_PROJECT_ID
를 테넌트 프로젝트의 ID로 바꿉니다.아직 설치되지 않았으면 ResourceGroup CRD를 설치합니다.
kpt live install-resource-group
Config Connector가
config-control
네임스페이스에서 구성되었고 정상인지 확인합니다.kubectl get ConfigConnectorContext -n config-control \ -o "custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,HEALTHY:.status.healthy"
예상 출력:
NAMESPACE NAME HEALTHY config-control configconnectorcontext.core.cnrm.cloud.google.com true
테넌트 프로젝트에서 Google Cloud 리소스를 관리할 수 있는 권한을 Config Controller에 부여합니다.
export TENANT_PROJECT_ID=TENANT_PROJECT_ID export SA_EMAIL="$(kubectl get ConfigConnectorContext -n config-control \ -o jsonpath='{.items[0].spec.googleServiceAccount}' 2> /dev/null)" gcloud projects add-iam-policy-binding "${TENANT_PROJECT_ID}" \ --member "serviceAccount:${SA_EMAIL}" \ --role "roles/owner" \ --project "${TENANT_PROJECT_ID}"
프로젝트 네임스페이스 구성
다른 프로젝트에 대해 리소스를 관리할 프로젝트 네임스페이스를 만들려면 다음 명령어를 실행합니다.
원하는 작업 디렉터리 내에서
kpt
를 사용하여 프로젝트 네임스페이스 청사진을 가져옵니다.kpt pkg get \ https://github.com/GoogleCloudPlatform/blueprints.git/catalog/project/kcc-namespace@main \ TENANT_PROJECT_ID
TENANT_PROJECT_ID
를 테넌트 프로젝트의 ID로 바꿉니다.이 청사진에서 프로젝트 ID는 프로젝트 네임스페이스의 이름으로도 사용됩니다.
패키지 디렉터리로 이동합니다.
cd ./TENANT_PROJECT_ID/
setters.yaml
파일을 수정하여 패키지를 구성합니다.cat > setters.yaml << EOF apiVersion: v1 kind: ConfigMap metadata: name: setters annotations: config.kubernetes.io/local-config: "true" data: project-id: TENANT_PROJECT_ID management-project-id: ADMIN_PROJECT_ID management-namespace: ADMIN_NAMESPACE projects-namespace: PROJECTS_NAMESPACE networking-namespace: NETWORKING_NAMESPACE EOF
다음을 바꿉니다.
ADMIN_PROJECT_ID
: Config Controller 클러스터가 포함된 프로젝트의 ID입니다.관리자 프로젝트는 Config Connector 워크로드 아이덴티티를 부트스트랩하는 데 사용됩니다.
ADMIN_NAMESPACE
: 프로젝트 네임스페이스를 관리하는 데 사용할 네임스페이스입니다(예:config-control
).관리자 네임스페이스는 관리자 프로젝트에서 Config Connector 워크로드 아이덴티티를 부트스트랩하는 데 사용됩니다.
PROJECTS_NAMESPACE
: 프로젝트 권한을 관리하는 데 사용할 네임스페이스입니다(예:config-control
).프로젝트의 네임스페이스는 IAM 정책 등의 관리에 사용되므로 테넌트 네임스페이스에 대한 액세스 권한이 있는 테넌트는 자신의 권한을 에스컬레이션할 수 없습니다.
시작 영역 청사진을 사용한 경우 프로젝트 관리를 위한
projects
네임스페이스가 이미 있어야 합니다. 그렇지 않은 경우 이를config-control
로 설정합니다.NETWORKING_NAMESPACE
: 공유 VPC를 관리하는 데 사용되는 네임스페이스입니다(예:config-control
).이렇게 하면 사용할 네트워크 또는 서브넷을 선택할 때 네임스페이스 간 리소스 참조를 사용할 수 있습니다.
시작 영역 청사진을 사용한 경우 공유 VPC 관리를 위한
networking
네임스페이스가 이미 있어야 합니다. 그렇지 않은 경우 이를config-control
로 설정합니다.
setter 값을 템플릿으로 지정된 리소스에 렌더링합니다.
kpt fn render
출력 예시:
Package "example-1234": [RUNNING] "gcr.io/kpt-fn/apply-setters:v0.1" [PASS] "gcr.io/kpt-fn/apply-setters:v0.1" Results: [INFO] set field value to "cnrm-network-viewer-example-1234" in file "kcc-namespace-viewer.yaml" in field "metadata.name" [INFO] set field value to "config-control" in file "kcc-namespace-viewer.yaml" in field "metadata.namespace" [INFO] set field value to "cnrm-controller-manager-example-1234" in file "kcc-namespace-viewer.yaml" in field "subjects[0].name" [INFO] set field value to "cnrm-project-viewer-example-1234" in file "kcc-namespace-viewer.yaml" in field "metadata.name" ...(20 line(s) truncated, use '--truncate-output=false' to disable) Successfully executed 1 function(s) in 1 package(s).
테넌트 권한 구성
사용자는 테넌트가 테넌트 프로젝트에서 Google Cloud 프로젝트 리소스를 프로비저닝할 수 있도록 다음 명령어를 통해 테넌트 프로젝트 네임스페이스를 사용할 수 있는 권한을 부여합니다.
RoleBinding
을 사용하여project-admin.yaml
이라는 파일을 만듭니다.cat > project-admin.yaml << EOF apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: project-admin namespace: TENANT_PROJECT_ID roleRef: kind: ClusterRole name: cnrm-admin apiGroup: rbac.authorization.k8s.io subjects: - kind: User name: TENANT_EMAIL apiGroup: rbac.authorization.k8s.io EOF
TENANT_EMAIL
을 테넌트 Google Cloud 사용자 계정의 이메일로 바꿉니다(예:janedoe@example.com
).cnrm-admin
역할을 통해 테넌트가 프로젝트 네임스페이스에 구성 커넥터 리소스를 만들 수 있습니다.그룹 또는 서비스 계정을 승인하는 방법에 대한 자세한 내용은 RoleBindings 또는 ClusterRoleBindings를 사용하여 역할 할당을 참조하세요.
구성 변경사항 적용
이전 단계의 로컬 변경사항은 적용될 때까지 클라우드에 영향을 주지 않습니다.
구성 변경사항을 적용하려면 다음 명령어를 실행합니다.
변경사항을 추적하는 리소스를 만드는 kpt로 작업 디렉터리를 초기화합니다.
kpt live init --namespace ADMIN_NAMESPACE
ADMIN_NAMESPACE
를 프로젝트 네임스페이스 관리에 사용되는 네임스페이스로 바꿉니다(예:config-control
).생성될 리소스를 미리 봅니다.
kpt live apply --dry-run
모든 리소스에 '생성됨(테스트 실행)'이 표시되어야 합니다.
출력 예시:
namespace/example-1234 created (dry-run) rolebinding.rbac.authorization.k8s.io/cnrm-network-viewer-example-1234 created (dry-run) rolebinding.rbac.authorization.k8s.io/cnrm-project-viewer-example-1234 created (dry-run) rolebinding.rbac.authorization.k8s.io/project-admin created (dry-run) configconnectorcontext.core.cnrm.cloud.google.com/configconnectorcontext.core.cnrm.cloud.google.com created (dry-run) iampartialpolicy.iam.cnrm.cloud.google.com/example-1234-sa-workload-identity-binding created (dry-run) iampartialpolicy.iam.cnrm.cloud.google.com/kcc-example-1234-owners-permissions created (dry-run) iamserviceaccount.iam.cnrm.cloud.google.com/kcc-example-1234 created (dry-run) 8 resource(s) applied. 8 created, 0 unchanged, 0 configured, 0 failed (dry-run) 0 resource(s) pruned, 0 skipped, 0 failed (dry-run)
kpt
를 사용하여 리소스를 적용합니다.kpt live apply
모든 리소스가 'created'라고 표시되어 있어야 합니다.
출력 예시:
namespace/example-1234 created rolebinding.rbac.authorization.k8s.io/cnrm-network-viewer-example-1234 created rolebinding.rbac.authorization.k8s.io/cnrm-project-viewer-example-1234 created rolebinding.rbac.authorization.k8s.io/project-admin created configconnectorcontext.core.cnrm.cloud.google.com/configconnectorcontext.core.cnrm.cloud.google.com created iampartialpolicy.iam.cnrm.cloud.google.com/example-1234-sa-workload-identity-binding created iampartialpolicy.iam.cnrm.cloud.google.com/kcc-example-1234-owners-permissions created iamserviceaccount.iam.cnrm.cloud.google.com/kcc-example-1234 created 8 resource(s) applied. 8 created, 0 unchanged, 0 configured, 0 failed 0 resource(s) pruned, 0 skipped, 0 failed
성공 확인
변경사항이 적용되고 지정된 리소스가 프로비저닝되었는지 확인하려면 다음 명령어를 실행합니다.
리소스가 준비될 때까지 기다립니다.
kpt live status --output table --poll-until current
이 명령어는 모든 리소스가
Current
상태이고Ready
또는<None>
조건(준비 조건을 지원하지 않는 리소스의 경우)이 될 때까지 폴링합니다. Ready=true이면Ready
가 녹색이고, Ready=false인 경우에는 빨간색입니다.필요한 경우
ctrl-c
를 사용하여 중단합니다.출력 예시:
NAMESPACE RESOURCE STATUS CONDITIONS AGE MESSAGE Namespace/example-1234 Current <None> 13s Resource is current config-con IAMPartialPolicy/example-1234-sa-workloa Current Ready 11s Resource is Ready config-con IAMPartialPolicy/kcc-example-1234-owners Current Ready 11s Resource is Ready config-con IAMServiceAccount/kcc-example-1234 Current Ready 11s Resource is Ready config-con RoleBinding/cnrm-network-viewer-example- Current <None> 13s Resource is current config-con RoleBinding/cnrm-project-viewer-example- Current <None> 12s Resource is current example-12 ConfigConnectorContext/configconnectorco Current <None> 12s Resource is current example-12 RoleBinding/project-admin Current <None> 12s Resource is current
오류가 발생하면 기본 이벤트 출력을 사용하여 전체 오류 메시지를 확인하세요.
kpt live status
삭제
구성 컨트롤러 사용을 중지하려면 먼저 구성 컨트롤러로 만든 모든 리소스를 삭제한 후 구성 컨트롤러 자체를 삭제해야 합니다.
작업 디렉터리 내에서
kpt
를 사용하여 리소스를 삭제합니다.kpt live destroy
모든 리소스가 삭제될 때까지 기다립니다.
until [ -z "$(kubectl get -R -f . --ignore-not-found | tee /dev/fd/2)" ]; \ do sleep 1; done
이 명령어는 모든 리소스가
Deleted
상태가 될 때까지 폴링합니다.필요한 경우
ctrl-c
를 사용하여 중단합니다.
다음 단계
- KRM 청사진 카탈로그 살펴보기