GKE 中的网络隔离简介

您可以自定义 Google Kubernetes Engine (GKE) 集群的控制平面和节点的网络访问权限,以提高集群及其工作负载的网络安全性。本文档介绍了您可以为集群配置的各种隔离类型、隔离网络的好处,以及在隔离集群之前必须考虑的任何限制。

如需为集群配置特定的隔离级别,请参阅以下文档:

最佳实践

与组织的网络架构师、网络工程师、网络管理员或负责定义、实现和维护网络架构的其他团队一起规划和设计网络隔离配置。

网络访问权限类型

集群中的组件(例如控制平面、API 服务器和节点)会出于不同目的发送和接收网络流量。您可以通过控制以下一种或多种类型的网络访问权限来自定义集群的隔离:

  • 从外部来源访问控制平面:自定义哪些人可以访问您的控制平面来执行任务,例如在集群中运行 kubectl 命令。
  • 从 API 服务器访问外部 Webhook:自定义 Kubernetes API 服务器是否可以通过控制平面将流量直接发送到外部 Webhook 服务器
  • 从外部来源访问节点:自定义公共互联网上的外部客户端是否可以访问您的节点。

从外部来源访问控制平面

在本部分中,您需要考虑哪些人可以访问您的控制平面。

每个 GKE 集群都有一个用于处理 Kubernetes API 请求的控制平面。该控制平面在由 Google 管理的项目的 VPC 网络中的一个虚拟机 (VM) 上运行。区域级集群有多个控制平面副本,每个副本都在其各自的虚拟机上运行。 集群管理员等正文使用控制平面端点来访问集群,以执行运行 kubectl 命令或部署工作负载等任务。控制平面端点供外部客户端用于访问集群,不用于与托管控制平面副本的 Compute Engine 虚拟机实例直接通信。控制平面具有以下类型的端点,用于访问集群:

控制平面有两种用于访问集群的端点:

  • 基于 DNS 的端点
  • 基于 IP 的端点
最佳实践

仅使用基于 DNS 的端点访问控制平面,以简化配置并实现基于政策的灵活安全层。

基于 DNS 的端点

基于 DNS 的端点为每个集群控制平面提供唯一的不可变 DNS 或完全限定域名 (FQDN)。此 DNS 名称可在控制平面的整个生命周期内用于访问控制平面。DNS 名称解析为一个端点,该端点可通过 Google Cloud API 可访问的任何网络(包括本地网络或其他云网络)进行访问。启用基于 DNS 的端点后,无需使用堡垒主机或代理节点,即可从其他 VPC 网络或外部位置访问控制平面。

如需访问控制平面端点,您需要配置 IAM 角色和政策以及身份验证令牌。如需详细了解所需的确切权限,请参阅自定义网络隔离

除了 IAM 政策和令牌之外,您还可以需要配置以下访问权限属性:

  • 使用 VPC Service Controls 进行基于 IP 地址或网络的控制:为了增强 GKE 集群控制平面的安全性,VPC Service Controls 会额外添加一层访问权限安全保障。它使用基于网络来源等属性的情境感知访问权限。

    VPC Service Controls 不会为控制平面具有公共 IP 地址的集群直接提供支持。不过,当您使用基于 DNS 的端点访问 GKE 集群(包括专用集群和公共集群)时,VPC Service Controls 会为其提供保护。

    您可以在服务边界的受限服务列表中添加 container.googleapis.comkubernetesmetadata.googleapis.com,将 VPC Service Controls 配置为保护 GKE 集群的基于 DNS 的端点。将这些 API 添加到服务边界后,您将能够为所有 GKE API 操作启用 VPC-SC。此配置有助于确保您定义的安全边界能够控制对控制平面的访问。

    使用 IAM 政策和 VPC Service Controls 来确保对基于 DNS 的端点的访问安全,可为集群控制平面提供多层安全保护模型。VPC Service Controls 可与受支持的 Google Cloud 服务相集成。这样便可让集群的安全配置与其他 Google Cloud 服务中托管的数据保持一致。

  • Private Service Connect 或 Cloud NAT:用于从无权访问公共互联网的客户端访问基于 DNS 的端点。默认情况下,可以通过可在公共互联网上使用的 Google CloudAPI 访问基于 DNS 的端点。如需了解详情,请参阅“自定义网络隔离”页面中的基于 DNS 的端点部分。

  • Kubernetes 身份验证凭据:使用 Kubernetes ServiceAccount 不记名令牌X.509 客户端证书对基于 DNS 的端点进行身份验证。 在 GKE 集群中,这些身份验证方法默认处于停用状态。在为集群配置基于 DNS 的端点时,您可以启用这些方法。

