创建网络政策


本页面介绍了如何在 Google Kubernetes Engine (GKE) 中配置网络政策强制执行功能。如需了解 GKE 网络的一般信息,请访问网络概览

概览

您可以使用 GKE 的网络政策强制执行功能来控制集群的 Pod 和服务之间的通信。如需定义网络政策,您可以使用 Kubernetes Network Policy API 创建 Pod 级层防火墙规则。这些防火墙规则确定哪些 Pod 和服务可以在您的集群内相互访问。

定义网络政策可帮助您在集群服务于多级应用时启用深度防御等功能。例如,您可以创建网络政策,以确保应用中受侵的前端服务无法直接与低了几个级层的结算或记帐服务进行通信。

网络政策还可以使您的应用更容易同时托管来自多个用户的数据。例如,您可以通过定义每个命名空间一个租户的模型来提供安全的多租户服务。在此类模型中,网络政策规则可确保给定命名空间中的 Pod 和服务无法访问其他命名空间中的其他 Pod 或服务。

准备工作

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

使用以下任一方法设定默认的 gcloud 设置:

  • 使用 gcloud init(如果您想要在系统引导下完成默认设置)。
  • 使用 gcloud config(如果您想单独设置项目 ID、区域和地区)。

使用 gcloud init

如果您收到 One of [--zone, --region] must be supplied: Please specify location 错误,请完成本部分。

  1. 运行 gcloud init 并按照说明操作:

    gcloud init

    如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

    gcloud init --console-only
  2. 按照说明授权 gcloud 使用您的 Google Cloud 帐号。
  3. 创建新配置或选择现有配置。
  4. 选择 Google Cloud 项目。
  5. 为可用区级集群选择默认 Compute Engine 可用区,或为区域级集群或 Autopilot 集群选择区域。

使用 gcloud config

  • 设置默认项目 ID
    gcloud config set project PROJECT_ID
  • 如果您使用的是可用区级集群,请设置默认计算可用区
    gcloud config set compute/zone COMPUTE_ZONE
  • 如果您使用的是 Autopilot 集群或区域级集群,请设置默认计算区域
    gcloud config set compute/region COMPUTE_REGION
  • gcloud 更新到最新版本:
    gcloud components update

使用网络政策强制执行功能

您可以在创建 GKE 集群时启用网络政策强制执行功能,也可以为现有集群启用该功能。您还可以为现有集群停用网络政策。

在集群中启用网络政策后,您可以使用 Kubernetes Network Policy API 创建网络政策。

启用网络政策实施功能

网络政策强制执行功能内置于 GKE Dataplane V2 中。您不需要在使用 GKE Dataplane V2 的集群中启用网络政策强制执行功能。

在不使用 GKE Dataplane V2 的 GKE 集群中启用网络政策强制执行功能后,GKE 会在该集群中管理和强制执行网络政策。

您可以使用 gcloud 工具、Google Cloud Console 或 GKE API 在 GKE 中启用网络政策强制执行功能。

gcloud

如需在创建新集群时启用网络政策强制执行功能,请运行以下命令:

gcloud container clusters create CLUSTER_NAME --enable-network-policy

CLUSTER_NAME 替换为新集群的名称。

如需为现有集群启用网络政策强制执行功能,请执行以下任务:

  1. 运行以下命令以启用该插件:

    gcloud container clusters update CLUSTER_NAME --update-addons=NetworkPolicy=ENABLED
    

    CLUSTER_NAME 替换为您的集群的名称。

  2. 运行以下命令以在您的集群上启用网络政策强制执行功能,从而为集群重新创建已启用网络政策强制执行功能的节点池:

    gcloud container clusters update CLUSTER_NAME --enable-network-policy
    

控制台

如需在创建新集群时启用网络政策强制执行功能,请执行以下操作:

  1. 转到 Cloud Console 中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 根据需要配置集群。

  4. 在导航窗格的集群下方,点击网络

  5. 选中启用网络政策复选框。

  6. 点击创建

如需为现有集群启用网络政策强制执行功能,请执行以下操作:

  1. 转到 Cloud Console 中的 Google Kubernetes Engine 页面:

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击您要修改的集群的名称。

  3. 网络下的网络政策字段中,点击 修改网络政策

  4. 选中启用主节点的网络政策复选框,然后点击保存更改

  5. 等待更改应用,然后再次点击 修改网络政策

  6. 选中启用节点的网络政策复选框。

  7. 点击保存更改

API

如需启用网络政策强制执行功能,请执行以下操作:

  1. 在您提供给 projects.zones.clusters.createprojects.zones.clusters.updatecluster 对象中指定 networkPolicy 对象。

  2. networkPolicy 对象需要一个用于指定要使用的网络政策提供者的枚举值,以及一个指定是否启用网络政策的布尔值。如果启用网络政策但未设置提供者,则 createupdate 命令将返回错误。

停用网络政策实施功能

您可以使用 gcloud 工具、Google Cloud Console 或 GKE API 停用网络政策强制执行功能。 不能在使用 GKE Dataplane V2 的集群中停用网络政策强制执行功能。

gcloud

如需为现有集群停用网络政策强制执行功能,请运行以下命令:

gcloud container clusters update CLUSTER_NAME --no-enable-network-policy

CLUSTER_NAME 替换为您的集群的名称。

控制台

