使用自定义组织政策限制对 GKE 资源的操作


本页面介绍如何使用 Google Cloud 组织政策服务中的自定义限制条件来限制组织中 Google Kubernetes Engine (GKE) 资源上的特定操作。如需详细了解组织政策,请参阅自定义组织政策

组织政策和限制条件简介

Google Cloud 组织政策可让您以编程方式集中控制组织的资源。作为组织政策管理员,您可以定义组织政策,这是一组称为限制条件的限制,会应用于 Google Cloud 资源层次结构中的 Google Cloud 资源及其后代。您可以在组织、文件夹或项目级层强制执行组织政策。

组织政策为各种 Google Cloud 服务提供预定义限制条件。但是,如果您想要更精细地控制和自定义组织政策中受限的特定字段,还可以创建自定义限制条件并在自定义组织政策中使用这些自定义限制条件。

GKE 中支持的资源

对于 GKE,您可以对 Google Kubernetes Engine API v1 的 ClusterNodePool 资源中的任何字段创建 CREATEUPDATE 方法的自定义限制条件,但仅限输出的字段和以下字段除外

  • 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)。例如 ClusterNodePool
    • METHOD1,METHOD2,...:要对其强制执行限制条件的 RESTful 方法的列表。可以是 CREATECREATEUPDATE
    • condition:用于验证请求的条件,使用通用表达式语言 (CEL) 编写。此字段的最大长度为 1000 个字符。表达式必须包含以下字段,并且支持 &&|| 等逻辑运算符:

      • OBJECT_NAME:要限制的 GKE API 对象的名称,采用 pascalCase 格式。例如 privateClusterConfig
      • FIELD_NAME:要限制的 GKE API 字段的名称,采用 pascalCase 格式。例如 enablePrivateNodes
      • VALUE:字段的值。对于布尔值字段,请使用 truefalse。对于字符串字段,请使用 "STRING"
    • ACTION:满足 condition 时要执行的操作。可以是 ALLOWDENY

    • DISPLAY_NAME:限制条件的直观易记名称。 此字段的最大长度为 200 个字符。

    • DESCRIPTION:直观易懂的限制条件说明,在违反政策时显示为错误消息。 此字段的最大长度为 2000 个字符。

  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 资源。例如 projectfolder
    • 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 开始强制执行政策。

测试政策

尝试在项目中创建 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.

此限制条件示例展示了如何为映射值设置自定义限制条件。condition 字段对映射键 disable-legacy-endpoints 使用索引运算符。如果您改用常规字段选择语法(如前面的示例所示),则会看到 INVALID_CUSTOM_CONSTRAINT_CONDITION 错误。

后续步骤