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

使用 API 服务器 VNet 集成创建 Azure Kubernetes 服务群集(预览版)

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

API 服务器连接

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

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

上市区域

API 服务器 VNet 集成在所有全球 Azure 区域中可用。

先决条件

  • 包含 aks-preview 扩展 0.5.97 或更高版本的 Azure CLI。
  • 如果使用 ARM 或 REST API,则 AKS API 版本必须为 2022-04-02-preview 或更高。

安装 aks-preview Azure CLI 扩展

重要

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

  • 使用 az extension add 命令安装 aks-preview 扩展。

    az extension add --name aks-preview
    
  • 使用 az extension update 命令更新到已发布的最新扩展版本。

    az extension update --name aks-preview
    

注册“EnableAPIServerVnetIntegrationPreview”功能标志

  1. 使用 az feature register 命令注册 EnableAPIServerVnetIntegrationPreview 功能标志。

    az feature register --namespace "Microsoft.ContainerService" --name "EnableAPIServerVnetIntegrationPreview"
    

    状态显示为“已注册”需要几分钟时间

  2. 使用 az feature show 命令验证注册状态:

    az feature show --namespace "Microsoft.ContainerService" --name "EnableAPIServerVnetIntegrationPreview"
    
  3. 当状态反映为已注册时,使用 az provider register 命令刷新 Microsoft.ContainerService 资源提供程序的注册。

    az provider register --namespace Microsoft.ContainerService
    

使用托管 VNet 创建具有 API 服务器 VNet 集成的 AKS 群集

可以在托管 VNet 或自带 VNet 模式中配置具有 API 服务器 VNet 集成的 AKS 群集。 可以将它们创建为公共群集(可通过公共 IP 访问 API 服务器)或专用群集(其中的 API 服务器只能通过专用 VNet 连接进行访问)。 也可以在公共和专用状态之间切换,无需重新部署群集。

创建资源组

  • 使用 az group create 命令创建资源组。

    az group create --location westus2 --name <resource-group>
    

部署公共群集

  • 使用带有 --enable-api-server-vnet-integration 标志的 az aks create 命令,为托管 VNet 部署具有 API 服务器 VNet 集成的公共 AKS 群集。

    az aks create --name <cluster-name> \
        --resource-group <resource-group> \
        --location <location> \
        --network-plugin azure \
        --enable-apiserver-vnet-integration \
        --generate-ssh-keys
    

部署专用群集

  • 使用带有 --enable-api-server-vnet-integration--enable-private-cluster 标志的 az aks create 命令,为托管 VNet 部署具有 API 服务器 VNet 集成的专用 AKS 群集。

    az aks create --name <cluster-name> \
        --resource-group <resource-group> \
        --location <location> \
        --network-plugin azure \
        --enable-private-cluster \
        --enable-apiserver-vnet-integration \
        --generate-ssh-keys
    

使用自带 VNet 创建具有 API 服务器 VNet 集成的专用 AKS 群集

使用自带 VNet 时,必须创建一个 API 服务器子网并将其委派给 Microsoft.ContainerService/managedClusters,这会授予 AKS 服务将 API 服务器 Pod 和内部负载均衡器注入该子网的权限。 无法将该子网用于任何其他工作负载,但可将其用于同一虚拟网络中的多个 AKS 群集。 支持的最小 API 服务器子网大小为 /28。

群集标识需要拥有对 API 服务器子网和节点子网的权限。 缺少对 API 服务器子网的权限可能导致预配失败。

警告

AKS 群集在子网地址空间中保留至少 9 个 IP。 用尽 IP 地址可能会阻止 API 服务器缩放并导致 API 服务器中断。

创建资源组

az group create --location <location> --name <resource-group>

创建虚拟网络

  1. 使用 az network vnet create 命令创建虚拟网络。

    az network vnet create --name <vnet-name> \
    --resource-group <resource-group> \
    --location <location> \
    --address-prefixes 172.19.0.0/16
    
  2. 使用 az network vnet subnet create 命令创建 API 服务器子网。

    az network vnet subnet create --resource-group <resource-group> \
    --vnet-name <vnet-name> \
    --name <apiserver-subnet-name> \
    --delegations Microsoft.ContainerService/managedClusters \
    --address-prefixes 172.19.0.0/28
    
  3. 使用 az network vnet subnet create 命令创建群集子网。

    az network vnet subnet create --resource-group <resource-group> \
    --vnet-name <vnet-name> \
    --name <cluster-subnet-name> \
    --address-prefixes 172.19.1.0/24
    