基于 IP 的端点

您还可以选择使用基于 IP 的端点来配置对控制平面的访问权限。

与集群和 IP 地址相关的术语

  • Google Cloud 外部 IP 地址

    • 分配给托管在Google Cloud上的任何客户使用的任何虚拟机的外部 IP 地址。这些 IP 地址归 Google Cloud 所有。如需了解详情,请参阅在何处可以找到 Compute Engine IP 范围?

    • Google Cloud 产品(例如 Cloud Run 或 Cloud Run functions)使用的外部 IP 地址。托管在 Google Cloud 上的任何客户端都可以实例化这些 IP 地址。这些 IP 地址归 Google Cloud 所有。

  • Google 预留的 IP 地址:用于管理 GKE 集群的外部 IP 地址。这些 IP 地址包括 GKE 代管式进程和生产环境中的其他 Google 服务。这些 IP 地址归 Google 所有。

  • GKE 集群 IP 地址范围:分配给集群的内部 IP 地址,GKE 会将这些地址用于集群的节点、Pod 和 Service。

  • 内部 IP 地址:集群的 VPC 网络中的 IP 地址。这些 IP 地址可能包括集群 IP 地址、本地网络、RFC 1918 范围或以非公开方式使用的公共 IP (PUPI) 地址(包括非 RFC 1918 范围)。

  • 基于外部 IP 的集群端点:GKE 为控制平面分配的外部端点的 IP 地址。

  • 外部控制平面虚拟机 IP 地址:分配给运行控制平面的每个虚拟机实例的外部 IP 地址,仅用于来自 API 服务器的出站流量。

  • 内部端点:GKE 为控制平面分配的内部 IP 地址。

  • VPC 网络:这是一个虚拟网络,您可以在其中创建具有 IP 地址范围的子网,专门用于集群的节点和 Pod。

使用基于 IP 的端点时,您有两种选择:

  • 在外部和内部端点上公开控制平面。这意味着,可以通过外部 IP 地址访问控制平面的外部端点,并且可以通过集群的 VPC 网络访问内部端点。节点仅会通过内部端点与控制平面通信。

  • 仅在内部端点上公开控制平面。这意味着互联网上的客户端无法连接到集群,可以通过集群 VPC 网络中的任何 IP 地址访问控制平面。节点仅会通过内部端点与控制平面通信。

    这是使用基于 IP 的端点时最安全的选项,因为它可阻止对控制平面进行的所有互联网访问。例如,如果您的工作负载因数据隐私权和安全法规而需要受控访问权限,则专用集群是一个不错的选择。

在上述两种选项中,您都可以通过配置已获授权的网络来限制哪些 IP 地址访问端点。如果您使用基于 IP 的端点,我们强烈建议您至少添加一个已获授权的网络。已获授权的网络会为控制平面授予对一组特定的受信任 IPv4 地址的访问权限,并为 GKE 集群提供保护和额外的安全优势。

最佳实践

使用基于 IP 的端点时,启用已获授权的网络以保护 GKE 集群。

授权网络的工作原理

已获授权的网络提供基于 IP 的防火墙,用于控制对 GKE 控制平面的访问权限。对控制平面的访问权限取决于来源 IP 地址。启用已获授权的网络后,您可以将希望允许其访问 GKE 集群控制平面端点的 IP 地址配置为一个 CIDR 地址块列表。

下表展示了:

  • 预设的 IP 地址,无论您是否启用已获授权的网络,这些 IP 地址始终可以访问 GKE 控制平面。
  • 可配置的 IP 地址,当您通过启用已获授权的网络将这些地址列入许可名单时,可以访问控制平面。
控制平面端点 预设的 IP 地址,始终可以访问端点 可配置的 IP 地址,可在启用已获授权的网络后访问端点
已启用外部和内部端点
  • Google 预留的 IP 地址
  • GKE 集群 IP 地址范围
  • 已列入许可名单的外部 IP 地址
  • 已列入许可名单的内部 IP 地址
  • Google Cloud 外部 IP 地址
仅启用内部端点
  • Google 预留的 IP 地址
  • GKE 集群 IP 地址范围
  • 已列入许可名单的内部 IP 地址。

使用已获授权的网络时,您还可以配置内部 IP 地址可以从中访问控制平面的内部端点的区域。您可以选择仅允许从集群的 VPC 网络或从 VPC 或本地环境中的任何 Google Cloud 区域进行访问。

