Compartilhar via


Criar um gateway da NAT gerenciado ou atribuído pelo usuário para o cluster do AKS (Serviço de Kubernetes do Azure)

Embora você possa rotear o tráfego de saída por meio de um Azure Load Balancer, há limitações no número de fluxos de tráfego de saída que você pode ter. O Gateway da NAT do Azure permite até 64.512 fluxos de tráfego UDP e TCP de saída por endereço IP com no máximo 16 endereços IP.

Este artigo mostra como criar um cluster do Serviço de Kubernetes do Azure (AKS) com um gateway da NAT gerenciado e um gateway da NAT atribuído pelo usuário para tráfego de saída. Ele também mostra como desabilitar OutboundNAT no Windows.

Antes de começar

  • Verifique se você está usando a última versão da CLI do Azure.
  • Verifique se você está usando o Kubernetes versão 1.20.x ou superior.
  • O Gateway da 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 por meio do tipo de saída de clusters. Para impedir que o tráfego do servidor de API seja processado como um tráfego público, considere o uso de um cluster privado ou confira o recurso Integração VNET do servidor de API.

Criar um cluster do AKS com um gateway da NAT gerenciado

  • Crie um cluster do AKS com um novo gateway da NAT gerenciado usando o comando az aks create com os parâmetros --outbound-type managedNATGateway, --nat-gateway-managed-outbound-ip-count e --nat-gateway-idle-timeout. Se você quiser que o gateway de NAT opere em uma zona de disponibilidade específica, especifique a zona usando --zones.
  • Se nenhuma zona for especificada quando você criar um gateway de NAT gerenciado, o gateway de NAT será implantado em "nenhuma zona" por padrão. Quando o gateway NAT não é 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 da NAT não zonal.
  • Um recurso de gateway de NAT gerenciado não pode ser utilizado em várias zonas de disponibilidade.

Os comandos a seguir primeiro criam o grupo de recursos necessário e, em seguida, o cluster do 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 comando az aks update com o parâmetro --nat-gateway-managed-outbound-ip-count ou --nat-gateway-idle-timeout .

O exemplo a seguir atualiza para 5 a contagem de IPs de saída gerenciados do gateway da NAT para o cluster do AKS.

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 do AKS com um gateway da NAT atribuído pelo usuário

Essa configuração requer a rede bring-your-own (via Kubenet ou CNI do Azure) e que o Gateway da NAT seja pré-configurado na sub-rede. Os comandos a seguir criam os recursos necessários para esse cenário.

  1. Crie um grupo de recursos usando o comando az group create.

    export RANDOM_SUFFIX=$(openssl rand -hex 3)
    export MY_RG="myResourceGroup$RANDOM_SUFFIX"
    az group create --name $MY_RG --location southcentralus
    

    Resultados:

    {
      "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx",
      "location": "southcentralus",
      "managedBy": null,
      "name": "myResourceGroupxxx",
      "properties": {
        "provisioningState": "Succeeded"
      },
      "tags": null,
      "type": "Microsoft.Resources/resourceGroups"
    }
    
  2. Crie uma identidade gerenciada para permissões de rede e armazene a ID em $IDENTITY_ID para uso 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/myNatClusterIdxxx
    
  3. Criar um IP público para o Gateway da NAT usando o comando 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
    

    Resultados:

    {
      "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",
        ...
      }
    }
    
  4. Criar um Gateway da NAT usando o comando 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
    

    Resultados:

    {
      "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

    Para garantir a redundância de zona, é recomendável implantar um recurso de gateway NAT StandardV2, que se estende por várias zonas de disponibilidade em uma região. Isso garante a conectividade de saída contínua mesmo se uma única zona falhar. Para obter mais detalhes sobre o gateway NAT StandardV2 e seus benefícios, consulte o Gateway NAT StandardV2. Em comparação, um recurso de gateway nat padrão fornece resiliência somente dentro da zona de disponibilidade na qual ele é implantado.

  5. Criar uma rede virtual usando o comando 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 
    

    Resultados:

    {
      "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",
        ...
      }
    }
    
  6. Crie uma sub-rede na rede virtual com o Gateway da NAT e armazene a ID em $SUBNET_ID para uso 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/myNatClusterxxx
    
  7. Crie um cluster do AKS usando a sub-rede com o Gateway da NAT e a identidade gerenciada usando o comando 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
    

    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"
    }
    

Desabilitar OutboundNAT para Windows

O Windows OutboundNAT pode causar determinados problemas de conexão e comunicação com seus pods do AKS. Um exemplo de problema é a reutilização da porta do nó. Neste exemplo, a OutboundNAT do Windows usa as portas para converter o IP do pod no 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 esgotamento de porta.

O Windows habilita o OutboundNAT por padrão. Agora você pode desabilitar manualmente o OutboundNAT quando cria pools de agentes do Windows.

Pré-requisitos

Limitações

  • Não é possível definir o tipo de saída do cluster como LoadBalancer. Você pode definir como Gateway da NAT ou UDR:
    • Gateway da NAT: o Gateway da NAT pode lidar automaticamente com a conexão da NAT e é mais eficiente do que o Standard Load Balancer. Você poderá gerar custos extras com essa opção.
    • UDR (UserDefinedRouting): tenha em mente as limitações de porta ao configurar as regras de roteamento.
    • Caso você precise alternar de um balanceador de carga para o Gateway da NAT, adicione um gateway da NAT à VNet ou execute az aks upgrade para atualizar o tipo de saída.

Observação

O UserDefinedRouting tem as seguintes limitações:

  • O SNAT do balanceador de carga tem “64 portas no IP do host” (é necessário usar a OutboundNAT padrão).
  • O SNAT do Firewall do Azure tem 2.496 portas por IP público (é necessário desabilitar a OutboundNAT).
  • O SNAT do Gateway da NAT tem 64.512 portas por IP público (é necessário desabilitar a OutboundNAT).
  • Se o intervalo de portas do Firewall do Azure não for suficiente para seu aplicativo, use o Gateway da NAT.
  • O Firewall do Azure não aceita o SNAT com regras de rede quando o endereço IP de destino está em um intervalo de endereços IP privado de acordo com o IANA RFC 1918 ou em um espaço de endereço compartilhado de acordo com o IANA RFC 6598.

Desabilitar manualmente o OutboundNAT para Windows

  • Desabilite manualmente o OutboundNAT para Windows ao criar novos pools de agentes do Windows usando o comando az aks nodepool add com o sinalizador --disable-windows-outbound-nat.

    Observação

    Você pode usar um cluster do AKS existente, mas talvez precise atualizar o tipo de saída e adicionar um pool de nós para habilitar o --disable-windows-outbound-nat.

    O comando a seguir adiciona um pool de nós do Windows a um cluster do AKS existente, desabilitando 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
    

    Resultados:

    {
      "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óximas etapas

Para obter mais informações sobre o Gateway da NAT do Azure, confira Gateway da NAT do Azure.