커스텀 조직 정책을 사용하여 GKE 리소스에 대한 작업 제한


이 페이지에서는 Google Cloud 조직 정책 서비스에서 커스텀 제약조건을 사용하여 Google Kubernetes Engine(GKE) 리소스에 대한 특정 작업을 제한하는 방법을 보여줍니다. 조직 정책에 대한 자세한 내용은 커스텀 조직 정책을 참조하세요.

조직 정책 및 제약조건 정보

Google Cloud 조직 정책을 사용하면 조직 리소스를 중앙에서 프로그래매틱 방식으로 제어할 수 있습니다. 조직 정책 관리자Google Cloud 리소스 계층 구조에서 Google Cloud 리소스 및 이러한 리소스의 하위 요소에 적용되는 제약조건이라는 제한사항 집합인 조직 정책을 정의할 수 있습니다. 그리하여 조직, 폴더, 프로젝트 수준에서 조직 정책을 시행할 수 있습니다.

조직 정책은 다양한 Google Cloud 서비스에 대한 사전 정의된 제약조건을 제공합니다. 그러나 조직 정책에서 제한되는 특정 필드를 보다 세부적으로 맞춤설정 가능한 방식으로 제어하려면 커스텀 제약조건을 만들고 커스텀 조직 정책에 이러한 커스텀 제약조건을 사용하면 됩니다.

GKE에서 지원되는 리소스

GKE의 경우 Google Kubernetes Engine API v1의 Cluster 또는 NodePool 리소스의 아무 필드에서나 CREATE 또는 UPDATE 메서드에 대한 커스텀 제약 조건을 생성할 수 있으나, 출력 전용 필드와 다음 필드는 제외됩니다.

  • projects.locations.clusters.masterAuth.clientKey
  • projects.locations.clusters.masterAuth.password

정책 상속

기본적으로 정책은 정책을 적용하는 리소스의 하위 요소에 상속됩니다. 예를 들어 폴더에 정책을 적용하면 Google Cloud가 폴더의 모든 프로젝트에 정책을 적용합니다. 이 동작 및 이를 변경하는 방법에 대한 자세한 내용은 계층 구조 평가 규칙을 참조하세요.

가격 책정

조직 정책 및 제약조건은 무료로 제공됩니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

커스텀 제약조건 만들기

새 커스텀 제약조건을 만들려면 YAML 파일에서 제약조건을 정의하고 Google Cloud CLI를 사용하여 조직에서 커스텀 제약조건을 적용합니다.

  1. 커스텀 제약조건에 대한 YAML 파일을 만듭니다.

    name: organizations/ORGANIZATION_ID/customConstraints/custom.CONSTRAINT_NAME
    resourceTypes:
    - container.googleapis.com/RESOURCE_NAME
    methodTypes:
    - METHOD1
    - METHOD2
    condition: "resource.OBJECT_NAME.FIELD_NAME == VALUE"
    actionType: ACTION
    displayName: DISPLAY_NAME
    description: DESCRIPTION
    

    다음을 바꿉니다.

    • ORGANIZATION_ID: 조직 ID(예: 123456789)
    • CONSTRAINT_NAME: 새 커스텀 제약조건에 사용하려는 이름입니다. 커스텀 제약조건은 custom.으로 시작해야 하며 대문자, 소문자 또는 숫자만 포함할 수 있습니다(예: custom.enableGkeAutopilot). 이 필드의 최대 길이는 프리픽스를 제외하고 70자입니다(예: organizations/123456789/customConstraints/custom.).
    • RESOURCE_NAME: 제한할 객체 및 필드가 포함된 GKE API REST 리소스의 이름입니다(URI 아님). 예를 들면 Cluster 또는 NodePool입니다.
    • METHOD1,METHOD2,...: 제약조건을 시행할 RESTful 메서드 목록입니다. CREATE 또는 CREATEUPDATE일 수 있습니다.
    • condition: 요청을 검증하는 조건으로서 Common Expression Language(CEL)로 작성됩니다. 이 필드의 최대 길이는 1000자(영문 기준)입니다. 표현식은 다음 필드를 포함해야 하며 &&|| 같은 논리 연산자를 지원합니다.

      • OBJECT_NAME: 제한하려는 GKE API 객체의 이름(pascalCase 형식)입니다. 예를 들면 privateClusterConfig입니다.
      • FIELD_NAME: 제한하려는 GKE API 필드의 이름(pascalCase 형식)입니다. 예를 들면 enablePrivateNodes입니다.
      • VALUE: 필드의 값입니다. 불리언 필드의 경우 true 또는 false를 사용합니다. 문자열 필드에는 "STRING"을 사용합니다.
    • ACTION: condition이 충족될 때 수행할 작업입니다. ALLOW 또는 DENY일 수 있습니다.

    • DISPLAY_NAME: 제약조건에 대한 사용자 친화적인 이름. 이 필드의 최대 길이는 200자(영문 기준)입니다.

    • DESCRIPTION: 정책을 위반할 때 오류 메시지로 표시할 제약조건에 대한 사용자 친화적인 설명입니다. 이 필드의 최대 길이는 2,000자(영문 기준)입니다.

  2. 커스텀 제약조건을 적용합니다.

    gcloud org-policies set-custom-constraint PATH_TO_FILE
    

    PATH_TO_FILE을 커스텀 제약조건 정의의 파일 경로로 바꿉니다.

  3. 커스텀 제약조건이 있는지 확인합니다.

    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    

    출력은 다음과 비슷합니다.

    CONSTRAINT                     LIST_POLICY    BOOLEAN_POLICY    ETAG
    custom.enableGkeAutopilot      -              SET               COCsm5QGENiXi2E=
    ...
    