使用基于 IP 的端点的限制

  • 如果您扩展子网并且具有已获授权的网络的集群使用该子网,则必须更新已获授权的网络配置以包含扩展的 IP 地址范围。
  • 如果您的客户端通过具有动态 IP 地址的网络(例如员工的家庭网络)进行连接,则您必须经常更新已获授权的网络列表,以保持对集群的访问权限。
  • 停用对控制平面外部端点的访问权限会阻止您与集群远程交互。如果您需要远程访问集群,则必须使用将客户端流量转发到集群的堡垒主机。相比之下,使用基于 DNS 的端点只需设置 IAM 权限。
  • 基于 IP 的端点不会直接与 VPC Service Controls 集成。 VPC Service Controls 在服务边界级别运行,用于控制 Google Cloud内的数据访问和移动。我们建议同时使用基于 DNS 的端点和 VPC Service Controls,以实现强大的安全防护。
  • 您最多可以指定 100 个已获授权的 IP 地址范围(外部和内部 IP 地址均包含在内)。

控制平面连接的传输层安全性

当您使用客户端库或 kubectl CLI 等方法向集群中的 Kubernetes API 服务器发送请求时,客户端与服务器之间的连接会受到 TLS 保护

为了建立 TLS 连接,服务器会向客户端提供证书。提供证书的具体服务器和为证书签名的证书授权机构 (CA) 取决于您用于访问控制平面的端点,具体如下:

  • 基于 DNS 的端点:托管基于 DNS 的端点的 Google Front End (GFE) 服务会提供证书。该证书由公开且普遍认可的 Google CA 签名。客户端可以使用公共 CA 信息来验证证书。
  • 基于 IP 的端点:Kubernetes API 服务器会提供证书。该证书由集群根 CA 签名。为了验证 API 服务器证书,客户端必须使用集群根 CA 的公共证书。在无法访问 gcloud CLI 的环境中设置客户端时,您必须将集群的根 CA 证书添加到 ~/.kube/config 文件中。如需了解详情,请参阅向 Kubernetes API 服务器进行身份验证

从 API 服务器访问外部来源

GKE 集群控制平面运行 Kubernetes 控制平面组件,例如 API 服务器、调度器和控制器。控制平面在受管项目中由 GKE 拥有的 Compute Engine 虚拟机实例上运行。区域级集群和 Autopilot 集群有多个控制平面副本,每个副本都在其各自的虚拟机实例上运行。

默认情况下,每个 Compute Engine 虚拟机实例都有一个直接分配给该虚拟机的外部 IP 地址。此 IP 地址仅用于将准入请求从实例上的 Kubernetes API 服务器发送到集群外部(例如在其他云服务或本地)运行的准入 webhook 服务器。仅当准入 Webhook 通过使用服务器网址或服务器 IP 地址直接与 Webhook 服务器联系时,才使用此 IP 地址。

为了提高控制平面的安全态势,您可以停用控制平面虚拟机实例上的外部 IP 地址。如果发生入侵,潜在的攻击者无法使用这些外部 IP 地址进行通信。您可以通过以下方式自定义 API 服务器的出站流量:

  • 无出站流量 (NONE):停用每个控制平面实例的外部 IP 地址,并将 API 服务器出站流量路由到黑洞。 从 API 服务器到外部目标的所有非关键出站流量都被阻止,包括到集群外部 Google Cloud 服务的流量。此选项不会影响关键系统流量或来自节点的流量。
  • 所有出站流量 (VIA_CONTROL_PLANE):保留每个控制平面实例的外部 IP 地址,并允许 API 服务器使用该 IP 地址处理出站流量。此选项是 GKE 中的默认选项。

如需了解如何针对这些选项自定义集群,请参阅限制来自 API 服务器的出站流量

外部 webhook 配置

当您将控制平面出站流量限制设置为 NONE 时,API 服务器无法直接调用任何外部 IP 地址或完全限定域名 (FQDN)。NONE 设置对外部 Webhook 有以下影响:

  • 在 1.35.1-gke.1396000 及更高版本中,GKE 会阻止创建或更新使用 clientConfig.url 字段的 ValidatingWebhookConfigurations 或 MutatingWebhookConfigurations。
  • 使用 clientConfig.url 字段联系外部服务器的现有 Webhook 配置将停止工作。