如需为现有集群停用网络政策强制执行功能,请执行以下操作:

  1. 转到 Cloud Console 中的 Google Kubernetes Engine 页面:

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击您要修改的集群的名称。

  3. 网络下的网络政策字段中,点击 修改网络政策

  4. 清除启用节点的网络政策复选框,然后点击保存更改

  5. 等待更改应用,然后再次点击 修改网络政策

  6. 清除启用主节点的网络政策复选框。

  7. 点击保存更改

API

如需为现有集群停用网络政策强制执行功能,请执行以下操作:

  1. 在您提供给 projects.zones.clusters.updatecluster 对象中指定 networkPolicy 对象。
  2. networkPolicy 对象内,将布尔 enabled 值设置为 false

如果您停用网络政策强制执行功能,请务必同时更新所有插件(例如 Calco DaemonSet),以指明网络政策已针对这些插件停用:

gcloud container clusters update CLUSTER_NAME --update-addons=NetworkPolicy=DISABLED

CLUSTER_NAME 替换为您的集群的名称。

创建网络政策

为集群启用网络政策实施功能后,您需要定义实际的网络政策。您可以使用 Kubernetes Network Policy API 定义网络政策。

如需详细了解如何创建网络政策,请参阅 Kubernetes 文档中的以下主题:

使用 PodSecurityPolicy

如果您使用的是 NetworkPolicy 且有一个 Pod 受到 PodSecurityPolicy 的约束,请创建有权使用 PodSecurityPolicy 的 RBAC Role 或 ClusterRole。然后将该 Role 或 ClusterRole 绑定到 Pod 的服务帐号。同时使用 NetworkPolicy 和 PodSecurityPolicy 时,为用户帐号授予权限是不够的。您必须将相应角色绑定到该服务帐号。如需了解详情,请参阅进行政策授权

开销、限制和注意事项

  • 启用网络政策强制执行功能会消耗节点中的其他资源。具体来说,该功能会使 kube-system 进程的内存占用量增加大约 128 MB,并且需要大约 300 millicore 的 CPU。

  • 启用网络政策实施功能需要重新创建节点。如果您的集群具备有效的维护期,则在下一个维护期之前不会自动重新创建节点。如果您愿意,可以随时手动升级集群

限制和要求

  • 您的集群必须至少有 2 个类型为 e2-medium 或更高级别的节点。 运行网络政策实施功能的建议集群大小是最少 3 个 e2-medium 实例
  • 节点为 f1-microg1-small 实例的集群不支持网络政策,因为对于该大小的实例来说,资源要求太高了。
  • 如果您将网络政策与 GKE Workload Identity 搭配使用,您必须允许流向以下 IP 地址和端口号的出站流量,以便您的 Pod 能够与 GKE 元数据服务器通信。对于运行 GKE 1.21.0-gke.1000 及更高版本的集群,允许端口 988 上流向 169.254.169.252/32 的出站流量。对于运行 1.21.0-gke.1000 之前的 GKE 版本的集群,允许端口 988 上流向 127.0.0.1/32 的出站流量。为避免自动升级期间出现中断,请允许流向所有这些 IP 地址和端口的出站流量。

如需详细了解节点机器类型和可分配资源,请参阅标准集群架构 - 节点

从 Calico 迁移到 GKE Dataplane V2

如果您将网络政策从 Calico 迁移到 GKE Dataplane V2,请考虑以下限制:

  • 您不能在 NetworkPolicy 清单的 ipBlock.cidr 字段中使用 Pod 或 Service IP 地址。您必须使用标签来引用工作负载。例如,以下配置无效:

    - ipBlock:
        cidr: 10.8.0.6/32
    
  • 不得在 NetworkPolicy 清单中指定空的 ports.port 字段。如果指定了端口,则还必须指定协议。例如,以下配置无效:

    ingress:
    - ports:
      - protocol: TCP
    

使用 HTTP(S) 负载平衡

将 Ingress 应用于 Service 以构建 HTTP(S) 负载平衡器时,您必须配置应用于该 Service 背后的 Pod 的网络政策,以允许设置适当的HTTP(S) 负载平衡器运行状况检查 IP 范围。如果您使用的是内部 HTTP(S) 负载平衡器,则还必须配置网络政策以允许代理专用子网

如果您没有对网络端点组使用容器原生负载平衡,则 Service 的节点端口可能会将连接转发到其他节点上的 Pod,除非通过在 Service 定义中将 externalTrafficPolicy 设置为 Local 来阻止它们这样做。如果 externalTrafficPolicy 未设置为 Local,则网络政策还必须允许从集群中的其他节点 IP 进行连接。

已知问题

使用 Calico 终止 StatefulSet Pod

启用了 Calico 网络政策的 GKE 集群可能会遇到以下问题:删除 StatefulSet pod 时,该 pod 会丢弃现有连接。在 pod 进入 Terminating 状态后,将不会再遵循 pod 规范中的 terminationGcePeriodSeconds 配置,并且会导致当前与 StatefulSet pod 连接的其他应用中断。如需详细了解此问题,请参阅 Calico 问题 #4710

此问题会影响以下 GKE 版本:

  • 1.18
  • 1.19
  • 1.20 至 1.20.11-gke.1299
  • 1.21 至 1.21.4-gke.1499

为了缓解这一问题,请将 GKE 控制平面升级到 1.21.4-gke.1500 或更高版本。

后续步骤