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

创建网络隔离的 Azure Kubernetes 服务 (AKS) 群集(预览版)

组织通常具有严格的安全性和合规性要求,需要对群集的出口(出站)网络流量进行监管,以消除数据外泄的风险。 默认情况下,Azure Kubernetes 服务 (AKS) 群集的出站互联网访问不受限制。 此级别的网络访问权限允许运行的节点和服务根据需要访问外部资源。 如果希望限制出口流量,则必须限制可访问的端口和地址数量,才能维护正常的群集维护任务。

确保出站地址安全的一个解决方案是使用可根据域名控制出站流量的防火墙设备。

另一种解决方案是网络隔离的 AKS 群集(预览版),它可简化群集的出站限制设置。 网络隔离的 AKS 群集可降低数据外泄或无意中暴露群集公共端点的风险。

重要

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

准备阶段

  • 请阅读该功能的概念概述,其中介绍了网络隔离群集的工作方式。 概述文章还:
    • 解释了可以选择的两种访问方法:AKS 管理的 ACR 或 BYO ACR。
    • 描述了当前限制
  • 本文需要 2.63.0 或更高版本的 Azure CLI。 如果你使用的是 Azure Cloud Shell,则表示已安装最新版本。

  • 安装 aks-preview Azure CLI 扩展版本 9.0.0b2 或更高版本。

    • 如果还没有 aks-preview 扩展,请使用 az extension add 命令安装它。

      az extension add --name aks-preview
      
    • 如果已有 aks-preview 扩展,请使用 az extension update 命令更新它以确保拥有最新版本。

      az extension update --name aks-preview
      
  • 使用 az-feature-register 命令注册 NetworkIsolatedClusterPreview 功能标志。

    az feature register --namespace Microsoft.ContainerService --name NetworkIsolatedClusterPreview
    

    使用 az feature show 命令验证注册状态。 需要花费几分钟时间,状态才会显示为“已注册”

    az feature show --namespace Microsoft.ContainerService --name NetworkIsolatedClusterPreview
    

    注意

    如果选择创建网络隔离群集,并配置 API 服务器 VNet 集成以实现 API Server 的专用访问,则也需要重复上述步骤来注册 EnableAPIServerVnetIntegrationPreview 功能标志。 当状态反映“已注册”时,使用 az provider register 命令来刷新 Microsoft.ContainerServiceMicrosoft.ContainerRegistry 资源提供程序的注册:

     az provider register --namespace Microsoft.ContainerService
     az provider register --namespace Microsoft.ContainerRegistry
    
  • 如果选择“自带”(BYO)Azure 容器注册表 (ACR) 选项,则需要确保 ACR 满足以下要求:

  • (可选)如果要使用任何需要出站网络访问的可选 AKS 功能或加载项,本文档包含每个功能的出站要求。 此外,本文档会枚举支持专用链接集成的功能或加载项,以便从群集虚拟网络中安全连接。 如果专用链接集成不适用于其中任何功能,则可以使用用户定义的路由表和 Azure 防火墙基于该功能所需的网络规则和应用程序规则设置群集。

注意

网络隔离群集尚不支持以下 AKS 群集扩展:

使用 AKS 管理的 ACR 部署网络隔离群集

AKS 会在此选项中创建、管理和协调 ACR 资源。 无需分配任何权限或管理 ACR。 AKS 管理网络隔离群集中使用的缓存规则、专用链接和专用终结点。

创建网络隔离群集

创建网络隔离 AKS 群集时,可以选择以下专用群集模式之一 - 专用链接或 API 服务器 VNet 集成。

无论选择哪种模式,都需要设置 --bootstrap-artifact-source--outbound-type 参数。

--bootstrap-artifact-source 可以分别设置为 DirectCache,以便使用直接 MCR(非网络隔离)和专用 ACR(网络隔离)进行映像拉取。

--outbound-type parameter 可以设置为 noneblock。 如果出站类型设置为 none,则 AKS 不会为群集设置任何出站连接,允许用户自行配置它们。 如果出站类型设置为阻止,则会阻止所有出站连接。

通过运行 az aks create 命令,使用 --bootstrap-artifact-source--enable-private-cluster--outbound-type 参数创建基于专用链接的网络隔离 AKS 群集。

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}   --kubernetes-version 1.30.3 --bootstrap-artifact-source Cache --outbound-type none  --network-plugin azure --enable-private-cluster

API 服务器 VNet 集成

