이 페이지에서는 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
를 실행하여 최신 버전을 가져옵니다.
-
제약조건을 만들고 조직 정책을 시행하는 데 필요한 권한을 얻으려면 관리자에게 Google Cloud 조직의 조직 정책 관리자(
roles/orgpolicy.policyAdmin
) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요. - 조직 ID를 알고 있어야 합니다.
커스텀 제약조건 만들기
새 커스텀 제약조건을 만들려면 YAML 파일에서 제약조건을 정의하고 Google Cloud CLI를 사용하여 조직에서 커스텀 제약조건을 적용합니다.
커스텀 제약조건에 대한 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
또는CREATE
과UPDATE
일 수 있습니다.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자(영문 기준)입니다.
커스텀 제약조건을 적용합니다.
gcloud org-policies set-custom-constraint PATH_TO_FILE
PATH_TO_FILE
을 커스텀 제약조건 정의의 파일 경로로 바꿉니다.커스텀 제약조건이 있는지 확인합니다.
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
출력은 다음과 비슷합니다.
CONSTRAINT LIST_POLICY BOOLEAN_POLICY ETAG custom.enableGkeAutopilot - SET COCsm5QGENiXi2E= ...
커스텀 제약조건 시행
새 커스텀 제약조건을 시행하려면 제약조건을 참조하는 조직 정책을 만든 후 조직 정책을 적용합니다.
조직 정책에 대한 YAML 파일을 만듭니다.
name: RESOURCE_HIERARCHY/policies/POLICY_NAME spec: rules: - enforce: true
다음을 바꿉니다.
RESOURCE_HIERARCHY
: 시정 조치 범위에 영향을 미치는 새 정책의 위치입니다. Google Cloud 리소스 계층 구조를 가이드로 사용합니다. 예를 들어 특정 프로젝트에 정책을 적용하려면projects/PROJECT_ID
를 사용합니다. 특정 조직에 정책을 적용하려면organizations/ORGANIZATION_ID
를 사용합니다.POLICY_NAME
: 새 정책의 이름입니다.
정책을 시행합니다.
gcloud org-policies set-policy PATH_TO_POLICY
PATH_TO_POLICY
를 정책 정의 파일의 경로로 바꿉니다.정책이 있는지 확인합니다.
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
제약조건 만들기
다음 파일을
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이 아니면 작업이 거부되는 제약조건을 정의합니다.
제약조건을 적용합니다.
gcloud org-policies set-custom-constraint ~/constraint-enable-autopilot.yaml
제약조건이 있는지 확인합니다.
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 ...
정책 만들기
다음 파일을
policy-enable-autopilot.yaml
로 저장합니다.name: projects/PROJECT_ID/policies/custom.enableGkeAutopilot spec: rules: - enforce: true
PROJECT_ID
를 프로젝트 ID로 바꿉니다.정책을 적용합니다.
gcloud org-policies set-policy ~/policy-enable-autopilot.yaml
정책이 있는지 확인합니다.
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. 이 제약조건 샘플에서는 지도 값에 커스텀 제약조건을 설정하는 방법을 보여줍니다. |