如需创建和使用外部 Webhook 服务器,您必须执行以下操作:

  1. 更新您的 ValidatingWebhookConfigurations 或 MutatingWebhookConfigurations 以使用 clientConfig.service 字段。此字段可让 API 服务器向集群中的服务端点(例如 my-webhook.default.svc)发送请求。这些请求不会被阻止,因为流量位于集群内。如需了解详情,请参阅服务参考
  2. 配置服务以将流量路由到外部 Webhook 服务器。您可以根据自己的安全和运营要求,使用以下任一流量路由设计:

    • 代理 Pod:使用 Deployment 或 StatefulSet 作为服务的后端。将 Pod 配置为充当代理,将传入的准入请求重定向到您的外部 Webhook 服务器。此设计可让您执行额外的任务,例如检查和修改准入请求。
    • EndpointSlices:创建不含选择器的服务,然后手动添加一个 EndpointSlice,将该服务映射到外部 Webhook 服务器的 IP 地址。 此设计可在不修改请求的情况下路由流量。

设计 Webhook 配置时,请考虑以下因素:

  • 身份验证和凭据:考虑如何向外部 Webhook 服务器进行身份验证。您的流量路由工作流还必须管理如何将凭据(例如 API 密钥、mTLS 证书和 OAuth 令牌)应用于连接。
  • 安全性和网络控制:考虑路由设计的攻击面以及安全和审核选项。您实现的广告设计会影响您可以对流量应用哪些限制。例如,您可以将 NetworkPolicies 与代理 Pod 搭配使用。
  • 可观测性和可靠性:考虑如何监控连接。 例如,您可以配置代理 Pod 来发出指标,也可以为 EndpointSlice 实现网络可观测性。

从外部来源访问节点

本部分介绍了如何在 Kubernetes 集群中隔离节点

启用专用节点

通过仅为节点预配内部 IP 地址,使其成为专用节点,从而防止外部客户端访问这些节点。在没有外部 IP 地址的节点上运行的工作负载无法访问互联网,除非在集群的网络上启用 NAT。您可以随时更改这些设置。

您可以在单个集群级别或在节点池(对于 Standard 集群)或工作负载(对于 Autopilot 集群)级别启用专用节点。在节点池级别或工作负载级别启用专用节点会替换集群级别的任何节点配置。

如果您将公共节点池更新为专用模式,则在以下情况下,需要访问集群网络外部资源的工作负载可能会失败:

  • 未启用专用 Google 访问通道的共享 VPC 网络中的集群。手动启用专用 Google 访问通道,以确保 GKE 下载分配的节点映像。对于不在共享 VPC 网络中的集群,GKE 会自动启用专用 Google 访问通道。

  • 需要访问互联网的工作负载(未启用 Cloud NAT 或未定义自定义 NAT 解决方案的情况下)。如需允许流向互联网的出站流量,请启用 Cloud NAT 或自定义 NAT 解决方案。

无论您是否启用专用节点,控制平面仍仅通过内部 IP 地址与所有节点进行通信。

网络隔离的优势

网络隔离具有以下优势:

  • 灵活性

    • 集群具有统一且灵活的配置。无论是否有外部端点,集群都共享同一架构并支持相同的功能。您可以根据满足您需求的控制措施和最佳实践来确保访问安全。集群中的节点与控制平面之间的所有通信都使用内部 IP 地址。
    • 您可以随时更改控制平面访问权限和集群节点配置设置,而无需重新创建集群。
    • 如果您需要从可访问互联网的任何位置或从未直接与 VPC 连接的网络或设备来管理集群,则可以选择启用控制平面的外部端点。或者,如果您需要为敏感工作负载保持网络隔离,则可以停用外部端点以增强安全性。无论是哪种情况,您都可以使用已获授权的网络来限制对受信任 IP 范围的访问。
  • 安全性

    • 基于 DNS 的端点搭配 VPC Service Controls 可提供多层安全保护模型,以保护集群免遭未经授权的网络以及未经授权的身份访问控制平面。VPC Service Controls 与 Cloud Audit Logs 集成,可用于监控对控制平面的访问。
    • 专用节点以及在这些节点上运行的工作负载无法直接从公共互联网访问,从而显著降低了集群遭受外部攻击的可能性。
    • 您可以阻止从Google Cloud 外部 IP 地址或外部 IP 地址访问控制平面,以完全隔离集群控制平面并降低面临潜在安全威胁的风险。
    • 您可以停用控制平面虚拟机实例的外部 IP 地址,以防止攻击者使用这些 IP 地址。
  • 合规性:如果您所在的行业对数据访问和存储有严格的法规,专用节点可确保敏感数据保留在专用网络中,从而实现合规性。

  • 控制:专用节点可让您精细控制流量流入和流出集群的方式。您可以配置防火墙规则和网络政策,以仅允许授权的通信。如果您在多云环境中进行操作,专用节点可以帮助您在不同环境之间建立安全且受控的通信。

  • 费用:启用专用节点后,您可以降低不需要使用外部 IP 地址来访问互联网上的公共服务的节点的费用。

后续步骤