你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

保护对 Kubernetes 的网络访问

Azure Bastion
Azure DNS
Azure Kubernetes 服务 (AKS)
Azure 专用链接
Azure 虚拟网络

本文比较了 Azure Kubernetes 服务 (AKS) 和 Amazon Elastic Kubernetes 服务 (Amazon EKS) 的网络模式。 本文介绍了如何提高与 AKS 群集的托管 API 服务器的连接安全性,以及限制公共网络访问的不同选项。

注意

本文是系列文章之一,可帮助熟悉 Amazon EKS 的专业人员了解 AKS

Amazon EKS 网络模式

借助 Amazon 虚拟私有云 (Amazon VPC),你可以将 Amazon Web Services (AWS) 资源启动到由公共和专用子网或 VPC 中的 IP 地址范围组成的虚拟网络中。 公共子网托管必须连接到 Internet 的资源,而专用子网托管未连接到公共 Internet 的资源。 Amazon EKS 可以在公有子网和专用子网中预配托管节点组。

终结点访问控制允许你配置 API 服务器终结点是可以从公共 Internet 访问,还是要通过 VPC 访问。 EKS 提供了多种方法来控制对群集终结点的访问。 你可以同时启用默认的公共终结点、专用终结点,也可以同时启用公共和专用终结点。 启用公共终结点时,可以添加无类域间路由 (CIDR) 限制以限制可以连接到公共终结点的客户端 IP 地址。

Amazon EKS 节点如何连接到托管 Kubernetes 控制平面取决于为群集配置的终结点设置。 可以随时通过 Amazon EKS 控制台或 API 更改终结点设置。 有关更多信息,请参阅 Amazon EKS 群集终结点访问控制

仅限公共终结点

新 Amazon EKS 群集的默认模式是通过公共终结点来公开控制平面。 当仅启用群集的公共终结点时,源自 Amazon VPC 内部的 Kubernetes API 请求(例如用于控制平面通信的工作程序节点)会离开 VPC,但不会离开 Amazon 的网络。 对于连接到控制平面的节点,这些节点必须使用公共 IP 地址,并且路由目的地必须为 Internet 网关的路由或是网络地址转换 (NAT) 网关(此时这些节点可以使用 NAT 网关的公共 IP 地址)。

公共和专用终结点

当公共和专用终端节点都启用时,来自 VPC 内的 Kubernetes API 请求通过 VPC 中的 Amazon EKS 管理的弹性网络接口 (ENI) 与控制平面通信。 群集 API 服务器可从 Internet 访问。

仅专用终结点

当仅启用专用终结点时,到群集 API 服务器的所有流量(例如 kubectlhelm 命令)必须来自群集的 VPC 或连接的网络内。 从 Internet 对 API 服务器的公共访问将被禁用。 可以使用目的地为 AWS 虚拟专用网络 (AWS VPN)AWS DirectConnect 来实现这种访问模式。 要在没有 AWS VPN 或 DirectConnect 的情况下限制对终结点的访问,你可以向公共终结点添加 CIDR 限制以限制连接,而无需设置更多网络。

有关连接选项的更多信息,请参阅访问仅专用 API 服务器

对 API 服务器的 AKS 网络访问

有两个选项可以保护对 AKS 中 Kubernetes API 的网络访问、专用 AKS 群集或授权 IP 范围。

专用 AKS 群集

AKS 专用群集确保 API 服务器和节点池之间的网络流量保持在虚拟网络中。 在专用 AKS 群集中,控制平面或 API 服务器具有一个内部 IP 地址,该地址只能通过位于同一虚拟网络中的 Azure 专用终结点进行访问。 同一虚拟网络中的任何虚拟机 (VM) 都可以通过专用终结点与控制平面进行专用通信。 控制平面或 API 服务器托管在 Azure 管理的订阅中,而 AKS 群集及其节点池位于客户的订阅中。

下图说明了专用群集配置。

显示专用 AKS 群集的图表。

下载此体系结构的 Visio 文件

若要预配专用 AKS 群集,AKS 资源提供程序将为专用 DNS 区域中的节点资源组创建专用完全限定域名 (FQDN)。 (可选)AKS 还可以在 Azure 公共 DNS 区域中创建具有相应地址 (A) 记录的公共 FQDN。 代理节点使用专用 DNS 区域中的 A 记录来解析专用终结点 IP 地址,以便与 API 服务器进行通信。

AKS 资源提供程序可以在节点资源组中创建专用 DNS 区域,也可以创建专用 DNS 区域并将其资源 ID 传递给预配系统。 在将 Terraform 与 AzureBicepARM 模板Azure CLIAzure PowerShell 模块Azure REST API 结合使用来创建群集时,可以创建专用群集。

可以在预配期间为 API 服务器启用公共 FQDN,也可以在现有群集上使用带有 --enable-public-fqdn 参数的 az aks update 命令。 如果启用公共 FQDN,则访问服务器的任何 VM(例如 Azure DevOps 自托管代理或 GitHub Actions 自托管运行器)必须位于托管群集的同一虚拟网络中,或者位于通过虚拟网络对等互连站点到站点 VPN 连接的网络中。

对于专用 AKS 群集,请禁用 API 服务器的公共 FQDN。 若要与专用控制平面通信,VM 必须位于同一虚拟网络中,或者位于虚拟网络链接指向专用 DNS 区域的对等虚拟网络中。 专用 DNS 区域中的 A 记录将 API 服务器的 FQDN 解析为与底层控制平面通信的专用终结点 IP 地址。 有关详细信息,请参阅创建专用 Azure Kubernetes 服务群集

