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

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

概述

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

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

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

上市区域

专用群集在支持 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 或更高版本。
  • 若要使用自定义 DNS 服务器,请将 Azure 公共 IP 地址 168.63.129.16 添加为自定义 DNS 服务器中的上游 DNS 服务器,并确保将此公共 IP 地址添加为第一个 DNS 服务器。 有关 Azure IP 地址的详细信息,请参阅 IP 地址 168.63.129.16 是什么?
    • 群集的 DNS 区域应该是转发到 168.63.129.16 的区域。 可以在 Azure 服务 DNS 区域配置中找到有关区域名称的详细信息。
  • 启用了 API 服务器 VNet 集成的现有 AKS 群集可以启用专用群集模式。 有关详细信息,请参阅在具有 API 服务器 VNet 集成的现有群集上启用或禁用专用群集模式

限制

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

创建专用 AKS 群集

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

    az group create \
        --name <private-cluster-resource-group> \
        --location <location>
    
  2. 使用带 --enable-private-cluster 标志的 az aks create 命令创建具有默认基本网络的专用群集。

    az aks create \
        --name <private-cluster-name> \
        --resource-group <private-cluster-resource-group> \
        --load-balancer-sku standard \
        --enable-private-cluster \
        --generate-ssh-keys
    

连接到专用群集

若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl。 如果使用的是 Azure Cloud Shell,则 kubectl 已安装。 若要在本地安装 kubectl,请使用 az aks install-cli 命令。

  1. 使用 az aks get-credentials 命令将 kubectl 配置为连接到你的 Kubernetes 群集。 此命令将下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。

    az aks get-credentials --resource-group <private-cluster-resource-group> --name <private-cluster-name>
    
  2. 使用 kubectl get 命令验证与群集之间的连接。 此命令将返回群集节点的列表。

    kubectl get nodes
    

使用自定义域

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

禁用公共 FQDN

在新群集上禁用公共 FQDN

  • 在创建专用 AKS 群集时使用 az aks create 命令和 --disable-public-fqdn 标志禁用公共 FQDN。

    az aks create \
        --name <private-cluster-name> \
        --resource-group <private-cluster-resource-group> \
        --load-balancer-sku standard \
        --enable-private-cluster \
        --assign-identity <resourceID> \
        --private-dns-zone <private-dns-zone-mode> \
        --disable-public-fqdn \
        --generate-ssh-keys
    

在现有群集上禁用公共 FQDN

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

    az aks update \
        --name <private-cluster-name> \
        --resource-group <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-subdomainCUSTOM_PRIVATE_DNS_ZONE_RESOURCE_ID 结合使用,以便为 privatelink.<region>.cx.prod.service.azk8s.cn 提供子域功能。
    • 如果为 AKS 群集配置了 Active Directory 服务主体,则 AKS 不支持将系统分配的托管标识用于自定义专用 DNS 区域。 群集必须使用用户分配的托管标识身份验证
    • 如果你要指定 <subzone>,请注意 <subzone> 名称限制为 32 个字符。

注意

可以使用 ARM 模板或 Azure CLI 配置 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']"
}

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

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

    az aks create \
        --name <private-cluster-name> \
        --resource-group <private-cluster-resource-group> \
        --load-balancer-sku standard \
        --enable-private-cluster \
        --assign-identity <resourceID> \
        --private-dns-zone [system|none] \
        --generate-ssh-keys
    

创建具有自定义专用 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 \
        --name <private-cluster-name> \
        --resource-group <private-cluster-resource-group> \
        --load-balancer-sku standard \
        --enable-private-cluster \
        --assign-identity <resourceID> \
        --private-dns-zone <custom private dns zone or custom private dns subzone resourceID> \
        --generate-ssh-keys
    

创建具有自定义专用 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 \
        --name <private-cluster-name> \
        --resource-group <private-cluster-resource-group> \
        --load-balancer-sku standard \
        --enable-private-cluster \
        --assign-identity <resourceID> \
        --private-dns-zone <custom private dns zone resourceID> \
        --fqdn-subdomain <subdomain> \
        --generate-ssh-keys
    

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

只能从 byosystem 更新到 none。 不支持更新值的其他组合。 在更新之前,请确保连接到专用群集

警告

byosystem 将专用群集更新为 none 时,代理节点将更改为使用公共 FQDN。 在使用 Azure 虚拟机规模集的 AKS 群集中,将执行节点映像升级,以使用公共 FQDN 更新节点。

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

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

连接到专用群集的选项

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

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

虚拟网络对等互连

