你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
创建网络隔离的 Azure Kubernetes 服务 (AKS) 群集(预览版)
组织通常具有严格的安全性和合规性要求,需要对群集的出口(出站)网络流量进行监管,以消除数据外泄的风险。 默认情况下,Azure Kubernetes 服务 (AKS) 群集的出站互联网访问不受限制。 此级别的网络访问权限允许运行的节点和服务根据需要访问外部资源。 如果希望限制出口流量,则必须限制可访问的端口和地址数量,才能维护正常的群集维护任务。
确保出站地址安全的一个解决方案是使用可根据域名控制出站流量的防火墙设备。
另一种解决方案是网络隔离的 AKS 群集(预览版),它可简化群集的出站限制设置。 网络隔离的 AKS 群集可降低数据外泄或无意中暴露群集公共端点的风险。
重要
AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:
准备阶段
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 中的 Bash 快速入门。
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展。
运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
本文需要 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.ContainerService
和Microsoft.ContainerRegistry
资源提供程序的注册:az provider register --namespace Microsoft.ContainerService az provider register --namespace Microsoft.ContainerRegistry
如果选择“自带”(BYO)Azure 容器注册表 (ACR) 选项,则需要确保 ACR 满足以下要求:
- 必须为 ACR 启用匿名拉取访问。
- ACR 必须属于高级 SKU 服务层级
(可选)如果要使用任何需要出站网络访问的可选 AKS 功能或加载项,本文档包含每个功能的出站要求。 此外,本文档会枚举支持专用链接集成的功能或加载项,以便从群集虚拟网络中安全连接。 如果专用链接集成不适用于其中任何功能,则可以使用用户定义的路由表和 Azure 防火墙基于该功能所需的网络规则和应用程序规则设置群集。
使用 AKS 管理的 ACR 部署网络隔离群集
AKS 会在此选项中创建、管理和协调 ACR 资源。 无需分配任何权限或管理 ACR。 AKS 管理网络隔离群集中使用的缓存规则、专用链接和专用终结点。
创建网络隔离群集
创建网络隔离 AKS 群集时,可以选择以下专用群集模式之一 - 专用链接或 API 服务器 VNet 集成。
无论选择哪种模式,都需要设置 --bootstrap-artifact-source
和 --outbound-type
参数。
--bootstrap-artifact-source
可以分别设置为 Direct
或 Cache
,以便使用直接 MCR(非网络隔离)和专用 ACR(网络隔离)进行映像拉取。
--outbound-type parameter
可以设置为 none
或 block
。 如果出站类型设置为 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 并启用工件缓存
创建带有专用链接和匿名拉取访问权限的 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)
创建 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
可以分别设置为 Direct
或 Cache
,以便使用直接 MCR(非网络隔离)和专用 ACR(网络隔离)进行映像拉取。
--outbound-type parameter
可以设置为 none
或 block
。 如果出站类型设置为 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 之间的流量安全。