创建专用 Azure Kubernetes 服务 (AKS) 群集

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

控制平面或 API 服务器位于 Azure Kubernetes 服务 (AKS) 托管的 Azure 资源组中。 群集或节点池位于资源组中。 服务器与群集或节点池可以通过 API 服务器虚拟网络中的 Azure 专用链接服务以及在 AKS 群集的子网中公开的专用终结点相互通信。

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

本文旨在帮助部署基于专用链接的 AKS 群集。 如果你有兴趣创建没有必需的专用链接或隧道的 AKS 群集,请参阅使用 API 服务器 VNet 集成创建 Azure Kubernetes 服务群集(预览版)。

上市区域

专用群集在支持 AKS 的公共区域、Azure 中国云和由世纪互联运营的 Azure 区域提供。

先决条件

  • Azure CLI 版本 2.28.0 和更高版本。 可通过运行 az --version 查找版本,运行 az upgrade 升级版本。 如果需要进行安装或升级,请参阅安装 Azure CLI
  • aks-preview 扩展 0.5.29 或更高版本。
  • 如果使用的是 Azure 资源管理器 (ARM) 或 Azure REST API,则 AKS API 版本必须是 2021-05-01 或更高版本。
  • 仅标准 Azure 负载均衡器支持 Azure 专用链接服务。 不支持基本 Azure 负载均衡器。
  • 若要使用自定义 DNS 服务器,请将 Azure 公共 IP 地址 168.63.129.16 添加为自定义 DNS 服务器中的上游 DNS 服务器,并确保将此公共 IP 地址添加为第一个 DNS 服务器。 有关 Azure IP 地址的详细信息,请参阅 IP 地址 168.63.129.16 是什么?

限制

  • IP 授权范围不能应用于专用 API 服务器终结点,它们仅适用于公共 API 服务器
  • Azure 专用链接服务限制适用于专用群集。
  • 不支持具有专用群集的 Azure DevOps Microsoft 托管的代理。 请考虑使用自托管代理
  • 如果需要允许 Azure 容器注册表使用专用 AKS 群集,请在群集虚拟网络中为容器注册表设置专用链接,或在容器注册表虚拟网络与专用群集的虚拟网络之间设置对等互连。
  • 不支持将现有 AKS 群集转换为专用群集。
  • 删除或修改客户子网中的专用终结点将导致群集停止运行。

创建专用 AKS 群集

创建资源组

使用 az group create 命令创建资源组。 还可以将现有资源组用于 AKS 群集。

az group create -l chinaeast2 -n myResourceGroup

默认基本网络

使用带 --enable-private-cluster 标志的 az aks create 命令创建具有默认基本网络的专用群集。

az aks create -n <private-cluster-name> -g <private-cluster-resource-group> --load-balancer-sku standard --enable-private-cluster  

高级网络

使用带以下标志的 az aks create 命令创建具有高级网络的专用群集:

az aks create \
    --resource-group <private-cluster-resource-group> \
    --name <private-cluster-name> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --network-plugin azure \
    --vnet-subnet-id <subnet-id> \
    --docker-bridge-address 172.17.0.1/16 \
    --dns-service-ip 10.2.0.10 \
    --service-cidr 10.2.0.0/24 

注意

如果 Docker 桥地址 CIDR (172.17.0.1/16) 与子网 CIDR 冲突,请更改 Docker 桥地址。

使用自定义域

如果要配置只能在内部解析的自定义域,请参阅使用自定义域

禁用公共 FQDN

在新的 AKS 群集上禁用公共 FQDN

使用 --disable-public-fqdn 标志在创建专用 AKS 群集时禁用公共 FQDN。

az aks create -n <private-cluster-name> -g <private-cluster-resource-group> --load-balancer-sku standard --enable-private-cluster --enable-managed-identity --assign-identity <resourceID> --private-dns-zone <private-dns-zone-mode> --disable-public-fqdn

在现有群集上禁用公共 FQDN

使用带 --disable-public-fqdn 标志的 az aks update 命令在现有 AKS 群集上禁用公共 FQDN。

az aks update -n <private-cluster-name> -g <private-cluster-resource-group> --disable-public-fqdn

配置专用 DNS 区域