若要使用虚拟网络对等互连,需要在虚拟网络与专用 DNS 区域之间设置链接。

  1. Azure 门户中,导航到节点资源组并选择“专用 DNS 区域资源”。
  2. 在服务菜单中的“DNS 管理”下,选择“虚拟网络链接”>“添加”。
  3. 在“添加虚拟网络链接”页上,配置以下设置:
    • 链接名称:输入虚拟网络链接的名称。
    • 虚拟网络:选择包含 VM 的虚拟网络。
  4. 选择“创建”以创建虚拟网络链接。
  5. 导航到包含群集虚拟网络的资源组,并选择“虚拟网络资源”。
  6. 在服务菜单中的“设置”下,选择“对等互连”>“添加”。
  7. 在“添加对等互连”页面上,配置以下设置:
    • 对等互连链接名称:输入对等互连链接的名称。
    • 虚拟网络:选择 VM 的虚拟网络。
  8. 选择“添加”以创建对等互连链接。

有关详细信息,请参阅虚拟网络对等互连

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

中心和分支体系结构通常用于在 Azure 中部署网络。 在许多此类部署中,会将分支 VNet 中的 DNS 设置配置为引用中心 DNS 转发器,以允许本地和基于 Azure 的 DNS 解析。

专用群集中心和分支

将 AKS 群集部署到此类网络环境中时,有一些特殊注意事项:

  • 默认情况下,预配专用群集后,会在群集管理的资源组中创建专用终结点 (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. 搜索“专用终结点”,然后选择“创建”>“专用终结点”。
  3. 选择创建
  4. 在“基本信息”选项卡上,配置以下设置
    • 项目详细信息
      • 订阅:选择专用群集所在的订阅。
      • 资源组:选择包含虚拟网络的资源组。
    • 实例详细信息
      • 名称:输入专用终结点的名称,例如 myPrivateEndpoint。
      • 区域:选择与你的虚拟网络相同的区域。
  5. 选择“下一步: 资源”,并配置以下设置:
    • 连接方法:选择“连接到目录中的 Azure 资源”。
    • 订阅:选择专用群集所在的订阅。
    • 资源类型:选择 Microsoft.ContainerService/managedClusters。
    • 资源:选择专用群集。
    • 目标子资源:选择“管理”。
  6. 选择“下一步: 虚拟网络”,并配置以下设置:
    • 联网
      • 虚拟网络:选择虚拟网络。
      • 子网:选择子网。
  7. 选择“下一步: DNS”>“下一步: 标记”并(可选)根据需要设置键值。
  8. 选择“下一步: 查看 + 创建”>“创建”。

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

创建专用 DNS 区域

创建专用终结点后,请创建新的专用 DNS 区域,该区域的名称与专用群集创建的专用 DNS 区域相同。 请记得在包含消耗性资源的 VNet 中创建此 DNS 区域。

  1. 在 Azure 门户中,导航到节点资源组并选择“专用 DNS 区域资源”。
  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. 在服务菜单中的“DNS 管理”下,选择“记录集”>“添加”。
  3. 在“添加记录集”页面上,配置下列设置:
    • 名称:输入从专用群集 DNS 区域的 A 记录中检索到的名称。
    • 类型:选择“A - 地址记录”。
    • TTL:输入专用群集的 DNS 区域中 A 记录中的数字。
    • TTL 单位:更改下拉菜单的值,使其匹配专用群集 DNS 区域的 A 记录中的值。
    • IP 地址:输入你创建的专用终结点的 IP 地址
  4. 选择“添加”以创建 A 记录。

重要

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

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

  1. 转到在前面的步骤中创建的专用 DNS 区域。
  2. 在服务菜单中的“DNS 管理”下,选择“虚拟网络链接”>“添加”。
  3. 在“添加虚拟网络链接”页上,配置以下设置:
    • 链接名称:输入虚拟网络链接的名称。
    • 订阅:选择专用群集所在的订阅。
    • 虚拟网络:选择专用群集的虚拟网络。
  4. 选择“创建”以创建链接。

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

警告

  • 如果专用群集已停止并重启,则会移除并重新创建专用群集的原始专用链接服务,这将中断专用终结点与专用群集之间的连接。 若要解决此问题,请删除并重新创建已链接到专用群集的任何用户创建的专用终结点。 如果重新创建的专用终结点具有新的 IP 地址,则还需要更新 DNS 记录。
  • 如果在专用 DNS 区域中更新 DNS 记录,请确保尝试连接的主机使用的是已更新的 DNS 记录。 可以使用 nslookup 命令进行验证。 如果你发现更新并未反映在输出中,则可能需要刷新计算机上的 DNS 缓存,然后重试。

后续步骤

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