Condividi tramite


Creare un gateway NAT gestito o assegnato dall'utente per il cluster del servizio Azure Kubernetes

Anche se è possibile instradare il traffico in uscita tramite un servizio di bilanciamento del carico di Azure: esistono limitazioni per il numero di flussi in uscita del traffico che è possibile avere. Il gateway NAT di Azure consente fino a 64.512 flussi di traffico UDP e TCP in uscita per ogni indirizzo IP con un massimo di 16 indirizzi IP.

Questo articolo illustra come creare un cluster del servizio Azure Kubernetes con un gateway NAT gestito e un gateway NAT assegnato dall'utente per il traffico in uscita. Illustra anche come disabilitare OutboundNAT in Windows.

Operazioni preliminari

  • Assicurarsi di usare la versione più recente dell’interfaccia della riga di comando di Azure.
  • Assicurarsi di usare Kubernetes versione 1.20.x o successiva.
  • Il gateway NAT gestito non è compatibile con le reti virtuali personalizzate.

Importante

Nei cluster non privati il traffico del cluster del server API viene instradato ed elaborato tramite il tipo in uscita dei cluster. Per evitare che il traffico del server API venga elaborato come traffico pubblico, prendere in considerazione l'uso di un cluster privato o consultare la funzionalità Integrazione rete virtuale del server API.

Creare un cluster del servizio Azure Kubernetes con un gateway NAT gestito

  • Creare un cluster del servizio Azure Kubernetes con un nuovo gateway NAT gestito usando il comando az aks create con i parametri --outbound-type managedNATGateway, --nat-gateway-managed-outbound-ip-count e --nat-gateway-idle-timeout. Se si vuole che il gateway NAT funzioni da una zona di disponibilità specifica, specificare la zona usando --zones.
  • Se non viene specificata alcuna zona durante la creazione di un gateway NAT gestito, il gateway NAT viene distribuito in "nessuna zona" per impostazione predefinita. Quando il gateway NAT viene inserito in nessuna zona, Azure inserisce la risorsa in una zona. Per altre informazioni sul modello di distribuzione non di zona, vedere gateway NAT non di zona.
  • Non è possibile usare una risorsa gateway NAT gestita in più zone di disponibilità.

I comandi seguenti creano prima il gruppo di risorse necessario, quindi il cluster AKS con un gateway NAT gestito.

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"

Risultati:

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

Risultati:

{
  "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"
}
  • Aggiornare l'indirizzo IP in uscita o il timeout di inattività usando il comando az aks update con il parametro --nat-gateway-managed-outbound-ip-count o --nat-gateway-idle-timeout.

L'esempio seguente aggiorna a 5 il numero di IP pubblici in uscita gestiti dal gateway NAT per il cluster AKS.

az aks update \
    --resource-group $MY_RG \
    --name $MY_AKS \
    --nat-gateway-managed-outbound-ip-count 5

Risultati:

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

Creare un cluster del servizio Azure Kubernetes con un gateway NAT assegnato dall'utente

Questa configurazione richiede una rete bring-your-own (tramite Kubenet o Azure CNI) e che il gateway NAT sia preconfigurato nella subnet. I comandi seguenti creano le risorse necessarie per questo scenario.

  1. Creare un gruppo di risorse usando il 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
    

    Risultati:

    {
      "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. Creare un'identità gestita per le autorizzazioni di rete e archiviare l'ID in $IDENTITY_ID per usarlo in un secondo momento.

    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)
    

    Risultati:

    /xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myNatClusterIdxxx
    
  3. Creare un indirizzo IP pubblico per il gateway NAT usando il 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
    

    Risultati:

    {
      "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. Creare il gateway NAT usando il 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
    

    Risultati:

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

    Una singola risorsa gateway NAT non può essere usata in più zone di disponibilità. Per garantire la resilienza della zona, è consigliabile distribuire una risorsa gateway NAT in ogni zona di disponibilità e assegnare a subnet contenenti cluster del servizio Azure Kubernetes in ogni zona. Per altre informazioni su questo modello di distribuzione, vedere Gateway NAT per ogni zona. Se non è configurata alcuna zona per il gateway NAT, il posizionamento predefinito della zona è "nessuna zona", in cui Il gateway NAT viene inserito automaticamente in una zona.

  5. Creare una rete virtuale usando il 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 
    

    Risultati:

    {
      "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. Creare una subnet nella rete virtuale usando il gateway NAT e archiviare l'ID per $SUBNET_ID per un uso successivo.

    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)
    

    Risultati:

    /xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/virtualNetworks/myVnetxxx/subnets/myNatClusterxxx
    
  7. Creare un cluster del servizio Azure Kubernetes usando la subnet con il gateway NAT e l'identità gestita usando il 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
    

    Risultati:

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

Disabilitare OutboundNAT per Windows

Windows OutboundNAT può causare determinati problemi di connessione e comunicazione con i pod del servizio Azure Kubernetes. Un problema di esempio è il riutilizzo della porta del nodo. In questo esempio, Windows OutboundNAT usa le porte per convertire l'IP del pod nell'IP host del nodo Windows, che può causare una connessione instabile al servizio esterno a causa di un problema di esaurimento delle porte.

Windows abilita OutboundNAT per impostazione predefinita. È ora possibile disabilitare manualmente OutboundNAT durante la creazione di nuovi pool di agenti Windows.

Prerequisiti

Limiti

  • Non è possibile impostare il tipo in uscita del cluster su LoadBalancer. È possibile impostarlo su Gateway Nat o route definita dall'utente:
    • Gateway NAT: il gateway NAT può gestire automaticamente la connessione NAT ed è più potente di Load Balancer Standard. È possibile che vengano addebitati costi aggiuntivi con questa opzione.
    • Route definita dall'utente (UserDefinedRouting): è necessario tenere presenti le limitazioni delle porte durante la configurazione delle regole di routing.
    • Se è necessario passare da un servizio di bilanciamento del carico al gateway NAT, è possibile aggiungere un gateway NAT nella rete virtuale o eseguire az aks upgrade per aggiornare il tipo in uscita.

Nota

UserDefinedRouting presenta le limitazioni seguenti:

  • SNAT di Load Balancer (deve utilizzare l’OutboundNAT predefinito) ha "64 porte sull'IP dell'host".
  • SNAT di Azure Firewall (disabilitare OutboundNAT) ha 2496 porte per IP pubblico.
  • SNAT di NAT Gateway (disattivare OutboundNAT) ha 64512 porte per IP pubblico.
  • Se l'intervallo di porte di Firewall di Azure non è sufficiente per l'applicazione, è necessario usare il gateway NAT.
  • Il Firewall di Azure non esegue SNAT con regole di rete quando l'indirizzo IP di destinazione si trova in un intervallo di indirizzi IP privati per IANA RFC 1918 o spazio indirizzi condiviso per IANA RFC 6598.

Disabilitare manualmente OutboundNAT per Windows

  • Disabilitare manualmente OutboundNAT per Windows durante la creazione di nuovi pool di agenti di Windows usando il comando az aks nodepool add con il flag --disable-windows-outbound-nat.

    Nota

    È possibile usare un cluster del servizio Azure Kubernetes esistente, ma potrebbe essere necessario aggiornare il tipo in uscita e aggiungere un pool di nodi per abilitare --disable-windows-outbound-nat.

    Il comando seguente aggiunge un pool di nodi Windows a un cluster del servizio Azure Kubernetes esistente, disabilitando 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
    

    Risultati:

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

Passaggi successivi

Per altre informazioni sul gateway NAT di Azure, vedere gateway NAT di Azure.