专用群集部署选项

AKS 资源提供程序公开以下参数以自定义专用 AKS 群集部署:

  • authorizedIpRanges(字符串),以 CIDR 格式指定允许的 IP 范围。
  • disableRunCommand(布尔值),指定是否禁用群集的 run 命令。
  • enablePrivateCluster(布尔值),指定是否将群集创建为专用。
  • enablePrivateClusterPublicFQDN(布尔值),指定是否为专用群集创建另一个公共 FQDN。
  • privateDnsZone(字符串),指定节点资源组中的专用 DNS 区域。 如果不指定值,资源提供程序将创建区域。 你可以指定以下值:
    • 默认值为 System
    • None 表示默认为公共 DNS,因此 AKS 不会创建专用 DNS 区域。
    • <Your own private DNS zone resource ID> 使用以 privatelink.<region>.azmk8s.io<subzone>.privatelink.<region>.azmk8s.io. 格式创建的专用 DNS 区域

下表显示了用于部署专用 AKS 群集的 DNS 配置选项:

专用 DNS 区域选项 enablePrivateClusterPublicFQDN: true enablePrivateClusterPublicFQDN: false
系统 代理节点以及 AKS 群集虚拟网络中的任何其他 VM 或连接到专用 DNS 区域的任何虚拟网络,使用专用 DNS 区域 A 记录来解析专用终结点的专用 IP 地址。

任何其他 VM 都使用 API 服务器的公共 FQDN。
代理节点以及 AKS 群集虚拟网络中的任何其他 VM 或连接到专用 DNS 区域的任何虚拟网络,使用专用 DNS 区域 A 记录来解析专用终结点的专用 IP 地址。

没有公共 API 服务器 FQDN 可用。
所有 VM(包括代理节点)都使用 API 服务器的公共 FQDN,可通过 Azure 管理的公共 DNS 区域中的 A 记录获得该 FQDN。 配置错误。 专用 AKS 群集至少需要公共或专用 DNS 区域才能解析 API 服务器的名称。
<你自己的专用 DNS 区域资源 ID> 代理节点以及 AKS 群集虚拟网络中的任何其他 VM 或连接到专用 DNS 区域的任何虚拟网络,使用专用 DNS 区域 A 记录来解析专用终结点的专用 IP 地址。

任何其他 VM 都使用 API 服务器的公共 FQDN。
代理节点以及 AKS 群集虚拟网络中的任何其他 VM 或连接到专用 DNS 区域的任何虚拟网络,使用专用 DNS 区域 A 记录来解析专用终结点的专用 IP 地址。

没有公共 API 服务器 FQDN 可用。

专用群集连接和管理

有几种选项可用于建立与专用群集的网络连接。

你可以使用 kubectl 命令行工具从同一虚拟网络或对等虚拟网络中的管理 VM 管理私有 AKS 群集。

可以在同一虚拟网络或对等虚拟网络中使用 Azure Bastion 连接到 jumpbox 管理 VM。 Azure Bastion 是一个完全托管的平台即服务 (PaaS),可让你使用浏览器和 Azure 门户连接到 VM。 Azure Bastion 直接从 Azure 门户通过传输层安全 (TLS) 提供安全且无缝的远程桌面协议 (RDP) 或安全外壳 (SSH) VM 连接。 当 VM 通过 Azure Bastion 连接时,它们不需要公共 IP 地址、代理或特殊客户端软件。

你还可以使用 az aks command invoke 在你的专用 AKS 群集上运行 kubectlhelm 命令,而无需连接到 jumpbox VM。

授权的 IP 范围

提高群集安全性并最大限度地减少对 API 服务器的攻击的第二个选项是使用授权的 IP 范围。 授权 IP 将对公共 AKS 群集的控制平面的访问限制为已知的 IP 地址和 CIDR 列表。 使用此选项时,API 服务器仍然公开,但访问受到限制。 有关详细信息,请参阅使用 Azure Kubernetes 服务 (AKS) 中的已授权 IP 地址范围保护对 API 服务器的访问

以下 az aks update Azure CLI 命令授权 IP 范围:

 az aks update \
     --resource-group myResourceGroup \
     --name myAKSCluster \
     --api-server-authorized-ip-ranges  73.140.245.0/24

AKS 连接性注意事项

  • AKS 专用群集提供的安全性和隔离性比授权 IP 更高。 但是,你无法将现有的公共 AKS 群集转换为专用群集。 可以为任何现有 AKS 群集启用授权 IP。

  • 不能将授权的 IP 范围应用于专用 API 服务器终结点。 授权 IP 仅适用于公共 API 服务器。

  • 专用群集不支持 Azure DevOps 托管的代理。 请考虑使用自托管代理。

  • 若要使 Azure 容器注册表能够与专用 AKS 群集一起使用,请在群集虚拟网络中为容器注册表设置专用链接。 或者,在容器注册表虚拟网络和专用群集的虚拟网络之间设置对等互连。

  • Azure 专用链接服务限制适用于专用群集。

  • 如果你删除或修改专用群集的客户子网中的专用终结点,则群集将停止运行。

作者

本文由 Microsoft 维护, 它最初是由以下贡献者撰写的。

主要作者:

其他参与者:

若要查看非公开的 LinkedIn 个人资料,请登录到 LinkedIn。

后续步骤

以下参考提供了文档和自动化示例的链接,其中介绍了如何使用安全 API 部署 AKS 群集: