你当前正在访问 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 的专业人员了解 Azure Kubernetes 服务 (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 命令)的所有流量都必须来自群集的 网络。 从 Internet 对 API 服务器的公共访问将被禁用。 可以使用目的地为 AWS 虚拟专用网络 (AWS VPN)AWS DirectConnect 来实现这种访问模式。 要在没有 AWS VPN 或 DirectConnect 的情况下限制对终结点的访问,你可以向公共终结点添加 CIDR 限制以限制连接,而无需设置更多网络。

如果已禁用群集 Kubernetes API 服务器终结点的公共访问,则可以通过以下方式之一访问 Kubernetes API 服务器终结点:

  • 连接的网络:使用 AWS 传输网关将网络连接到 或其他 连接选项,然后使用连接的网络中的计算机。 必须确保 Amazon EKS 控制平面安全组包含规则,以允许来自连接的网络的端口 443 上的入口流量。
  • Amazon EC2 堡垒主机:可以将 Amazon EC2 实例启动到群集的VP的公共子网中,然后通过 SSH 登录到该实例以运行 kubectl 命令。 有关详细信息,请参阅 AWS 上的Linux 堡垒主机。 必须确保 Amazon EKS 控制平面安全组包含规则,以允许来自堡垒主机的端口 443 上的入口流量。 有关详细信息,请参阅 查看群集的 Amazon EKS 安全组要求。 为堡垒主机配置 kubectl 时,请确保使用已映射到群集的 RBAC 配置的 AWS 凭据,或在删除终结点公共访问之前,将堡垒用于 RBAC 配置 添加 IAM 主体。 有关详细信息,请参阅 授予 IAM 用户和角色对 Kubernetes API 的访问权限未经授权或访问被拒绝(kubectl)
  • AWS Cloud9 IDE:AWS Cloud9 是一种基于云的集成开发环境(IDE),它允许你仅使用浏览器编写、运行和调试代码。 可以在群集的 AZURE 中创建 AWS Cloud9 IDE,并使用 IDE 与群集通信。 有关详细信息,请参阅 在 AWS Cloud9 中创建环境。 必须确保 Amazon EKS 控制平面安全组包含规则,以允许来自 IDE 安全组的端口 443 上的入口流量。 有关详细信息,请参阅 查看群集的 Amazon EKS 安全组要求。 为 AWS Cloud9 IDE 配置 kubectl 时,请确保使用已映射到群集的 RBAC 配置的 AWS 凭据,或者在删除终结点公共访问之前,将 IDE 用于 RBAC 配置的 IAM 主体添加到 RBAC 配置。 有关详细信息,请参阅 授予 IAM 用户和角色对 Kubernetes API 的访问权限未经授权或访问被拒绝(kubectl)

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

对 API 服务器的 AKS 网络访问

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

专用 AKS 群集

专用 AKS 群集 可确保 API 服务器和代理节点之间的网络流量保留在虚拟网络中。 在专用 AKS 群集中,控制平面或 API 服务器具有在 RFC1918 - 专用 Internet 文档中定义的内部 IP 地址。 通过使用专用群集,可以确保 API 服务器与节点池之间的网络流量仅保留在专用网络上。

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

预配专用 AKS 群集时,AKS 默认使用专用 DNS 区域创建专用 FQDN,并使用 Azure 公共 DNS 中的相应 A 记录创建其他公共 FQDN。 代理节点继续使用专用 DNS 区域中的 A 记录来解析专用终结点的专用 IP 地址,以便与 API 服务器通信。

下图演示了专用 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 命令。 如果启用公共 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 可用。

专用群集连接和管理

在专用 AKS 群集中,API 服务器终结点没有公共 IP 地址。 有多种选项可用于建立与专用群集的网络连接:

  1. 使用具有 --vnet-name 标志的 az vm create 命令,在 AKS 群集所在的同一虚拟网络中创建虚拟机。
  2. 在单独的虚拟网络中使用虚拟机,并使用 AKS 群集虚拟网络设置 虚拟网络对等互连
  3. 配置 Azure ExpressRoute 或 VPN 以连接到群集虚拟网络。
  4. 在另一个虚拟网络中创建 Azure 专用终结点 连接。
  5. 使用部署到已连接到群集 API 服务器的子网的 Cloud Shell 实例。

使用 Azure CLI,可以使用 az aks command invoke 命令访问专用群集,而无需配置 VPN 或 Express Route。 此命令允许通过 Azure API 远程调用专用群集上的命令(例如 kubectlhelm),而无需直接连接到群集。 若要使用 command invoke,需要为 Microsoft.ContainerService/managedClusters/runcommand/actionMicrosoft.ContainerService/managedclusters/commandResults/read 操作设置必要的权限。

在 Azure 门户中,可以利用 Run command 功能在专用群集上运行命令。 此功能实际上利用 command invoke 功能在群集上执行命令。 Run command 功能创建的 Pod 提供用于管理群集的 kubectlhelm 工具。 此外,它还支持 Bash,其中包含 jqxargsgrepawk 等工具。

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

API Server VNet 集成

使用 API Server VNet 集成配置的 Azure Kubernetes 服务(AKS)群集 将 API 服务器终结点直接投影到部署 AKS 的 VNet 中的委托子网中。 API 服务器 VNet 集成可在 API 服务器与群集节点之间实现网络通信,而无需专用链接或隧道。 API 服务器位于委托子网中的内部负载均衡器 VIP 后面,这些子网配置为利用这些节点。 通过使用 API 服务器 VNet 集成,可以确保 API 服务器与节点池之间的网络流量仅保留在专用网络上。

控制平面或 API 服务器位于 AKS 管理的 Azure 订阅中。 群集或节点池位于 Azure 订阅中。 构成群集节点的服务器和虚拟机可以通过投影到委托子网的 API 服务器 VIP 和 Pod IP 相互通信。

公共或专用群集支持 API 服务器 VNet 集成。 可以在群集预配后添加或删除公共访问权限。 与非 VNet 集成群集不同,代理节点始终与 API 服务器内部负载均衡器 (ILB) IP 的专用 IP 地址直接通信,而无需使用 DNS。 所有节点到 API 服务器流量都保留在专用网络上,API 服务器无需隧道连接到节点。 如果启用了公用网络访问,需要与 API 服务器通信的群集外客户端可以正常执行此操作。 如果禁用了公用网络访问,则应遵循与标准 专用群集相同的专用 DNS 设置方法。 有关详细信息,请参阅 使用 API Server VNet 集成创建 Azure Kubernetes 服务群集。

授权的 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 群集转换为专用群集。 相反,可以为任何现有的 AKS 群集启用授权 IP。
  • 授权 IP 范围不能应用于专用 API 服务器终结点。 它们仅适用于公共 API 服务器。
  • 专用群集不支持 Azure DevOps 托管的代理。 建议改用自承载代理。
  • 若要使 Azure 容器注册表使用专用 AKS 群集运行,必须为群集虚拟网络中的容器注册表设置专用链接。 或者,可以在容器注册表虚拟网络与专用群集的虚拟网络之间建立对等互连。
  • Azure 专用链接服务的限制适用于专用群集。
  • 如果删除或修改专用群集的客户子网中的专用终结点,群集将停止运行。

作者

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

主要作者:

其他参与者:

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

后续步骤

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