有选择性地在 GKE 中强制执行防火墙政策


本页面介绍了如何使用标记在 Google Kubernetes Engine (GKE) 中有选择性地强制执行 Cloud 新一代防火墙网络防火墙政策。如需了解如何出于其他目的在 GKE 中使用标记(例如结算管理或条件 IAM 政策),请参阅使用标记管理 GKE 资源

关于标记

标记是键值对,可让您在组织级或项目级为 Google Cloud 资源添加注释和进行管理。您可以使用标记来整理资源并按条件应用政策(例如防火墙或 IAM 政策)。您可以使用 IAM 访问权限控制来规定谁可以附加、创建、更新或删除标记。

如需了解有关标记的更多信息,请参阅 Resource Manager 文档中的标记概览

使用标记强制执行网络防火墙政策

您可以使用标记有条件地将全球或区域级网络防火墙政策应用于您的 GKE 节点。您必须为希望与网络防火墙政策搭配使用的标记指定 GCE_FIREWALL 用途。当您将防火墙用途的标记应用于 GKE 集群或节点池时,GKE 会自动将这些标记附加到相应的 Compute Engine 虚拟机。

有了网络防火墙政策标记,您便无需使用网络标记。网络标记是任何人均可以附加到底层 Compute Engine 虚拟机以强制执行 Virtual Private Cloud 防火墙规则的元数据,并且不支持 IAM 访问权限控制。如果您目前将网络标记与 VPC 防火墙规则搭配使用,我们建议您改为网络防火墙政策并使用安全防火墙标记。如需查看详细的比较情况,请参阅本文档中的比较网络标记与标记

用于网络防火墙政策工作流的标记

如需在 GKE 中使用标记和网络防火墙政策,请执行以下操作:

  1. 创建标记:

    1. 在组织级或项目级定义标记键,例如 env
    2. 定义该键可能的标记值,例如 devstagingprod
    3. 指定该标记用于网络防火墙政策目的。

  2. 授予用户与防火墙标记进行交互的权限。

  3. 将标记键值对应用于特定的 GKE 集群或节点池。GKE 会自动将这些标记附加到底层 Compute Engine 虚拟机,以强制执行防火墙政策。

须知事项

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

要求和限制

  • GKE 1.28 及更高版本支持用于网络防火墙政策的标记。如果您使用早于 1.28 版的 GKE 版本,请改为搭配使用网络标记与 VPC 防火墙规则
  • GKE 集群应该最初是使用 GKE 1.28 版或更高版本创建的。将集群从 1.28 之前的版本升级到 1.28 版或更高版本不会启用标记。
  • GKE 集群和标记必须与同一 VPC 网络关联。
  • 在 Standard 集群中,每个节点池最多支持五个附加的防火墙标记。
  • Autopilot 集群最多支持五个防火墙标记。
  • GKE 会拒绝使用 gke-managed 前缀的标记键。
  • 您必须先创建标记键值对,然后才能将其关联到集群或节点池。

IAM 角色和权限

如需获得在 GKE 中使用用于防火墙政策的标记所需的权限,请让您的管理员授予您以下 IAM 角色:

  • 向用户和 GKE 服务代理授予标记所需的权限:
  • 创建和管理标记:组织或项目的 Tag Administrator (roles/resourcemanager.tagAdmin)
  • 将标记附加到资源:项目的 Tag User (roles/resourcemanager.tagUser)

如需详细了解如何授予角色,请参阅管理访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

创建标记

标记必须存在才能附加到集群或节点。如需创建标记,请参阅 Cloud NGFW 文档中的使用防火墙标记

例如,如需创建项目级的防火墙标记,请运行以下命令:

  1. 创建标记键:

    gcloud resource-manager tags keys create TAG_KEY \
        --parent=projects/PROJECT_ID \
        --purpose=GCE_FIREWALL \
        --purpose-data=network=PROJECT_ID/NETWORK_NAME
    

    替换以下内容:

    • TAG_KEY:标记键的名称,例如 env
    • PROJECT_ID:您的 Google Cloud 项目 ID
    • NETWORK_NAME:您将与标记配合使用的 VPC 网络的名称
  2. 获取标记键的 ID:

    gcloud resource-manager tags keys describe PROJECT_ID/TAG_KEY \
        --format="value(name)"
    

    输出为 tagKeys/KEY_ID,其中 KEY_ID 是该键的数字 ID。记下此 ID 以备后续使用。

  3. 向该标记键添加标记值:

    gcloud resource-manager tags values create TAG_VALUE \
        --parent=tagKeys/KEY_ID
    

    TAG_VALUE 替换为该标记键允许的值的名称,例如 dev

