创建和管理自定义限制条件

本页面介绍如何在 GKE on Azure 环境中启用和使用自定义限制条件。 Google Cloud的组织政策服务可帮助您管理资源配置并在云环境中创建安全防护措施。

概览

借助自定义组织政策,您可以在 GKE Multi-Cloud 环境中创建精细的资源政策,以满足组织的特定安全性和合规性要求。您还可以创建处于试运行模式的组织政策,以便在不影响生产工作负载的情况下测试新政策。

如需详细了解组织政策,请参阅组织政策服务简介

准备工作

在开始之前,请确保您了解以下主题。

政策继承

如果您对资源强制执行政策,默认情况下,该资源的后代会继承组织政策。例如,如果您对某个组织强制执行一项政策, Google Cloud 会对该组织中的所有项目强制执行该政策。如需详细了解政策继承以及如何更改评估规则,请参阅层次结构评估规则

限制

在创建自定义限制条件之前,请注意以下限制:

  • 只能对 GKE on Azure 资源的 CREATEUPDATE 方法强制执行自定义限制条件。
  • 新强制执行的自定义限制条件不会自动应用于现有资源。您必须更新现有资源才能应用该限制条件。 如需查找需要更新的现有资源,您可以强制执行试运行组织政策
  • 如需创建限制条件和强制执行组织政策,您需要拥有 Google Cloud 组织的 Organization Policy Administrator (roles/orgpolicy.policyAdmin) IAM 角色。如需详细了解管理具有自定义限制条件的组织政策所需的权限,请参阅所需的角色

价格

组织政策和自定义限制条件可免费使用。

创建自定义限制条件

必须使用 AzureClusterAzureNodepoolAzureClient API 资源规范中的字段(不包括描述为“仅输出”的字段)来指定自定义限制条件。

创建自定义限制条件

如需创建新的自定义限制条件,您需要在 YAML 文件中定义限制条件,并使用 Google Cloud CLI 在组织中应用自定义限制条件。此限制条件必须封装您希望在 GKE on Azure 资源中强制执行的特定政策。

创建一个 YAML 文件,用于在集群上定义自定义限制条件:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- gkemulticloud.googleapis.com/AzureCluster
methodTypes:
- CREATE
condition: CONDITION
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION

如需在节点池上定义自定义限制条件,请使用以下 YAML 配置:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- gkemulticloud.googleapis.com/AzureNodePool
methodTypes:
- CREATE
condition: CONDITION
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION

替换以下内容:

  • ORGANIZATION_ID:您的组织 ID,例如 123456789

  • CONSTRAINT_NAME:新自定义限制条件的名称。自定义限制条件必须以 custom. 开头,只能包含大写字母、小写字母或数字。例如 custom.allowClusterCreateIfAnnotationPresent。该字段的长度上限为 70 个字符,不计算前缀,例如 organizations/123456789/customConstraints/custom

  • CONDITION:针对 Google Cloud 资源的表示法编写的条件。条件是使用通用表达式语言 (CEL) 编写的。此字段的最大长度为 1,000 个字符。 例如,条件:"key" in resource.annotations && resource.annotations.key == "created-by"

  • ACTION:满足条件时要执行的操作。可以是 ALLOWDENY

  • DISPLAY_NAME:限制条件的显示名称。此字段的最大长度为 200 个字符。

  • DESCRIPTION:约束条件的说明,在违反政策时显示为错误消息,例如"Allow new clusters only when certain annotations are set."此字段的最大长度为 2,000 个字符。

如需详细了解如何创建自定义限制条件,请参阅定义自定义限制条件

将限制与资源相关联

为新的自定义限制条件创建 YAML 文件后,您必须对其进行设置,以使该限制条件可用于组织政策。

  1. 如需设置自定义限制条件,请使用 gcloud org-policies set-custom-constraint 命令:

    gcloud org-policies set-custom-constraint PATH_TO_FILE
    

    PATH_TO_FILE 替换为自定义限制条件 YAML 定义的路径。

  2. 如需验证自定义限制条件是否已创建,请使用 gcloud org-policies list-custom-constraints 命令:

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

    输出会列出已创建的政策:

    CUSTOM_CONSTRAINT: custom.allowClusterCreateIfAnnotationPresent
    ACTION_TYPE: ALLOW
    METHOD_TYPES: CREATE
    RESOURCE_TYPES: gkemulticloud.googleapis.com/AzureCluster
    DISPLAY_NAME: Allow new clusters only when certain annotations are set.
    

强制执行自定义限制条件

如需强制执行新的自定义限制条件,请创建一个引用该限制条件的组织政策,然后应用该组织政策。

  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 资源。例如,项目或组织。

    • RESOURCE_ID:在其中强制执行政策的资源的 ID。例如,您的项目 ID 或组织 ID。

    输出类似于以下内容:

    CONSTRAINT: custom.allowClusterCreateIfAnnotationPresent
    LIST_POLICY: -
    BOOLEAN_POLICY: SET
    ETAG: CPjb27wGEOijhL4B-
    

测试政策

通过在受限项目中创建新的 Azure 集群来测试组织政策。

  1. 在受限项目中创建 Azure 集群。

    gcloud container azure clusters create CLUSTER_NAME \
        --location GOOGLE_CLOUD_LOCATION \
        --fleet-project FLEET_PROJECT \
        --azure-tenant-id "${TENANT_ID}" \
        --azure-application-id "${APPLICATION_ID}" \
        --azure-region AZURE_REGION \
        --pod-address-cidr-blocks POD_CIDR \
        --service-address-cidr-blocks SERVICE_CIDR \
        --vm-size VM_SIZE \
        --cluster-version 1.31.1-gke.1800 \
        --ssh-public-key "$SSH_PUBLIC_KEY" \
        --resource-group-id "$CLUSTER_RG_ID" \
        --vnet-id "$VNET_ID" \
        --subnet-id "$SUBNET_ID" # Optional, see following note \
        --tags "control-plane=CLUSTER_NAME" \
        --admin-users ADMIN_USERS_LIST
    
  2. 输出类似于以下内容:

    FAILED_PRECONDITION: Operation denied by org policy on resource 'projects/PROJECT_NUMBER/locations/GOOGLE_CLOUD_REGION': ["customConstraints/custom.allowClusterCreateIfAnnotationPresent": "Allow new clusters only when certain annotations are set."]
    
    '@type': type.googleapis.com/google.rpc.ErrorInfo
    domain: googleapis.com
    metadata:
      customConstraints: customConstraints/custom.allowClusterCreateIfAnnotationPresent
    service: gkemulticloud.googleapis.com
    reason: CUSTOM_ORG_POLICY_VIOLATION