프로젝트 네임스페이스를 사용한 선언적 멀티테넌시

이 튜토리얼에서는 구성 컨트롤러와 함께 프로젝트 네임스페이스 청사진을 사용하여 특정 프로젝트에서 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 구성요소를 사용합니다.

프로젝트 네임스페이스 청사진에 포함된 전체 리소스 목록은 프로젝트 네임스페이스 청사진 패키지의 리소스 섹션을 참조하세요.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.

이 튜토리얼을 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않도록 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

요구사항

시작하기 전에

  1. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

    Google Cloud 콘솔 하단에서 Cloud Shell 세션이 시작되고 명령줄 프롬프트가 표시됩니다. Cloud Shell은 Google Cloud CLI가 사전 설치된 셸 환경으로, 현재 프로젝트의 값이 이미 설정되어 있습니다. 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.

  2. Cloud Shell에서 이 튜토리얼의 모든 명령어를 실행합니다.

환경 설정

Cloud Shell에서 다음 명령어를 실행합니다.

  1. Kubernetes의 기본 명령줄 인터페이스인 kubectl을 설치합니다.

    gcloud components install kubectl
    
  2. KRM 청사진의 기본 명령줄 인터페이스인 kpt를 설치합니다.

    gcloud components install kpt
    
  3. kubectlkpt를 구성하여 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

  4. Resource Manager API를 사용 설정합니다.

    참고: Resource Manager API는 Config Connector에서 다른 서비스 API의 사용 설정을 관리하는 데 사용됩니다.

    gcloud services enable cloudresourcemanager.googleapis.com \
        --project TENANT_PROJECT_ID
    

    TENANT_PROJECT_ID를 테넌트 프로젝트의 ID로 바꿉니다.

  5. 아직 설치되지 않았으면 ResourceGroup CRD를 설치합니다.

    kpt live install-resource-group
    
  6. 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
    
  7. 테넌트 프로젝트에서 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}"
    

프로젝트 네임스페이스 구성

다른 프로젝트에 대해 리소스를 관리할 프로젝트 네임스페이스를 만들려면 다음 명령어를 실행합니다.

  1. 원하는 작업 디렉터리 내에서 kpt를 사용하여 프로젝트 네임스페이스 청사진을 가져옵니다.

    kpt pkg get \
        https://github.com/GoogleCloudPlatform/blueprints.git/catalog/project/kcc-namespace@main \
        TENANT_PROJECT_ID
    

    TENANT_PROJECT_ID를 테넌트 프로젝트의 ID로 바꿉니다.

    이 청사진에서 프로젝트 ID는 프로젝트 네임스페이스의 이름으로도 사용됩니다.

  2. 패키지 디렉터리로 이동합니다.

    cd ./TENANT_PROJECT_ID/
    
  3. 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로 설정합니다.

  4. 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 프로젝트 리소스를 프로비저닝할 수 있도록 다음 명령어를 통해 테넌트 프로젝트 네임스페이스를 사용할 수 있는 권한을 부여합니다.

  1. 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를 사용하여 역할 할당을 참조하세요.

구성 변경사항 적용

이전 단계의 로컬 변경사항은 적용될 때까지 클라우드에 영향을 주지 않습니다.

구성 변경사항을 적용하려면 다음 명령어를 실행합니다.

  1. 변경사항을 추적하는 리소스를 만드는 kpt로 작업 디렉터리를 초기화합니다.

    kpt live init --namespace ADMIN_NAMESPACE
    

    ADMIN_NAMESPACE를 프로젝트 네임스페이스 관리에 사용되는 네임스페이스로 바꿉니다(예: config-control).

  2. 생성될 리소스를 미리 봅니다.

    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)
    
  3. 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
    

성공 확인

변경사항이 적용되고 지정된 리소스가 프로비저닝되었는지 확인하려면 다음 명령어를 실행합니다.

  1. 리소스가 준비될 때까지 기다립니다.

    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
    
  2. 오류가 발생하면 기본 이벤트 출력을 사용하여 전체 오류 메시지를 확인하세요.

    kpt live status
    

삭제

구성 컨트롤러 사용을 중지하려면 먼저 구성 컨트롤러로 만든 모든 리소스를 삭제한 후 구성 컨트롤러 자체를 삭제해야 합니다.

  1. 작업 디렉터리 내에서 kpt를 사용하여 리소스를 삭제합니다.

    kpt live destroy
    
  2. 모든 리소스가 삭제될 때까지 기다립니다.

    until [ -z "$(kubectl get -R -f . --ignore-not-found | tee /dev/fd/2)" ]; \
    do sleep 1; done
    

    이 명령어는 모든 리소스가 Deleted 상태가 될 때까지 폴링합니다.

    필요한 경우 ctrl-c를 사용하여 중단합니다.

다음 단계