gcloud CLI 命令中的标记语法

使用 gcloud CLI 引用标记时,您必须使用以下语法之一设置键值对的格式:

标记语法

tagKeys/KEY_ID=tagValues/VALUE_ID

替换以下内容:

  • KEY_ID:数字键 ID
  • VALUE_ID:数值 ID

例如 tagKeys/123456789=tagValues/987654321


ORGANIZATION_ID/TAG_KEY=TAG_VALUE

替换以下内容:

  • ORGANIZATION_ID:您的 Google Cloud 组织 ID(数字格式)
  • TAG_KEY:您创建的标记键的名称
  • TAG_VALUE:您创建的标记值的名称

例如 12345678901/env=dev


PROJECT_ID/TAG_KEY=TAG_VALUE

替换以下内容:

  • PROJECT_ID:您的 Google Cloud 项目 ID
  • TAG_KEY:您创建的标记键的名称
  • TAG_VALUE:您创建的标记值的名称

例如 example-project/env=dev


PROJECT_NUMBER/TAG_KEY=TAG_VALUE

替换以下内容:

  • PROJECT_ID:您的 Google Cloud 项目的数字标识符
  • TAG_KEY:您创建的标记键的名称
  • TAG_VALUE:您创建的标记值的名称

例如 11223344556/env=dev

将标记定位至防火墙政策

创建标记后,您可以在防火墙政策规则中引用特定键值对。如需了解相关说明,请参阅使用防火墙标记

向服务代理授予 IAM 权限

为了使 GKE 在纵向扩容事件期间自动将标记附加到新节点,您必须向 Google Cloud 管理的服务账号(也称为“服务代理”)授予相应的 IAM 角色。

  1. 向 Kubernetes Engine Service Agent 授予 Tag User 角色 (roles/resourcemanager.tagUser):

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --role=roles/resourcemanager.tagUser \
        --condition=None
    

    PROJECT_NUMBER 替换为该集群的 Google Cloud 项目编号。如需查找项目编号,请运行以下命令:

    gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    
  2. 向该标记键值对的 Kubernetes Engine Service Agent 授予 Tag Holds Administrator 角色 (roles/resourcemanager.tagHoldAdmin):

    gcloud resource-manager tags values add-iam-policy-binding PROJECT_ID/TAG_KEY/TAG_VALUE \
        --member=serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --role=roles/resourcemanager.tagHoldAdmin
    

    如果 GKE 中仍在使用该键值对,则此角色可使服务代理防止标记被删除。

  3. 向 Google API 服务代理授予 Tag User 角色 (roles/resourcemanager.tagUser):

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER@cloudservices.gserviceaccount.com \
        --role=roles/resourcemanager.tagUser \
        --condition=None
    

针对项目外的标记授予其他 IAM 角色

如需使用集群项目以外的组织或其他项目所有的标记,请执行以下额外的步骤:

  1. 对于对父级资源中标记,向 Kubernetes Engine Service Agent 访问权限授予 Tag User 角色 (roles/resourcemanager.tagUser):

    gcloud resource-manager tags keys add-iam-policy-binding PARENT_RESOURCE/TAG_KEY \
        --member=serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --role=roles/resourcemanager.tagUser \
        --condition=None
    

    替换以下内容:

    • PARENT_RESOURCE:拥有该标记的资源的项目 ID 或组织 ID
    • PROJECT_NUMBER集群项目的项目编号
  2. 对于对父级资源中标记,向 Google API 服务代理访问权限授予 Tag User 角色 (roles/resourcemanager.tagUser):

    gcloud resource-manager tags keys add-iam-policy-binding PARENT_RESOURCE/TAG_KEY \
        --member=serviceAccount:PROJECT_NUMBER@cloudservices.gserviceaccount.com \
        --role=roles/resourcemanager.tagUser \
        --condition=None
    
  3. 向该标记键值对的 Kubernetes Engine Service Agent 授予 Tag Holds Administrator 角色 (roles/resourcemanager.tagHoldAdmin):

    gcloud resource-manager tags values add-iam-policy-binding PARENT_RESOURCE/TAG_KEY/TAG_VALUE \
        --member=serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --role=roles/resourcemanager.tagHoldAdmin
    