通过运行 az aks create 命令,使用 --bootstrap-artifact-source--enable-private-cluster--enable-apiserver-vnet-integration--outbound-type 参数创建配置了 API 服务器 VNet 集成的网络隔离 AKS 群集。

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster --enable-apiserver-vnet-integration

将现有 AKS 群集更新为网络隔离类型

如果要在现有 AKS 群集上启用网络隔离,而不是创建新的群集,请使用 az aks update 命令。

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --outbound-type none

启用该功能后,任何新添加的节点都可以在没有出口的情况下成功启动。 在现有群集上启用网络隔离时,请记住,需要手动重新映像所有现有节点。

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

重要

在为现有群集启用网络隔离模式后,请记住重新映像群集的节点池。 否则,该功能不会对群集生效。

使用自带 ACR 部署网络隔离群集

AKS 支持自带 (BYO) ACR。 要支持 BYO ACR 方案,必须在创建 AKS 群集之前配置 ACR 专用终结点和专用 DNS 区域。

以下步骤演示如何准备这些资源:

  • AKS 和 ACR 的自定义虚拟网络和子网。
  • ACR、ACR 缓存规则、专用终结点和专用 DNS 区域。
  • 自定义控制平面标识和 kubelet 标识。

步骤 1:创建虚拟网络和子网

AKS 子网的默认出站访问必须为 false。

az group create --name ${RESOURCE_GROUP} --location ${LOCATION}

az network vnet create  --resource-group ${RESOURCE_GROUP} --name ${VNET_NAME} --address-prefixes 192.168.0.0/16

az network vnet subnet create --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.1.0/24 --default-outbound-access false

SUBNET_ID=$(az network vnet subnet show --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' --output tsv)

az network vnet subnet create --name ${ACR_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.2.0/24 --private-endpoint-network-policies Disabled

步骤 2:创建 ACR 并启用工件缓存

  1. 创建带有专用链接和匿名拉取访问权限的 ACR。

    az acr create --resource-group ${RESOURCE_GROUP} --name ${REGISTRY_NAME} --sku Premium --public-network-enabled false
    
    az acr update --resource-group ${RESOURCE_GROUP} --name ${REGISTRY_NAME} --anonymous-pull-enabled true
    
    REGISTRY_ID=$(az acr show --name ${REGISTRY_NAME} -g ${RESOURCE_GROUP}  --query 'id' --output tsv)
    
  2. 创建 ACR 缓存规则,以允许用户在新 ACR 中缓存 MCR 容器映像。

    az acr cache create -n acr-cache-rule -r ${REGISTRY_NAME} -g ${RESOURCE_GROUP} --source-repo "mcr.microsoft.com/*" --target-repo "*"
    

步骤 3:为 ACR 创建专用终结点

az network private-endpoint create --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --subnet ${ACR_SUBNET_NAME} --private-connection-resource-id ${REGISTRY_ID} --group-id registry --connection-name myConnection

NETWORK_INTERFACE_ID=$(az network private-endpoint show --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --query 'networkInterfaces[0].id' --output tsv)

REGISTRY_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry'].privateIPAddress" --output tsv)

DATA_ENDPOINT_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$LOCATION'].privateIPAddress" --output tsv)

步骤 4:创建专用 DNS 区域并添加记录

创建名为 privatelink.azurecr.io 的专用 DNS 区域。 添加注册表 REST 终结点 {REGISTRY_NAME}.azurecr.io 和注册表数据终结点 {REGISTRY_NAME}.{REGISTRY_LOCATION}.data.azurecr.io 的记录。

az network private-dns zone create --resource-group ${RESOURCE_GROUP} --name "privatelink.azurecr.io"

az network private-dns link vnet create --resource-group ${RESOURCE_GROUP} --zone-name "privatelink.azurecr.io" --name MyDNSLink --virtual-network ${VNET_NAME} --registration-enabled false

az network private-dns record-set a create --name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}

az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${REGISTRY_PRIVATE_IP}

az network private-dns record-set a create --name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}

az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${DATA_ENDPOINT_PRIVATE_IP}

步骤 5:创建控制平面和 kubelet 标识

控制平面标识

az identity create --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}

CLUSTER_IDENTITY_RESOURCE_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)

CLUSTER_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)

Kubelet 标识

az identity create --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}

KUBELET_IDENTITY_RESOURCE_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)

KUBELET_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)

授予 Kubelet 标识的 AcrPull 权限

