Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Хотя вы можете маршрутизировать исходящий трафик через Azure Load Balancer, существуют ограничения на количество исходящих потоков трафика, которые можно использовать. Шлюз Azure NAT допускает до 64 512 исходящих потоков трафика по протоколам UDP и TCP с одного IP-адреса и поддерживает не более 16 IP-адресов.
В этой статье показано, как создать кластер Служба Azure Kubernetes (AKS) с управляемым шлюзом NAT и шлюзом NAT, назначенным пользователем, для исходящего трафика. В нем также показано, как отключить outboundNAT в Windows.
Прежде чем начать
- Убедитесь, что вы используете последнюю версию Azure CLI.
- Убедитесь, что вы используете Kubernetes версии 1.20.x или более поздней.
- Управляемый шлюз NAT несовместим с пользовательскими виртуальными сетями.
Внимание
В не частных кластерах трафик кластера сервера API направляется и обрабатывается через исходящий тип кластеров. Чтобы предотвратить обработку трафика сервера API в качестве общедоступного трафика, рассмотрите возможность использования частного кластера или ознакомьтесь с функцией интеграции виртуальной сети СЕРВЕРА API.
Создание кластера AKS с управляемым шлюзом NAT
- Создайте кластер AKS с новым управляемым шлюзом NAT, используя команду
az aks create
с параметрами--outbound-type managedNATGateway
,--nat-gateway-managed-outbound-ip-count
, и--nat-gateway-idle-timeout
. Если требуется, чтобы шлюз NAT работал из определенной зоны доступности, укажите зону с помощью--zones
. - Если при создании управляемого шлюза NAT не задана зона, шлюз NAT по умолчанию развертывается в "без зоны". Если шлюз NAT помечен как Без зоны, Azure поместит ресурс в одну из зон за вас. Дополнительные сведения о незональной модели развертывания см. в незональном шлюзе NAT.
- Ресурс управляемого шлюза NAT нельзя использовать в нескольких зонах доступности.
Следующие команды сначала создают необходимую группу ресурсов, а затем кластер AKS с управляемым шлюзом NAT.
export RANDOM_SUFFIX=$(openssl rand -hex 3)
export MY_RG="myResourceGroup$RANDOM_SUFFIX"
export MY_AKS="myNatCluster$RANDOM_SUFFIX"
az group create --name $MY_RG --location "eastus2"
Результаты:
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx",
"location": "eastus2",
"managedBy": null,
"name": "myResourceGroupxxx",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
az aks create \
--resource-group $MY_RG \
--name $MY_AKS \
--node-count 3 \
--outbound-type managedNATGateway \
--nat-gateway-managed-outbound-ip-count 2 \
--nat-gateway-idle-timeout 4 \
--generate-ssh-keys
Результаты:
{
"aadProfile": null,
"agentPoolProfiles": [
{
...
"name": "nodepool1",
...
"provisioningState": "Succeeded",
...
}
],
"dnsPrefix": "myNatClusterxxx-dns-xxx",
"fqdn": "myNatClusterxxx-dns-xxx.xxxxx.xxxxxx.cloudapp.azure.com",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroupxxx/providers/Microsoft.ContainerService/managedClusters/myNatClusterxxx",
"name": "myNatClusterxxx",
...
"resourceGroup": "myResourceGroupxxx",
...
"provisioningState": "Succeeded",
...
"type": "Microsoft.ContainerService/ManagedClusters"
}
- Обновите исходящий IP-адрес или время ожидания простоя с помощью команды
az aks update
с параметром--nat-gateway-managed-outbound-ip-count
или--nat-gateway-idle-timeout
.
В следующем примере обновляется число управляемых исходящих IP-адресов шлюза NAT для кластера AKS до 5.
az aks update \
--resource-group $MY_RG \
--name $MY_AKS \
--nat-gateway-managed-outbound-ip-count 5
Результаты:
{
"aadProfile": null,
"agentPoolProfiles": [
{
...
"name": "nodepool1",
...
"provisioningState": "Succeeded",
...
}
],
"dnsPrefix": "myNatClusterxxx-dns-xxx",
"fqdn": "myNatClusterxxx-dns-xxx.xxxxx.xxxxxx.cloudapp.azure.com",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroupxxx/providers/Microsoft.ContainerService/managedClusters/myNatClusterxxx",
"name": "myNatClusterxxx",
...
"resourceGroup": "myResourceGroupxxx",
...
"provisioningState": "Succeeded",
...
"type": "Microsoft.ContainerService/ManagedClusters"
}
Создание кластера AKS с назначенным пользователем шлюзом NAT
Для этой конфигурации требуется создание собственных сетей (через Kubenet или Azure CNI), а шлюз NAT предварительно настроен в подсети. Следующие команды создают необходимые ресурсы для данного сценария.
Создайте группу ресурсов с помощью
az group create
команды.export RANDOM_SUFFIX=$(openssl rand -hex 3) export MY_RG="myResourceGroup$RANDOM_SUFFIX" az group create --name $MY_RG --location southcentralus
Результаты:
{ "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx", "location": "southcentralus", "managedBy": null, "name": "myResourceGroupxxx", "properties": { "provisioningState": "Succeeded" }, "tags": null, "type": "Microsoft.Resources/resourceGroups" }
Создайте управляемое удостоверение для разрешений сети и сохраните идентификатор
$IDENTITY_ID
для последующего использования.export IDENTITY_NAME="myNatClusterId$RANDOM_SUFFIX" export IDENTITY_ID=$(az identity create \ --resource-group $MY_RG \ --name $IDENTITY_NAME \ --location southcentralus \ --query id \ --output tsv)
Результаты:
/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myNatClusterIdxxx
Создайте общедоступный IP-адрес для шлюза NAT с помощью
az network public-ip create
команды.export PIP_NAME="myNatGatewayPip$RANDOM_SUFFIX" az network public-ip create \ --resource-group $MY_RG \ --name $PIP_NAME \ --location southcentralus \ --sku standard
Результаты:
{ "publicIp": { "ddosSettings": null, "dnsSettings": null, "etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"", "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/publicIPAddresses/myNatGatewayPipxxx", "ipAddress": null, "ipTags": [], "location": "southcentralus", "name": "myNatGatewayPipxxx", ... "provisioningState": "Succeeded", ... "sku": { "name": "Standard", "tier": "Regional" }, "type": "Microsoft.Network/publicIPAddresses", ... } }
Создайте шлюз NAT с помощью
az network nat gateway create
команды.export NATGATEWAY_NAME="myNatGateway$RANDOM_SUFFIX" az network nat gateway create \ --resource-group $MY_RG \ --name $NATGATEWAY_NAME \ --location southcentralus \ --public-ip-addresses $PIP_NAME
Результаты:
{ "etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"", "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/natGateways/myNatGatewayxxx", "location": "southcentralus", "name": "myNatGatewayxxx", "provisioningState": "Succeeded", "publicIpAddresses": [ { "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/publicIPAddresses/myNatGatewayPipxxx" } ], ... "type": "Microsoft.Network/natGateways" }
Внимание
Один ресурс шлюза NAT нельзя использовать в нескольких зонах доступности. Чтобы обеспечить устойчивость зоны, рекомендуется развернуть ресурс шлюза NAT в каждой зоне доступности и назначить подсети, содержащие кластеры AKS в каждой зоне. Дополнительные сведения об этой модели развертывания см. в разделе шлюза NAT для каждой зоны. Если зона для шлюза NAT не настроена, то по умолчанию используется состояние "нет зоны", при котором Azure самостоятельно размещает шлюз NAT в зоне.
Создайте виртуальную сеть с помощью
az network vnet create
команды.export VNET_NAME="myVnet$RANDOM_SUFFIX" az network vnet create \ --resource-group $MY_RG \ --name $VNET_NAME \ --location southcentralus \ --address-prefixes 172.16.0.0/20
Результаты:
{ "newVNet": { "addressSpace": { "addressPrefixes": [ "172.16.0.0/20" ] }, ... "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/virtualNetworks/myVnetxxx", "location": "southcentralus", "name": "myVnetxxx", "provisioningState": "Succeeded", ... "type": "Microsoft.Network/virtualNetworks", ... } }
Создайте подсеть в виртуальной сети с помощью шлюза NAT и сохраните идентификатор
$SUBNET_ID
для последующего использования.export SUBNET_NAME="myNatCluster$RANDOM_SUFFIX" export SUBNET_ID=$(az network vnet subnet create \ --resource-group $MY_RG \ --vnet-name $VNET_NAME \ --name $SUBNET_NAME \ --address-prefixes 172.16.0.0/22 \ --nat-gateway $NATGATEWAY_NAME \ --query id \ --output tsv)
Результаты:
/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/virtualNetworks/myVnetxxx/subnets/myNatClusterxxx
Создайте кластер AKS с помощью подсети с шлюзом NAT и управляемым удостоверением с помощью
az aks create
команды.export AKS_NAME="myNatCluster$RANDOM_SUFFIX" az aks create \ --resource-group $MY_RG \ --name $AKS_NAME \ --location southcentralus \ --network-plugin azure \ --vnet-subnet-id $SUBNET_ID \ --outbound-type userAssignedNATGateway \ --assign-identity $IDENTITY_ID \ --generate-ssh-keys
Результаты:
{ "aadProfile": null, "agentPoolProfiles": [ { ... "name": "nodepool1", ... "provisioningState": "Succeeded", ... } ], "dnsPrefix": "myNatClusterxxx-dns-xxx", "fqdn": "myNatClusterxxx-dns-xxx.xxxxx.xxxxxx.cloudapp.azure.com", "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroupxxx/providers/Microsoft.ContainerService/managedClusters/myNatClusterxxx", "name": "myNatClusterxxx", ... "resourceGroup": "myResourceGroupxxx", ... "provisioningState": "Succeeded", ... "type": "Microsoft.ContainerService/ManagedClusters" }
Отключение OutboundNAT для Windows
Windows OutboundNAT может вызвать определенные проблемы с подключением и взаимодействием с модулями POD AKS. Примером проблемы является повторное использование порта узла. В этом примере Windows OutboundNAT использует порты для перевода IP-адреса pod в IP-адрес узла Windows, что может привести к нестабильному подключению к внешней службе из-за проблемы с исчерпанием портов.
Windows включает OutboundNAT по умолчанию. Теперь при создании новых пулов агентов Windows вы можете вручную отключить OutboundNAT.
Требования
- Существующий кластер AKS с версией 1.26 или выше. Если вы используете Kubernetes версии 1.25 или более поздней, необходимо обновить конфигурацию развертывания.
Ограничения
- Невозможно задать тип внешнего кластера LoadBalancer. Его можно задать для шлюза Nat или UDR:
- Шлюз NAT: Шлюз NAT может автоматически обрабатывать NAT-соединение и более мощный, чем стандартный Load Balancer. Могут возникнуть дополнительные расходы при выборе этого варианта.
- UDR (UserDefinedRouting) — при настройке правил маршрутизации необходимо учитывать ограничения портов.
- Если необходимо переключиться с подсистемы балансировки нагрузки на шлюз NAT, можно добавить шлюз NAT в виртуальную сеть или запустить
az aks upgrade
для обновления исходящего типа.
Примечание.
UserDefinedRouting имеет следующие ограничения:
- SNAT с использованием Балансировщика нагрузки (должен использовать по умолчанию OutboundNAT) имеет "64 порта на IP-адресе узла".
- SNAT в Azure Firewall (отключить OutboundNAT) имеет 2496 портов на каждый общедоступный IP-адрес.
- SNAT по шлюзу NAT (отключить OutboundNAT) имеет 64512 портов на общедоступный IP-адрес.
- Если для приложения недостаточно диапазона портов Брандмауэр Azure, необходимо использовать шлюз NAT.
- Брандмауэр Azure не использует SNAT с сетевыми правилами, если целевой IP-адрес находится в диапазоне частных IP-адресов согласно IANA RFC 1918 или в общем адресном пространстве согласно IANA RFC 6598.
Вручную отключите OutboundNAT для Windows
Вручную отключите OutboundNAT для Windows при создании новых пулов агентов Windows с помощью
az aks nodepool add
команды с флагом--disable-windows-outbound-nat
.Примечание.
Вы можете использовать существующий кластер AKS, но может потребоваться обновить исходящий тип и добавить пул узлов для включения
--disable-windows-outbound-nat
.Следующая команда добавляет пул узлов Windows в существующий кластер AKS, отключив OutboundNAT.
export WIN_NODEPOOL_NAME="win$(head -c 1 /dev/urandom | xxd -p)" az aks nodepool add \ --resource-group $MY_RG \ --cluster-name $MY_AKS \ --name $WIN_NODEPOOL_NAME \ --node-count 3 \ --os-type Windows \ --disable-windows-outbound-nat
Результаты:
{ "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.ContainerService/managedClusters/myNatClusterxxx/agentPools/mynpxxx", "name": "mynpxxx", "osType": "Windows", "provisioningState": "Succeeded", "resourceGroup": "myResourceGroupxxx", "type": "Microsoft.ContainerService/managedClusters/agentPools" }
Следующие шаги
Дополнительные сведения о Шлюзе NAT в Azure см. в статье Что такое NAT виртуальной сети?
Azure Kubernetes Service