将防火墙标记附加到 Autopilot 集群

您可以在集群级将防火墙标记附加到 Autopilot 集群。GKE 会自动将这些集群级标记应用于每个节点。

创建新的 Autopilot 集群时附加标记

运行以下命令:

gcloud beta container clusters create-auto CLUSTER_NAME \
    --location=LOCATION \
    --autoprovisioning-resource-manager-tags=TAG1,TAG2,...

替换以下内容:

  • CLUSTER_NAME:新集群的名称。
  • LOCATION:集群的 Compute Engine 区域。
  • TAG1,TAG2,...:要附加的一组以逗号分隔的键值对。每个键值对都必须使用受支持的语法(如“命令中的标记语法”部分中所述)。例如 example-project/env=dev,1234567901/team=sre

将标记附加到现有 Autopilot 集群

运行以下命令:

gcloud beta container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --autoprovisioning-resource-manager-tags=TAG1,TAG2,...

更新集群上的标记时,GKE 会改写其中所有节点上的任何现有标记。

将防火墙标记附加到 Standard 集群和节点池

用于附加标记的方法取决于您是否希望集群中的其他节点池继承这些标记,如下所示:

Standard 集群防火墙标记
--autoprovisioning-resource-manager-tags

集群级设置

GKE 会将这些标记应用于集群中的所有新自动预配的节点池。如果您在现有集群上使用此标志,则现有节点池会保留更新之前应用的所有标记。

--resource-manager-tags

节点池级设置

GKE 会将这些标记应用于指定的节点池。如果您在创建集群期间使用此标志,则 GKE 会将这些标记应用于 GKE 创建的默认节点池。如果在自动预配的节点池上使用此标志,则 GKE 会覆盖该节点池上的所有现有标记。

将防火墙标记附加到 Standard 集群

您可以将标记附加到新的或现有的 Standard 集群。将标记附加到整个集群时,GKE 会将这些标记视为在集群级上设置的。

将标记附加到具有节点自动预配功能的新 Standard 集群

默认情况下,GKE 会将集群级的标记用于新的自动预配节点。GKE 在集群中创建的默认节点池不会自动预配,也不会获取这些标记。

gcloud beta container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --autoprovisioning-resource-manager-tags=TAG1,TAG2,... \
    --enable-autoprovisioning \
    --max-cpu=MAX_CPU \
    --max-memory=MAX_MEMORY

替换以下内容:

  • CLUSTER_NAME:新集群的名称
  • LOCATION:新集群的 Compute Engine 区域或可用区
  • TAG1,TAG2,...:要附加的一组以逗号分隔的键值对。每个键值对都必须使用受支持的语法(如“命令中的标记语法”部分中所述)。例如 example-project/env=dev,1234567901/team=sre
  • MAX_CPU:集群的最大核心数
  • MAX_MEMORY:集群的最大内存容量(以 GB 为单位)

在现有集群上启用节点自动预配功能时附加标记

GKE 只会将这些标记应用于新的自动预配节点池。现有节点池会保留其在更新之前拥有的任何标记。

  1. 将标记附加到集群:

    gcloud beta container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --autoprovisioning-resource-manager-tags=TAG1,TAG2,...
    
  2. 在集群上启用节点自动预配功能:

    gcloud beta container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --enable-autoprovisioning \
        --max-cpu=MAX_CPU \
        --max-memory=MAX_MEMORY
    

将防火墙标记附加到节点池

无论节点池是否使用节点自动预配功能,您都可以将标记附加到新节点池或现有节点池。GKE 将这些标记视为一种节点池级设置。

将标记附加到默认节点池

GKE 会将您在创建集群时使用 --resource-manager-tags 标志指定的标记附加到 GKE 在集群中创建的默认节点池。

gcloud beta container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --resource-manager-tags=TAG1,TAG2,...

替换以下内容:

  • CLUSTER_NAME:新集群的名称
  • LOCATION:新集群的 Compute Engine 区域或可用区
  • TAG1,TAG2,...:要附加的一组以逗号分隔的键值对。每个键值对都必须使用受支持的语法(如“命令中的标记语法”部分中所述)。例如 example-project/env=dev,1234567901/team=sre