az role assignment create --role AcrPull --scope ${REGISTRY_ID} --assignee-object-id ${KUBELET_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal

配置这些资源后,就可以使用 BYO ACR 创建网络隔离 AKS 群集了。

步骤 6:使用 BYO ACR 创建网络隔离群集

创建网络隔离 AKS 群集时,可以选择以下专用群集模式之一 - 专用链接或 API 服务器 VNet 集成。

无论选择哪种模式,都需要设置 --bootstrap-artifact-source--outbound-type 参数。

--bootstrap-artifact-source 可以分别设置为 DirectCache,以便使用直接 MCR(非网络隔离)和专用 ACR(网络隔离)进行映像拉取。

--outbound-type parameter 可以设置为 noneblock。 如果出站类型设置为 none,则 AKS 不会为群集设置任何出站连接,允许用户自行配置它们。 如果出站类型设置为阻止,则会阻止所有出站连接。

运行 az aks create 命令并配置所需参数,创建基于专用链接的网络隔离群集,用于访问 ACR。

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-private-cluster

API 服务器 VNet 集成

对于具有 API 服务器 VNet 集成的网络隔离群集,请先创建子网,并使用以下命令分配正确的角色:

az network vnet subnet create --name ${APISERVER_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.3.0/24

export APISERVER_SUBNET_ID=$(az network vnet subnet show --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --name ${APISERVER_SUBNET_NAME} --query id -o tsv)
az role assignment create --scope ${APISERVER_SUBNET_ID} --role "Network Contributor" --assignee-object-id ${CLUSTER_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal

运行 az aks create 命令并配置所需参数,创建具有 API 服务器 VNet 集成的网络隔离 AKS 群集,同时访问 ACR。

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-apiserver-vnet-integration --apiserver-subnet-id ${APISERVER_SUBNET_ID}

更新现有的 AKS 群集

如果要在现有 AKS 群集上启用网络隔离,而不是创建新的群集,请使用 az aks update 命令。

为 BYO ACR 创建专用终结点和专用 DNS 区域时,请使用现有 AKS 群集的现有虚拟网络和子网。 将 AcrPull 权限分配给 kubelet 标识时,请使用现有 AKS 群集的现有 kubelet 标识。

若要在现有 AKS 群集上启用网络隔离功能,请使用以下命令:

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none

启用网络隔离群集功能后,新添加的节点池中的节点可以成功启动,而无需出口。 必须重新映像现有节点池,以便新扩展的节点可以成功启动。 在现有群集上启用该功能时,需要手动重新映像所有现有节点。

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

重要

请记得在启用网络隔离群集功能后,重新映像群集的节点池。 否则,该功能不会对群集生效。

更新 ACR ID

可以更新与网络隔离的 AKS 群集一起使用的专用 ACR。 若要标识 ACR 资源 ID,请使用 az aks show 命令。

az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}

通过运行 az aks update 命令并配置 --bootstrap-artifact-source--bootstrap-container-registry-resource-id 参数,执行 ACR ID 的更新。

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id <New BYO ACR resource ID>

更新现有群集的 ACR ID 时,需要手动重新映像所有现有节点。

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

重要

请记得在启用网络隔离群集功能后,重新映像群集的节点池。 否则,该功能不会对群集生效。

验证是否已启用网络隔离群集

若要验证已启用网络隔离群集功能,请使用 az aks show 命令

az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}

以下输出显示,根据 outboundType 属性(无或已阻止)和 artifactSource 属性(缓存)的值,该功能已启用。

"kubernetesVersion": "1.30.3",
"name": "myAKSCluster"
"type": "Microsoft.ContainerService/ManagedClusters"
"properties": {
  ...
  "networkProfile": {
    ...
    "outboundType": "none",
    ...
  },
  ...
  "bootstrapProfile": {
    "artifactSource": "Cache",
    "containerRegistryId": "/subscriptions/my-subscription-id/my-node-resource-group-name/providers/Microsoft.ContainerRegistry/registries/my-registry-name"
  },
  ...
}

禁用网络隔离群集

通过运行 az aks update 命令并配置 --bootstrap-artifact-source--outbound-type 参数,禁用网络隔离群集功能。

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Direct --outbound-type LoadBalancer

在现有群集上禁用该功能时,需要手动重新映像所有现有节点。

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

重要

请记得在禁用网络隔离群集功能后,重新映像群集的节点池。 否则,该功能不会对群集生效。

后续步骤

通过学习这篇文章,了解了要限制群集的出口流量时可以使用的端口和地址。

若要使用 Azure 防火墙设置出站限制配置,请访问在 AKS 中使用 Azure 防火墙控制出站流量

若要限制 pod 之间的通信方式以及群集内的东-西向流量限制,请参阅在 AKS 中使用网络策略确保 pod 之间的流量安全