创建集群网络政策

本页面介绍了如何在 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 区域。

使用 gcloud config

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

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

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

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

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

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

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

gcloud

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

gcloud container clusters create cluster-name --enable-network-policy

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

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

    gcloud container clusters update cluster-name --update-addons=NetworkPolicy=ENABLED
  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 停用网络政策强制执行功能。

gcloud

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

gcloud container clusters update cluster-name --no-enable-network-policy

控制台

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

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 点击集群的“修改”按钮(铅笔图案)。

  3. 节点的网络政策下拉菜单中,选择已停用

  4. 点击保存。然后,再次点击修改

  5. 主节点的网络政策下拉菜单中,选择已停用

  6. 点击保存

API

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

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

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

gcloud container clusters update cluster-name --update-addons=NetworkPolicy=DISABLED

创建网络政策

为集群启用网络政策实施功能后,您需要定义实际的网络政策。您可以使用 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 实例的集群不支持网络政策,因为对于该大小的实例来说,资源要求太高了。

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

使用 HTTP(S) 负载平衡器运行状况检查

将 Ingress 应用于 Service 以构建 HTTP(S) 负载平衡器时,应用于该 Service 背后的 Pod 的网络政策还必须支持相应 HTTP(S) 负载平衡器探测 IP 范围

此外,Service 的节点端口可能会将连接转发到其他节点上的 Pod,除非通过在 Service 定义中将 externalTrafficPolicy 设置为“本地”来阻止此操作。如果 externalTrafficPolicy 未设置为 Local,则网络政策还必须允许从集群中的其他节点 IP 进行连接。

请注意,使用网络端点组实现容器原生负载平衡时,本讨论不适用。

后续步骤