将标记附加到新节点池

如果创建节点池期间使用 --resource-manager-tags 标志,GKE 会将您指定的标记附加到该节点池。

gcloud beta container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --resource-manager-tags=TAG1,TAG2,...

替换以下内容:

  • NODE_POOL_NAME:新节点池的名称
  • CLUSTER_NAME:集群的名称
  • LOCATION:集群的 Compute Engine 区域或可用区
  • TAG1,TAG2,...:要附加的一组以逗号分隔的键值对。每个键值对都必须使用受支持的语法(如“命令中的标记语法”部分中所述)。例如 example-project/env=dev,1234567901/team=sre

将标记附加到现有节点池

如果使用 --resource-manager-tags 标志更新现有节点池上的标记,GKE 会覆盖该节点池上的所有现有标记。您可以使用此命令更新自动预配节点池上的标记。

gcloud beta container node-pools update NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --resource-manager-tags=TAG1,TAG2,...

NODE_POOL_NAME 替换为要更新的节点池的名称。

切换现有集群和节点池中的自动预配设置

您在集群级上更新标记时,GKE 会将这些新标记应用于集群中的所有节点池,并保留附加到现有节点池的标记。

更新现有节点池以启用或停用节点自动预配功能时,请考虑对标记的以下影响:

  • 启用或停用节点自动预配功能时,节点池会保留所有现有标记。GKE 不会使用集群级标记覆盖这些标记,即使在重新创建节点期间也是如此。
  • 如果在特定节点池上手动更新这些标记,GKE 会使用您为该节点池的指定标记覆盖现有标记。

验证集群上的防火墙标记

  • 列出 Autopilot 集群上的标记:

    gcloud beta container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(nodePoolAutoConfig.resourceManagerTags)"
    
  • 列出特定节点池上的标记:

    gcloud beta container node-pools describe NODE_POOL_NAME \
      --cluster=CLUSTER_NAME \
      --location=LOCATION \
      --format="value(config.resourceManagerTags)"
    

将防火墙标记从集群和节点池移除

如需从集群和节点池中移除防火墙标记,请使用这些标记的空值更新相应资源。

将标记从 Autopilot 集群移除

运行以下命令:

gcloud beta container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --autoprovisioning-resource-manager-tags=

将标记从节点池移除

  1. 移除集群级节点自动预配标记:

    gcloud beta container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --autoprovisioning-resource-manager-tags=
    

    GKE 不会将标记附加到新的自动预配节点池。

  2. 移除节点池标记:

    gcloud beta container node-pools update NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --resource-manager-tags=
    

    GKE 会从该节点池中移除现有标记。

删除标记键和标记值

如需删除标记键或标记值,请确保该标记已与所有资源分离。然后,请参阅 Resource Manager 文档中的删除标记

比较网络标记与标记

与网络标记相比,使用标记强制执行防火墙政策具有显著的安全性和易用性。同样,网络防火墙政策可促进在整个组织、文件夹、项目或网络中强制执行防火墙规则,从而改进 VPC 防火墙规则的功能。

将标记与网络防火墙政策配合使用是一种更安全、可扩缩的方式,可用来管理整个组织中对 GKE 环境的访问权限。您可以在同一集群中使用标记和网络标记,但不能使用网络标记来强制执行网络防火墙政策。

如需查看标记和网络标记之间的详细对比,请参阅 Cloud NGFW 文档中的标记与网络标记对比

自动预配节点池中的功能差异

在 Autopilot 集群和不使用节点自动预配的 Standard 节点池中,网络标记和标记会表现出类似的行为。下表显示了网络标记与 Standard 集群中自动预配节点池中的标记之间的功能差异:

操作 网络标记行为 标记行为
GKE 自动预配节点池 GKE 应用集群级网络标记 GKE 应用集群级标记
您更新自动预配节点池上的标记或网络标记
  • 如果集群级网络标记存在,则更新操作将失败
  • 如果集群级网络标记不存在,则 GKE 会覆盖节点池的现有网络标记
无论集群级标记是否存在,GKE 都会覆盖节点池的现有标记
您更新整个集群的标记或网络标记 GKE 会覆盖集群中新的和现有的自动预配节点池的网络标记。 GKE 会将新的集群级标记应用于新的自动预配节点池。现有自动预配的节点池会保留其在更新之前具有的标记。

后续步骤