このページでは、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)で記述されます。このフィールドの最大長は 1,000 文字です。式には次のフィールドを配置する必要があります。また、&&
や||
などの論理演算子をサポートしています。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 用 Workload Identity 連携を有効にする |
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. この制約のサンプルは、マップの値にカスタム制約を設定する方法を示しています。 |