创建托管标识并为其授予对虚拟网络的权限

  1. 使用 az identity create 命令创建托管标识。

    az identity create --resource-group <resource-group> --name <managed-identity-name> --location <location>
    
  2. 使用 az role assignment create 命令将网络参与者角色分配给 API 服务器子网。

    az role assignment create --scope <apiserver-subnet-resource-id> \
    --role "Network Contributor" \
    --assignee <managed-identity-client-id>
    
  3. 使用 az role assignment create 命令将网络参与者角色分配给群集子网。

    az role assignment create --scope <cluster-subnet-resource-id> \
    --role "Network Contributor" \
    --assignee <managed-identity-client-id>
    

部署公共群集

  • 使用带有 --enable-api-server-vnet-integration 标志的 az aks create 命令,部署具有 API 服务器 VNet 集成的公共 AKS 群集。

    az aks create --name <cluster-name> \
        --resource-group <resource-group> \
        --location <location> \
        --network-plugin azure \
        --enable-apiserver-vnet-integration \
        --vnet-subnet-id <cluster-subnet-resource-id> \
        --apiserver-subnet-id <apiserver-subnet-resource-id> \
        --assign-identity <managed-identity-resource-id> \
        --generate-ssh-keys
    

部署专用群集

  • 使用带有 --enable-api-server-vnet-integration--enable-private-cluster 标志的 az aks create 命令,部署具有 API 服务器 VNet 集成的专用 AKS 群集。

    az aks create --name <cluster-name> \
    --resource-group <resource-group> \
    --location <location> \
    --network-plugin azure \
    --enable-private-cluster \
    --enable-apiserver-vnet-integration \
    --vnet-subnet-id <cluster-subnet-resource-id> \
    --apiserver-subnet-id <apiserver-subnet-resource-id> \
    --assign-identity <managed-identity-resource-id> \
    --generate-ssh-keys
    

将现有 AKS 群集转换为 API 服务器 VNet 集成

可以通过提供满足前面列出的要求的 API 服务器子网,将现有公共/专用 AKS 群集转换为 API 服务器 VNet 集成群集。 这些要求包括:在群集节点所在的 VNet 中,为 AKS 群集标识授予的权限,不被其他资源(如专用终结点)使用,以及至少 /28 的大小。 转换群集是单向迁移。 群集在 API 服务器 VNet 集成启用后无法禁用它。

此升级在所有节点池上执行节点映像版本升级,并在所有工作负载进行滚动映像升级期间重启工作负载。

警告

将群集转换为 API 服务器 VNet 集成会导致 API 服务器 IP 地址更改,但主机名会保持不变。 如果 API 服务器的 IP 地址已在任何防火墙或网络安全组规则中配置,则可能需要更新这些规则。

  • 使用带有 --enable-apiserver-vnet-integration 标志的 az aks update 命令,将群集更新到 API 服务器 VNet 集成。

    az aks update --name <cluster-name> \
    --resource-group <resource-group> \
    --enable-apiserver-vnet-integration \
    --apiserver-subnet-id <apiserver-subnet-resource-id>
    

在具有 API 服务器 VNet 集成的现有群集上启用或禁用专用群集模式

使用 API 服务器 VNet 集成配置的 AKS 群集可以启用或禁用公用网络访问/专用群集模式,而无需重新部署群集。 不会更改 API 服务器主机名,但会根据需要修改或删除公共 DNS 条目。

注意

--disable-private-cluster 当前处于预览状态。 有关详细信息,请参阅参考和支持级别

启用专用群集模式

  • 使用带有 --enable-private-cluster 标志的 az aks update 命令启用专用群集模式。

    az aks update --name <cluster-name> \
    --resource-group <resource-group> \
    --enable-private-cluster
    

禁用专用群集模式

  • 使用带有 --disable-private-cluster 标志的 az aks update 命令禁用专用群集模式。

    az aks update --name <cluster-name> \
    --resource-group <resource-group> \
    --disable-private-cluster
    

使用 kubectl 连接到群集

  • 使用 az aks get-credentials 命令将 kubectl 配置为连接到你的群集。

    az aks get-credentials --resource-group <resource-group> --name <cluster-name>
    

NSG 安全规则

默认情况下,允许 VNet 中的所有流量。 但是,如果添加了 NSG 规则来限制不同子网之间的流量,请确保 NSG 安全规则允许以下类型的通信:

目标 Source 协议 端口 使用
APIServer 子网 CIDR 群集子网 TCP 443 和 4443 如需启用节点与 API 服务器之间的通信,则必须支持。
APIServer 子网 CIDR Azure 负载均衡器 TCP 9988 如需启用 Azure 负载均衡器与 API 服务器之间的通信,则必须支持。 你还可以启用 Azure 负载均衡器与 API 服务器子网 CIDR 之间的所有通信。

后续步骤

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