Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Embora você possa rotear o tráfego de saída por meio de um Balanceador de Carga do Azure, há limitações no número de fluxos de saída de tráfego que você pode ter. O Gateway NAT do Azure permite até 64.512 fluxos de tráfego UDP e TCP de saída por endereço IP com um máximo de 16 endereços IP.
Este artigo mostra como criar um cluster do Serviço Kubernetes do Azure (AKS) com um gateway NAT gerenciado e um gateway NAT atribuído pelo usuário para tráfego de saída. Ele também mostra como desativar OutboundNAT no Windows.
Antes de começar
- Certifique-se de que está a utilizar a versão mais recente da CLI do Azure.
- Verifique se você está usando o Kubernetes versão 1.20.x ou superior.
- O gateway NAT gerenciado é incompatível com redes virtuais personalizadas.
Importante
Em clusters não privados, o tráfego de cluster do servidor de API é roteado e processado através do tipo de saída de clusters. Para evitar que o tráfego do servidor de API seja processado como tráfego público, considere o uso de um cluster privado ou confira o recurso de integração de rede virtual do servidor de API.
Criar um cluster AKS com um gateway NAT gerenciado
- Crie um cluster AKS com um novo gateway NAT gerenciado usando o
az aks createcomando com os--outbound-type managedNATGatewayparâmetros ,--nat-gateway-managed-outbound-ip-counte--nat-gateway-idle-timeout. Se desejar que o gateway NAT opere fora de uma zona de disponibilidade específica, especifique a zona usando--zones. - Se nenhuma zona for especificada ao criar um gateway NAT gerenciado, o gateway NAT será implantado em "nenhuma zona" por padrão. Quando o gateway NAT é colocado em nenhuma zona, o Azure coloca o recurso em uma zona para você. Para obter mais informações sobre o modelo de implantação não zonal, consulte Gateway NAT não zonal.
- Um recurso de gateway NAT gerenciado não pode ser usado em várias zonas de disponibilidade.
Os comandos a seguir criam primeiro o grupo de recursos necessário e, em seguida, o cluster AKS com um gateway NAT gerenciado.
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"
Resultados:
{
"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
Resultados:
{
"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"
}
- Atualize o endereço IP de saída ou o tempo limite ocioso usando o
az aks updatecomando com o--nat-gateway-managed-outbound-ip-countparâmetro or--nat-gateway-idle-timeout.
O exemplo a seguir atualiza a contagem de IP de saída gerenciada pelo gateway NAT para o cluster AKS para 5.
az aks update \
--resource-group $MY_RG \
--name $MY_AKS \
--nat-gateway-managed-outbound-ip-count 5
Resultados:
{
"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"
}
Criar um cluster AKS com um gateway NAT atribuído pelo usuário
Essa configuração requer trazer sua própria rede (via Kubenet ou Azure CNI) e que o gateway NAT esteja pré-configurado na sub-rede. Os comandos a seguir criam os recursos necessários para esse cenário.
Crie um grupo de recursos usando o
az group createcomando.export RANDOM_SUFFIX=$(openssl rand -hex 3) export MY_RG="myResourceGroup$RANDOM_SUFFIX" az group create --name $MY_RG --location southcentralusResultados:
{ "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx", "location": "southcentralus", "managedBy": null, "name": "myResourceGroupxxx", "properties": { "provisioningState": "Succeeded" }, "tags": null, "type": "Microsoft.Resources/resourceGroups" }Crie uma identidade gerenciada para permissões de rede e armazene a ID para
$IDENTITY_IDuso posterior.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)Resultados:
/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myNatClusterIdxxxCrie um IP público para o gateway NAT usando o
az network public-ip createcomando.export PIP_NAME="myNatGatewayPip$RANDOM_SUFFIX" az network public-ip create \ --resource-group $MY_RG \ --name $PIP_NAME \ --location southcentralus \ --sku standardResultados:
{ "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", ... } }Crie o gateway NAT usando o
az network nat gateway createcomando.export NATGATEWAY_NAME="myNatGateway$RANDOM_SUFFIX" az network nat gateway create \ --resource-group $MY_RG \ --name $NATGATEWAY_NAME \ --location southcentralus \ --public-ip-addresses $PIP_NAMEResultados:
{ "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" }Importante
Um único recurso de gateway NAT não pode ser usado em várias zonas de disponibilidade. Para garantir a resiliência da zona, recomenda-se implantar um recurso de gateway NAT em cada zona de disponibilidade e atribuir a sub-redes contendo clusters AKS em cada zona. Para obter mais informações sobre esse modelo de implantação, consulte Gateway NAT para cada zona. Se nenhuma zona estiver configurada para gateway NAT, o posicionamento de zona padrão será "sem zona", no qual o Azure coloca o gateway NAT em uma zona para você.
Crie uma rede virtual usando o
az network vnet createcomando.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/20Resultados:
{ "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", ... } }Crie uma sub-rede na rede virtual usando o gateway NAT e armazene a ID para
$SUBNET_IDuso posterior.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)Resultados:
/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/virtualNetworks/myVnetxxx/subnets/myNatClusterxxxCrie um cluster AKS usando a sub-rede com o gateway NAT e a identidade gerenciada usando o
az aks createcomando.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-keysResultados:
{ "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" }
Desativar OutboundNAT para Windows
O Windows OutboundNAT pode causar certos problemas de conexão e comunicação com seus pods AKS. Um exemplo de problema é a reutilização da porta do nó. Neste exemplo, o Windows OutboundNAT usa portas para traduzir o IP do pod para o IP do host do nó do Windows, o que pode causar uma conexão instável com o serviço externo devido a um problema de exaustão da porta.
O Windows habilita OutboundNAT por padrão. Agora você pode desabilitar manualmente OutboundNAT ao criar novos pools de agentes do Windows.
Pré-requisitos
- Cluster AKS existente com v1.26 ou superior. Se você estiver usando o Kubernetes versão 1.25 ou anterior, precisará atualizar sua configuração de implantação.
Limitações
- Não é possível definir o tipo de saída do cluster como LoadBalancer. Você pode defini-lo como Gateway NAT ou UDR:
- NAT Gateway: O NAT Gateway pode lidar automaticamente com a conexão NAT e é mais poderoso do que o Standard Load Balancer. Poderá incorrer em custos adicionais com esta opção.
- UDR (UserDefinedRouting): Você deve ter em mente as limitações de porta ao configurar regras de roteamento.
- Se você precisar alternar de um balanceador de carga para o gateway NAT, poderá adicionar um gateway NAT à rede virtual ou executar
az aks upgradepara atualizar o tipo de saída.
Nota
UserDefinedRouting tem as seguintes limitações:
- SNAT by Load Balancer (deve usar o padrão OutboundNAT) tem "64 portas no IP do host".
- SNAT by Azure Firewall (desabilitar OutboundNAT) tem 2496 portas por IP público.
- SNAT by NAT Gateway (disable OutboundNAT) tem 64512 portas por IP público.
- Se o intervalo de portas do Firewall do Azure não for suficiente para seu aplicativo, você precisará usar o Gateway NAT.
- O Firewall do Azure não faz SNAT com regras de Rede quando o endereço IP de destino está em um intervalo de endereços IP privados por IANA RFC 1918 ou espaço de endereçamento compartilhado por IANA RFC 6598.
Desativar manualmente OutboundNAT para Windows
Desative manualmente OutboundNAT para Windows ao criar novos pools de agentes do Windows usando o
az aks nodepool addcomando com o--disable-windows-outbound-natsinalizador.Nota
Você pode usar um cluster AKS existente, mas talvez seja necessário atualizar o tipo de saída e adicionar um pool de nós para habilitar
--disable-windows-outbound-nato .O comando a seguir adiciona um pool de nós do Windows a um cluster AKS existente, desativando 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-natResultados:
{ "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" }
Próximos passos
Para obter mais informações sobre o Azure NAT Gateway, consulte Azure NAT Gateway.