可以使用以下参数配置专用 DNS 区域:

  • system - 这是默认值。 如果省略了 --private-dns-zone 参数,则 AKS 将在节点资源组中创建一个专用 DNS 区域。
  • none - 默认值为公共 DNS。 AKS 不会创建专用 DNS 区域。
  • CUSTOM_PRIVATE_DNS_ZONE_RESOURCE_ID:要求你采用以下格式为 Azure 全球云创建专用 DNS 区域:privatelink.<region>.cx.prod.service.azk8s.cn<subzone>.privatelink.<region>.cx.prod.service.azk8s.cn。 将需要专用 DNS 区域的资源 ID,以备后用。 还需要具有专用 DNS 区域参与者网络参与者角色的用户分配标识或服务主体。 使用 API 服务器 VNet 集成进行部署时,专用 DNS 区域支持 private.<region>.cx.prod.service.azk8s.cn<subzone>.private.<region>.cx.prod.service.azk8s.cn 命名格式。
    • 如果专用 DNS 区域与 AKS 群集位于不同的订阅中,需要在这两个订阅中注册 Azure 提供程序 Microsoft.ContainerServices。
    • “fqdn-subdomain”可以与“CUSTOM_PRIVATE_DNS_ZONE_RESOURCE_ID”一起使用,仅限向 privatelink.<region>.cx.prod.service.azk8s.cn 提供子域功能。
    • 如果为 AKS 群集配置了 Active Directory 服务主体,则 AKS 不支持将系统分配的托管标识用于自定义专用 DNS 区域。

注意

除了 Azure CLI,还可以使用 ARM 模板配置 CUSTOM_PRIVATE_DNS_ZONE_RESOURCE_IDprivateDNSZone接受专用 DNZ 区域 resourceID,如以下示例所示:

properties.apiServerAccessProfile.privateDNSZone.
"apiServerAccessProfile": {
"enablePrivateCluster": true,
"privateDNSZone": "system|none|[resourceId(..., 'Microsoft.Network/privateDnsZones', 'privatelink.<region>.cx.prod.service.azk8s.cn']"
}

重要

创建群集后,无法更改 CUSTOM_PRIVATE_DNS_ZONE_RESOURCE_ID,也无法将其删除。 否则,在执行升级操作时群集会出现问题。

创建具有专用 DNS 区域的专用 AKS 群集

使用带以下标志的 az aks create 命令创建具有专用 DNS 区域的专用 AKS 群集:

az aks create -n <private-cluster-name> -g <private-cluster-resource-group> --load-balancer-sku standard --enable-private-cluster --enable-managed-identity --assign-identity <resourceID> --private-dns-zone [system|none]

创建具有自定义专用 DNS 区域和专用 DNS 子区域的专用 AKS 群集

使用带以下标志的 az aks create 命令创建具有自定义专用 DNS 区域或子区域的专用 AKS 群集:

# The custom private DNS zone name should be in the following format: "<subzone>.privatelink.<region>.cx.prod.service.azk8s.cn"

az aks create -n <private-cluster-name> -g <private-cluster-resource-group> --load-balancer-sku standard --enable-private-cluster --enable-managed-identity --assign-identity <resourceID> --private-dns-zone <custom private dns zone or custom private dns subzone resourceID>

创建具有自定义专用 DNS 区域和自定义子域的专用 AKS 群集

使用带以下标志的 az aks create 命令创建具有自定义专用 DNS 区域和子网域的专用 AKS 群集:

# The custom private DNS zone name should be in one of the following formats: "privatelink.<region>.cx.prod.service.azk8s.cn" or "<subzone>.privatelink.<region>.cx.prod.service.azk8s.cn"

az aks create -n <private-cluster-name> -g <private-cluster-resource-group> --load-balancer-sku standard --enable-private-cluster --enable-managed-identity --assign-identity <resourceID> --private-dns-zone <custom private dns zone resourceID> --fqdn-subdomain <subdomain>

将专用群集从专用 DNS 区域更新为公共集群

注意

此功能需要 aks-preview 扩展版本 >= 0.5.97

az aks update 命令与以下标记配合使用,将专用群集从 byo 更新为 systemnone

az aks update -n <private-cluster-name> -g <private-cluster-resource-group> --private-dns-zone none