커스텀 제약조건 시행

새 커스텀 제약조건을 시행하려면 제약조건을 참조하는 조직 정책을 만든 후 조직 정책을 적용합니다.

  1. 조직 정책에 대한 YAML 파일을 만듭니다.

    name: RESOURCE_HIERARCHY/policies/POLICY_NAME
    spec:
      rules:
      - enforce: true
    

    다음을 바꿉니다.

    • RESOURCE_HIERARCHY: 시정 조치 범위에 영향을 미치는 새 정책의 위치입니다. Google Cloud 리소스 계층 구조를 가이드로 사용합니다. 예를 들어 특정 프로젝트에 정책을 적용하려면 projects/PROJECT_ID를 사용합니다. 특정 조직에 정책을 적용하려면 organizations/ORGANIZATION_ID를 사용합니다.
    • POLICY_NAME: 새 정책의 이름입니다.
  2. 정책을 시행합니다.

    gcloud org-policies set-policy PATH_TO_POLICY
    

    PATH_TO_POLICY를 정책 정의 파일의 경로로 바꿉니다.

  3. 정책이 있는지 확인합니다.

    gcloud org-policies list \
        --RESOURCE_FLAG=RESOURCE_ID
    

    다음을 바꿉니다.

    • RESOURCE_FLAG: 정책을 시행한 Google Cloud 리소스입니다. 예를 들면 project 또는 folder입니다.
    • RESOURCE_ID: 정책을 적용한 리소스의 ID입니다. 예를 들어 Google Cloud 폴더 ID입니다.

    인수 목록은 gcloud org-policies list를 참조하세요.

    출력은 다음과 비슷합니다.

    CONSTRAINT                                    LIST_POLICY    BOOLEAN_POLICY    ETAG
    iam.disableWorkloadIdentityClusterCreation    -              SET               CO3UkJAGEOj1qsQB
    custom.enableGkeAutopilot                     -              SET               COCsm5QGENiXi2E=
    custom.enableBinAuth                          -              SET               CJfKiZUGEJju7LUD
    

예: 커스텀 제약조건 만들기 및 정책 시행

다음 예에서는 특정 프로젝트의 모든 새 클러스터가 Autopilot 클러스터여야 하는 커스텀 제약조건 및 정책을 만듭니다.

시작하기 전에 다음 사항을 알아야 합니다.

  • 조직 ID
  • 프로젝트 ID

제약조건 만들기

  1. 다음 파일을 constraint-enable-autopilot.yaml로 저장합니다.

    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableGkeAutopilot
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "resource.autopilot.enabled == false"
    actionType: DENY
    displayName: Enable GKE Autopilot
    description: All new clusters must be Autopilot clusters.
    

    이는 모든 새 클러스터에 클러스터 모드가 Autopilot이 아니면 작업이 거부되는 제약조건을 정의합니다.

  2. 제약조건을 적용합니다.

    gcloud org-policies set-custom-constraint ~/constraint-enable-autopilot.yaml
    
  3. 제약조건이 있는지 확인합니다.

    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    

    출력은 다음과 비슷합니다.

    CUSTOM_CONSTRAINT                       ACTION_TYPE  METHOD_TYPES   RESOURCE_TYPES                     DISPLAY_NAME
    custom.enableGkeAutopilot               DENY         CREATE         container.googleapis.com/Cluster   Enable GKE Autopilot
    ...
    

