本页面介绍如何使用 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 组织的 Organization Policy Administrator (
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
:用于验证请求的条件,使用通用表达式语言 (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
:直观易懂的限制条件说明,在违反政策时显示为错误消息。 此字段的最大长度为 2000 个字符。
应用自定义限制条件:
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 开始强制执行政策。
测试政策
尝试在项目中创建 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. |
仅在停用旧版元数据端点时允许创建或更新标准节点池 |
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. 此限制条件示例展示了如何为映射值设置自定义限制条件。 |