注意

只能从 byosystem 更新到 none。 不支持更新值的其他组合。

连接到专用群集的选项

API 服务器终结点没有公共 IP 地址。 若要管理 API 服务器,需要使用有权访问 AKS 群集的 Azure 虚拟网络 (VNet) 的 VM。 有几种选项可用于建立与专用群集的网络连接:

注意

在与 AKS 群集相同的 VNet 中创建 VM 是最简单的选项。 快速路由和 VPN 会增加成本,且要求额外的网络复杂性。 虚拟网络对等互联要求计划网络 CIDR 范围,以确保不存在重叠范围。

虚拟网络对等互连

虚拟网络对等互连是一种访问专用群集的方法。 若要使用虚拟网络对等互连,需要在虚拟网络与专用 DNS 区域之间设置链接。

  1. 在浏览器中转到 Azure 门户
  2. 从 Azure 门户中转到节点资源组。
  3. 选择专用 DNS 区域。
  4. 在左窗格中,选择“虚拟网络”。
  5. 创建新链接,将 VM 的虚拟网络添加到专用 DNS 区域。 DNS 区域链接需要几分钟时间才能变为可用。
  6. 在 Azure 门户中,导航到包含群集虚拟网络的资源组。
  7. 在右窗格中,选择“虚拟网络”。 虚拟网络名称的格式为 aks-vnet-*。
  8. 在左窗格中,选择“对等互连”。
  9. 选择“添加”,添加 VM 的虚拟网络,然后创建对等互连。 有关详细信息,请参阅虚拟网络对等互连

具有自定义 DNS 的中心和分支

中心和分支体系结构通常用于在 Azure 中部署网络。 在许多此类部署中,会将分支 VNet 中的 DNS 设置配置为引用中心 DNS 转发器,以允许本地和基于 Azure 的 DNS 解析。 将 AKS 群集部署到此类网络环境中时,有一些特殊注意事项:

Private cluster hub and spoke

  • 默认情况下,预配专用群集后,会在群集管理的资源组中创建专用终结点 (1) 和专用 DNS 区域 (2)。 群集使用专用区域中的 A 记录来解析专用终结点的 IP,以便与 API 服务器通信。
  • 专用 DNS 区域仅链接到群集节点附加到的 VNet (3)。 这意味着专用终结点只能由该链接 VNet 中的主机进行解析。 在 VNet 上不配置任何自定义 DNS(默认设置)的情况下,这可以正常工作,因为主机指向用于 DNS 的 168.63.129.16,因此可以解析专用 DNS 区域中的记录(由于存在链接)。
  • 在包含群集的 VNet 具有自定义 DNS 设置 (4) 的情况下,除非将专用 DNS 区域链接到包含自定义 DNS 解析程序的 VNet (5),否则群集部署将失败。 可以在群集预配期间创建专用区域后手动创建此链接,也可以使用基于事件的部署机制(例如,Azure 事件网格和 Azure Functions)在检测到区域已创建后通过自动化来创建此链接。 若要避免群集在初始部署期间失败,可以使用专用 DNS 区域资源 ID 部署群集。 这仅适用于资源类型 Microsoft.ContainerService/managedCluster 和 API 版本 2022-07-01。 不支持将较旧版本与 ARM 模板或 Bicep 资源定义配合使用。

注意

条件转发不支持子域。

注意

如果你将自带路由表与 kubenet 配合使用,并且将自带 DNS 与专用群集配合使用,群集创建操作将会失败。 你需要在群集创建操作失败之后将节点资源组中的 RouteTable 关联到子网,以使创建能够成功。

使用专用终结点连接

可以设置专用终结点,以便 VNet 无需对等互连即可与专用群集通信。 若要使用专用终结点,请在虚拟网络中创建新的专用终结点,然后在虚拟网络和新的专用 DNS 区域之间创建链接。

重要

如果虚拟网络配置了自定义 DNS 服务器,则需要根据环境适当地设置专用 DNS。 有关详细信息,请参阅虚拟网络名称解析文档

创建专用终结点资源