정책 만들기

  1. 다음 파일을 policy-enable-autopilot.yaml로 저장합니다.

    name: projects/PROJECT_ID/policies/custom.enableGkeAutopilot
    spec:
      rules:
      - enforce: true
    

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

  2. 정책을 적용합니다.

    gcloud org-policies set-policy ~/policy-enable-autopilot.yaml
    
  3. 정책이 있는지 확인합니다.

    gcloud org-policies list --project=PROJECT_ID
    

    출력은 다음과 비슷합니다.

    CONSTRAINT                  LIST_POLICY    BOOLEAN_POLICY    ETAG
    custom.enableGkeAutopilot   -              SET               COCsm5QGENiXi2E=
    

정책을 적용한 후 Google Cloud가 정책 시행을 시작할 때까지 2분 정도 기다립니다.

정책 테스트

프로젝트에서 GKE Standard 클러스터 만들기를 시도합니다.

gcloud container clusters create org-policy-test \
    --project=PROJECT_ID \
    --zone=COMPUTE_ZONE \
    --num-nodes=1

출력은 다음과 같습니다.

Operation denied by custom org policies: ["customConstraints/custom.enableGkeAutopilot": "All new clusters must be Autopilot clusters."]

일반적인 사용 사례의 커스텀 제약조건 샘플

다음 섹션에서는 유용할 수 있는 몇 가지 커스텀 제약조건의 구문을 제공합니다.

설명 제약조건 구문
Binary Authorization이 사용 설정된 경우에만 클러스터 생성 허용
    name: organizations/ORGANIZATION_ID/customConstraints/custom.gkeBinaryAuthorization
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "condition:resource.binaryAuthorization.enabled == true || resource.binaryAuthorization.evaluationMode=='PROJECT_SINGLETON_POLICY_ENFORCE'"
    action: ALLOW
    displayName: Enable GKE Binary Authorization
    description: All new clusters must enable Binary Authorization.
새 노드 풀에서 노드 자동 업그레이드 중지 안 함
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableAutoUpgrade
    resourceTypes:
    - container.googleapis.com/NodePool
    methodTypes:
    - CREATE
    condition: "resource.management.autoUpgrade == true"
    actionType: ALLOW
    displayName: Enable node auto-upgrade
    description: All node pools must have node auto-upgrade enabled.
새 클러스터에 GKE용 워크로드 아이덴티티 제휴 사용 설정
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableWorkloadIdentity
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "has(resource.workloadIdentityConfig.workloadPool) || resource.workloadIdentityConfig.workloadPool.size() > 0"
    actionType: ALLOW
    displayName: Enable Workload Identity on new clusters
    description: All new clusters must use Workload Identity.
기존 클러스터에서 Cloud Logging 중지 안 함
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableLogging
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - UPDATE
    condition: "resource.loggingService == 'none'"
    actionType: DENY
    displayName: Do not disable Cloud Logging
    description: You cannot disable Cloud Logging on existing GKE cluster.
기존 메타데이터 엔드포인트가 사용 중지된 경우에만 Standard 노드 풀 만들기 또는 업데이트 허용
    name: organizations/ORGANIZATION_ID/customConstraints/custom.nodeConfigMetadata
    resourceTypes:
    - container.googleapis.com/NodePool
    methodTypes:
    - CREATE
    - UPDATE
    condition: "'disable-legacy-endpoints' in resource.config.metadata && resource.config.metadata['disable-legacy-endpoints'] == 'true'"
    actionType: ALLOW
    displayName: Disable legacy metadata endpoints
    description: You can only create or update node pools if you disable legacy
    metadata endpoints.

이 제약조건 샘플에서는 지도 값에 커스텀 제약조건을 설정하는 방법을 보여줍니다. condition 필드는 지도 키 disable-legacy-endpoints색인 연산자를 사용합니다. 앞의 샘플에서와 같이 일반 필드 선택 구문을 대신 사용하면 INVALID_CUSTOM_CONSTRAINT_CONDITION 오류가 표시됩니다.

다음 단계