你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文比较 Azure Kubernetes 服务(AKS)和 Amazon Elastic Kubernetes 服务(EKS)的网络模式。 本文介绍如何提高与 AKS 群集的托管 API 服务器的连接安全性。 它还包括限制公共网络访问的选项。
注释
本文是一系列文章的一部分,可帮助熟悉 Amazon EKS 的专业人员了解 Azure Kubernetes 服务(AKS)。
Amazon EKS 网络模式
你可以使用 Amazon 虚拟私有云 (VPC) 将 Amazon Web Services (AWS) 资源部署到一个拥有公共和私有子网的虚拟网络中。 这些子网是 VPC 内的 IP 地址范围。 公共子网托管连接到 Internet 的资源。 专用子网托管不连接到公共 Internet 的资源。 Amazon EKS 可以在公有子网和专用子网中预配托管节点组。
终结点访问控制使你能够配置 API 服务器终结点是可从公共互联网访问,还是通过 VPC 访问。 Amazon EKS 提供多种方法来 控制对群集终结点的访问。 你可以同时启用默认的公共终结点、专用终结点,也可以同时启用公共和专用终结点。 启用公共终结点时,可以添加无类域间路由 (CIDR) 限制以限制可以连接到公共终结点的客户端 IP 地址。
群集的终结点设置确定 Amazon EKS 节点如何连接到托管 Kubernetes 控制平面。 可以通过 Amazon EKS 控制台或 API 更改终结点设置。 有关更多信息,请参阅 Amazon EKS 群集终结点访问控制。
仅限公共终结点
新 Amazon EKS 群集的默认模式通过公共终结点公开控制平面。 当仅启用群集的公共终结点时,源自 VPC 内的 Kubernetes API 请求会离开 VPC,但不会离开 Amazon 的网络。 这些请求包括从工作器节点到控制平面的通信。 节点通过公共 IP 地址连接到控制平面,并通过路由连接到 Internet 网关。 或者,他们可以使用路由到网络地址转换(NAT)网关,可以使用 NAT 网关的公共 IP 地址。
公共和专用终结点
当同时启用公共终端节点和专用终端节点时,Kubernetes API 请求会通过在 VPC 中的 Amazon EKS 托管的弹性网络接口(ENI)与控制平面通信。 可从 Internet 访问群集 API 服务器。
仅专用终结点
仅启用专用终结点时,所有到群集 API 服务器的流量(例如 kubectl
或 helm
命令)都必须来自群集的 VPC 或 连接的网络。 从 Internet 对 API 服务器的公共访问将被禁用。 若要实现此访问模式,请使用 AWS 虚拟专用网络(VPN) 或 AWS DirectConnect 连接到 VPN。 要在没有 AWS VPN 或 DirectConnect 的情况下限制对终结点的访问,你可以向公共终结点添加 CIDR 限制以限制连接,而无需设置更多网络。
如果为群集的 Kubernetes API 服务器终结点禁用公共访问,则可以通过以下方式之一访问 Kubernetes API 服务器终结点:
连接的网络:通过使用 AWS 中转网关将你的网络连接到 VPC,然后使用连接网络中的一台计算机。 也可以使用其他 连接选项。 确保你的 Amazon EKS 控制平面安全组包含允许来自连接网络的端口 443 入站流量的规则。
Amazon EC2 堡垒主机: 您可以在群集的 VPC 的公共子网中启动 Amazon EC2 实例。 通过安全外壳(SSH)登录到该实例,以运行
kubectl
命令。 确保你的 Amazon EKS 控制平面安全组包含允许来自堡垒主机的端口 443 入站流量的规则。 有关详细信息,请参阅 查看群集的 Amazon EKS 安全组要求。
当你为堡垒主机对kubectl
进行配置时,使用与你的群集基于角色的访问控制 (RBAC) 配置相匹配的 AWS 凭据。 或者,你可以在删除终结点公共访问之前,将你的堡垒使用的 AWS 身份和访问管理(IAM)主体 添加到 RBAC 配置中。 有关详细信息,请参阅 授予 IAM 用户和角色对 Kubernetes API 的访问权限,未经授权或访问被拒绝(kubectl)。AWS Cloud9 IDE: AWS Cloud9 是基于云的集成开发环境(IDE),可用于仅使用浏览器编写、运行和调试代码。 可以在群集的 VPC 中创建 AWS Cloud9 IDE,并使用该 IDE 进行群集通信。 有关详细信息,请参阅 在 AWS Cloud9 中创建环境。 确保你的 Amazon EKS 控制平面安全组包含允许来自你的 IDE 安全组的端口 443 入站流量的规则。 有关详细信息,请参阅 查看群集的 Amazon EKS 安全组要求。
在为 AWS Cloud9 IDE 配置kubectl
时,请使用符合群集 RBAC 配置的 AWS 凭据。 或者,可以在删除终结点公共访问之前,将 IDE 使用的 IAM 主体添加到 RBAC 配置。 有关详细信息,请参阅 授予 IAM 用户和角色对 Kubernetes API 的访问权限,未经授权或访问被拒绝(kubectl)。
有关连接选项的详细信息,请参阅 访问仅限专用的 API 服务器。
对 API 服务器的 AKS 网络访问
若要保护对 AKS 中 Kubernetes API 的网络访问,可以使用专用 AKS 群集或授权的 IP 地址范围。
专用 AKS 群集
专用 AKS 群集有助于确保 API 服务器和代理节点之间的网络流量保留在虚拟网络中。 在专用 AKS 群集中,控制平面或 API 服务器具有 内部 IP 地址。 专用群集有助于确保 API 服务器与节点池之间的网络流量仅保留在专用网络上。
在专用 AKS 群集中,API 服务器具有只能通过位于同一虚拟网络中的 Azure 专用终结点 访问的内部 IP 地址。 同一虚拟网络中的虚拟机(VM)可以通过此专用终结点私下与控制平面通信。 控制平面或 API 服务器托管在由 Azure 管理的订阅中。 AKS 群集及其节点池位于客户的订阅中。
下图显示了专用 AKS 群集配置。
下载此体系结构的 Visio 文件。
若要预配专用 AKS 群集,AKS 资源提供程序将为专用域名系统(DNS)区域中的节点资源组创建专用完全限定的域名(FQDN)。 (可选)AKS 还可以创建在 Azure 公共 DNS 区域中具有相应地址 A
记录的公共 FQDN。 代理节点使用专用 DNS 区域中的 A
记录来解析专用终结点 IP 地址,以便与 API 服务器进行通信。
AKS 资源提供程序可以在节点资源组中创建专用 DNS 区域,也可以创建专用 DNS 区域并将其资源 ID 传递给预配系统。 若要创建专用群集,可以将 Terraform 与 Azure、 Bicep、 Azure 资源管理器模板、 Azure CLI、 Azure PowerShell 模块或 Azure REST API 配合使用。
可以在配置期间为 API 服务器启用公共 FQDN,也可以在现有群集上使用带有 参数的 --enable-public-fqdn
命令。 如果启用公共 FQDN,则访问服务器的 VM 必须位于托管群集的同一虚拟网络中,或者位于通过 虚拟网络对等互连 或 站点到站点 VPN 连接的网络中。 这些 VM 的示例包括 Azure DevOps 自承载代理或 GitHub Actions 自承载运行程序。
对于专用 AKS 群集,请禁用 API 服务器的公共 FQDN。 若要与专用控制平面通信,VM 必须位于同一虚拟网络或具有虚拟网络链接的对等虚拟网络中,该虚拟网络链接到专用 DNS 区域。 专用 DNS 区域中的 A
记录将 API 服务器的 FQDN 解析为与底层控制平面通信的专用终结点 IP 地址。 有关详细信息,请参阅 创建专用 AKS 群集。
专用群集部署选项
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 群集虚拟网络中或连接到私有 DNS 区域的任何虚拟网络中的其他虚拟机,使用私有 DNS 区域的 A 记录来解析私有终结点的私有 IP 地址。其他 VM 使用 API 服务器的公共 FQDN。 |
代理节点以及 AKS 群集虚拟网络中或连接到私有 DNS 区域的任何虚拟网络中的其他虚拟机,使用私有 DNS 区域的 A 记录来解析私有终结点的私有 IP 地址。没有公共 API 服务器 FQDN 可用。 |
无 | 所有 VM(包括代理节点)都通过 Azure 托管的公共 DNS 区域中的 A 记录来使用 API 服务器的完整域名 (FQDN)。 |
配置错误。 专用 AKS 群集至少需要公共或专用 DNS 区域才能解析 API 服务器的名称。 |
你自己的专用 DNS 区域资源 ID | 代理节点以及 AKS 群集虚拟网络中或连接到私有 DNS 区域的任何虚拟网络中的其他虚拟机,使用私有 DNS 区域的 A 记录来解析私有终结点的私有 IP 地址。其他 VM 使用 API 服务器的公共 FQDN。 |
代理节点以及 AKS 群集虚拟网络中或连接到私有 DNS 区域的任何虚拟网络中的其他虚拟机,使用私有 DNS 区域的 A 记录来解析私有终结点的私有 IP 地址。没有公共 API 服务器 FQDN 可用。 |
专用群集连接和管理
在专用 AKS 群集中,API 服务器终结点没有公共 IP 地址。 可以使用下列选项之一建立与专用群集的网络连接:
在 AKS 群集所在的虚拟网络中创建一个 VM,该群集使用带有
az vm create
标志的--vnet-name
命令。在单独的虚拟网络中使用 VM,并设置与 AKS 群集虚拟网络的虚拟网络对等互连。
配置 Azure ExpressRoute 或 VPN 网关 以连接到群集虚拟网络。
在另一个虚拟网络中创建 Azure 专用终结点 连接。
使用在连接到群集 API 服务器的子网中部署的 Azure Cloud Shell 实例。
使用 Azure CLI 运行 az aks 命令调用 命令来访问专用群集,而无需配置 VPN 或 ExpressRoute 网关。 使用此命令通过 Azure API 在专用群集上远程调用其他命令,例如kubectl
helm
,无需直接连接到群集。 若要使用 command invoke
,请为 Microsoft.ContainerService/managedClusters/runcommand/action
和 Microsoft.ContainerService/managedclusters/commandResults/read
操作设置必要的权限。
在 Azure 门户中,可以使用 Run command
该功能在专用群集上运行命令。 此功能使用 command invoke
功能在群集上运行命令。 Run command
功能创建的 Pod 提供了管理群集的 kubectl
和 helm
工具。 Run command
还在 Pod 内提供了一个 Bash 环境,其中包含诸如 jq
、xargs
、grep
和 awk
等工具。
你可以在同一虚拟网络或对等虚拟网络中使用 Azure Bastion 连接到跳转盒管理虚拟机。 Azure Bastion 是一种完全托管的平台即服务(PaaS),可用于通过浏览器和 Azure 门户连接到 VM。 Azure Bastion 直接从 Azure 门户通过传输层安全(TLS)提供高度安全、无缝的 RDP 或 SSH 到虚拟机的连接。 当 VM 通过 Azure Bastion 连接时,它们不需要公共 IP 地址、代理或特殊客户端软件。
API 服务器 VNet 集成
使用 API 服务器 VNet 集成 配置的 AKS 群集会将 API 服务器终结点直接投影到委托的子网中。 子网位于部署 AKS 的虚拟网络中。 API 服务器 VNet 集成可在 API 服务器与群集节点之间实现网络通信,而无需专用链接或隧道。 API 服务器位于委托子网中的内部负载均衡器 VIP 后面。 节点配置为使用内部负载均衡器 VIP。 使用 API 服务器 VNet 集成来确保 API 服务器与节点池之间的网络流量仅保留在专用网络上。
控制平面或 API 服务器位于 AKS 管理的 Azure 订阅中。 群集或节点池位于 Azure 订阅中。 构成群集节点的服务器和虚拟机可以通过投影到委托子网中的 API 服务器 VIP 和 Pod IP 地址相互通信。
可以使用 API Server VNet 与公共群集和专用群集集成。 可以在群集预配后添加或删除公共访问权限。 与没有虚拟网络集成的群集不同,代理节点始终与 API 服务器内部负载均衡器 IP 的专用 IP 地址直接通信,而无需使用 DNS。 从节点到 API 服务器流量的流量位于专用网络上。 API 服务器到节点连接不需要隧道。 如果启用了公用网络访问,群集外客户端通常可以与 API 服务器通信。 如果禁用了公用网络访问,请遵循与标准 专用群集相同的专用 DNS 设置方法。 有关详细信息,请参阅 使用 API Server VNet 集成创建 AKS 群集。
授权 IP 地址范围
还可以使用 经过授权的 IP 地址范围 来提高群集安全性,并最大程度地减少对 API 服务器的攻击。 授权的 IP 地址范围将公共 AKS 群集的控制平面的访问限制为固定的已知 IP 地址和 CIDR 列表。 使用此选项时,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维护本文。 以下参与者撰写了本文。
主要作者:
- Paolo Salvatori | 首席服务工程师
- Martin Gjoshevski | 高级服务工程师
- 劳拉·尼古拉斯 |高级云解决方案架构师
其他参与者:
- 查德·基特尔 |首席软件工程师 - Azure 模式和做法
- Ed Price | 高级内容项目经理
- Theano Petersen | 技术文档撰写人
要查看非公开的 LinkedIn 个人资料,请登录到 LinkedIn。
后续步骤
- 使用公共 DNS 区域创建专用 AKS 群集
- 使用 Terraform 和 Azure DevOps 创建专用 AKS 群集
- 使用 Azure NAT 网关和 Azure 应用程序网关创建公共或专用 AKS 群集
- 将专用终结点与专用 AKS 群集配合使用
- 培训:专用链接简介
- 培训:Azure 网络安全与安全网络基础结构简介