在 VNet 中创建专用终结点资源:

  1. 在浏览器中转到 Azure 门户
  2. 在 Azure 门户菜单中,选择“创建资源” 。
  3. 搜索“专用终结点”,然后选择“创建”>“专用终结点”。
  4. 选择创建
  5. 在“基本信息”选项卡上,设置以下选项:
    • 项目详细信息
      • 选择一个 Azure 订阅。
      • 选择虚拟网络所在的 Azure 资源组。
    • 实例详细信息
      • 输入专用终结点的名称,如 myPrivateEndpoint。
      • 选择专用终结点的区域。

重要

检查所选区域是否与要从中进行连接的虚拟网络相同,如果不同,则无法在“配置”选项卡中看到虚拟网络。

  1. 选择“下一步:资源”并设置以下选项:
    • 连接方法:选择“连接到目录中的 Azure 资源”。
    • 订阅:选择专用群集所在的订阅。
    • 资源类型:选择 Microsoft.ContainerService/managedClusters。
    • 资源:选择专用群集。
    • 目标子资源:选择“管理”。
  2. 选择“下一步:虚拟网络”并设置以下选项:
    • 网络
      • 虚拟网络:选择虚拟网络。
      • 子网:选择子网。
  3. 选择“下一步: DNS”>“下一步: 标记”并(可选)根据需要设置键值。
  4. 选择“下一步: 查看 + 创建”>“创建”。

创建资源后,记录专用终结点的专用 IP 地址,以备后用。

创建专用 DNS 区域

创建专用终结点后,请创建新的专用 DNS 区域,该区域的名称与专用群集创建的专用 DNS 区域相同:

  1. 转到 Azure 门户中的节点资源组。
  2. 选择专用 DNS 区域和记录:
    • 专用 DNS 区域的名称,采用 *.privatelink.<region>.cx.prod.service.azk8s.cn 模式。
    • A 记录的名称(不包括专用 DNS 名称)。
    • 生存时间 (TTL)。
  3. 在 Azure 门户中,选择“创建资源”。
  4. 搜索“专用 DNS 区域”,然后选择“创建”>“专用 DNS 区域”。
  5. 在“基本信息”选项卡上,设置以下选项:
    • 项目详细信息
      • 选择订阅
      • 选择在其中创建了专用终结点的资源组。
    • 实例详细信息
      • 输入从前面的步骤中检索到的 DNS 区域的名称。
      • 区域默认为资源组的位置。
  6. 选择“查看 + 创建”>“创建”。

创建 A 记录

创建专用 DNS 区域后,创建一条 A 记录,用于将专用终结点关联到专用群集:

  1. 转到在前面的步骤中创建的专用 DNS 区域。
  2. 在概述页面上,选择“记录集”。
  3. 在“添加记录集”选项卡上,设置以下选项:
    • 名称:输入从专用群集 DNS 区域的 A 记录中检索到的名称。
    • 类型:选择“A - 地址记录”。
    • TTL:输入专用群集的 DNS 区域中 A 记录中的数字。
    • TTL 单位:更改下拉菜单的值,使其匹配专用群集 DNS 区域的 A 记录中的值。
    • IP 地址:输入创建的专用终结点的 IP 地址。

重要

创建 A 记录时,请仅使用名称,而不使用完全限定的域名 (FQDN)。

创建 A 记录后,将专用 DNS 区域链接到将访问专用群集的虚拟网络:

  1. 转到在前面的步骤中创建的专用 DNS 区域。
  2. 在左窗格中,选择“虚拟网络链接”。
  3. 选择“添加”并设置以下选项:
    • 链接名称:输入虚拟网络链接的名称。
    • 订阅:选择专用群集所在的订阅。
    • 虚拟网络:选择专用群集的虚拟网络。
  4. 选择“确定”以创建链接。

可能需要几分钟时间才能完成该操作。 创建虚拟网络链接后,可以从步骤 2 中使用的“虚拟网络链接”选项卡访问它。

警告

如果专用群集已停止并重启,则会移除并重新创建专用群集的原始专用链接服务,这将中断专用终结点与专用群集之间的连接。 若要解决此问题,请删除并重新创建已链接到专用群集的任何用户创建的专用终结点。 如果重新创建的专用终结点具有新的 IP 地址,则还需要更新 DNS 记录。

后续步骤

如需相关的最佳做法,请参阅 AKS 中的网络连接和安全性的最佳做法