Udostępnij przez


Tworzenie zarządzanej przez system lub przypisanej przez użytkownika bramy NAT dla klastra usługi Azure Kubernetes Service (AKS)

Chociaż możesz kierować ruch wychodzący za pośrednictwem usługi Azure Load Balancer, istnieją ograniczenia dotyczące liczby przepływów wychodzących ruchu, które możesz mieć. Usługa Azure NAT Gateway umożliwia maksymalnie 64 512 wychodzących połączeń UDP i TCP na adres IP z maksymalnie 16 adresami IP.

W tym artykule pokazano, jak utworzyć klaster usługi Azure Kubernetes Service (AKS) z zarządzaną bramą NAT oraz bramą NAT przypisaną przez użytkownika na potrzeby ruchu wychodzącego. Pokazano również, jak wyłączyć funkcję OutboundNAT w systemie Windows.

Zanim rozpoczniesz

  • Upewnij się, że używasz najnowszej wersji interfejsu wiersza polecenia platformy Azure.
  • Upewnij się, że używasz platformy Kubernetes w wersji 1.20.x lub nowszej.
  • Zarządzana brama NAT jest niekompatybilna z niestandardowymi sieciami wirtualnymi.

Ważne

W klastrach innych niż prywatne, ruch do serwera API jest kierowany i przetwarzany przez typ wychodzący klastra. Aby zapobiec przetwarzaniu ruchu serwera interfejsu API jako ruchu publicznego, rozważ użycie klastra prywatnego lub zapoznaj się z funkcją integracji z siecią wirtualną serwera interfejsu API.

Tworzenie klastra AKS z zarządzaną bramą NAT

  • Utwórz klaster usługi AKS z nową zarządzaną bramą NAT przy użyciu polecenia az aks create z parametrami --outbound-type managedNATGateway, --nat-gateway-managed-outbound-ip-count i --nat-gateway-idle-timeout. Jeśli chcesz, aby brama translatora adresów sieciowych działała poza określoną strefą dostępności, określ strefę przy użyciu polecenia --zones.
  • Jeśli podczas tworzenia zarządzanej bramy translatora adresów sieciowych nie określono żadnej strefy, brama translatora adresów sieciowych jest wdrażana domyślnie w "bez strefy". Gdy brama NAT nie znajduje się w żadnej strefie, platforma Azure automatycznie umieszcza zasób w wybranej strefie. Aby uzyskać więcej informacji na temat bezstrefowego modelu wdrażania, zobacz brama NAT.
  • Zarządzana brama NAT nie może być używana w wielu strefach dostępności.

Następujące polecenia najpierw tworzą wymaganą grupę zasobów, a następnie klaster usługi AKS z zarządzaną bramą 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"

Wyniki:

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

Wyniki:

{
  "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"
}
  • Zaktualizuj wychodzący adres IP lub limit czasu bezczynności przy użyciu az aks update polecenia z parametrem --nat-gateway-managed-outbound-ip-count or --nat-gateway-idle-timeout .

Poniższy przykład aktualizuje liczbę wychodzących adresów IP zarządzanych przez bramę NAT dla klastra AKS do 5.

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

Wyniki:

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

Tworzenie klastra usługi AKS przy użyciu bramy translatora adresów sieciowych przypisanych przez użytkownika

Ta konfiguracja wymaga użycia własnej sieci (za pośrednictwem rozwiązania Kubenet lub azure CNI) i że brama translatora adresów sieciowych jest wstępnie skonfigurowana w podsieci. Następujące polecenia tworzą wymagane zasoby dla tego scenariusza.

  1. Utwórz grupę zasobów przy użyciu az group create polecenia .

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

    Wyniki:

    {
      "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. Utwórz tożsamość zarządzaną dla uprawnień sieci i zapisz identyfikator do $IDENTITY_ID późniejszego użycia.

    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)
    

    Wyniki:

    /xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myNatClusterIdxxx
    
  3. Utwórz publiczny adres IP bramy translatora adresów az network public-ip create sieciowych przy użyciu polecenia .

    export PIP_NAME="myNatGatewayPip$RANDOM_SUFFIX"
    az network public-ip create \
        --resource-group $MY_RG \
        --name $PIP_NAME \
        --location southcentralus \
        --sku standard
    

    Wyniki:

    {
      "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. Utwórz bramę translatora adresów az network nat gateway create sieciowych przy użyciu polecenia .

    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
    

    Wyniki:

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

    Ważne

    Nie można używać pojedynczego zasobu bramy NAT w różnych strefach dostępności. Aby zapewnić odporność dla stref, zaleca się wdrożenie zasobu bramy NAT w każdej strefie dostępności oraz przypisanie go do podsieci zawierających klastry AKS w każdej strefie. Aby uzyskać więcej informacji na temat tego modelu wdrażania, zobacz Brama NAT dla każdej strefy. Jeśli żadna strefa nie jest skonfigurowana dla bramy NAT, domyślna lokalizacja strefy to "żadna strefa", w której platforma Azure umieszcza bramę NAT w strefie.

  5. Utwórz sieć wirtualną przy użyciu az network vnet create polecenia .

    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 
    

    Wyniki:

    {
      "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. Utwórz podsieć w sieci wirtualnej przy użyciu bramy translatora adresów sieciowych i zapisz identyfikator do $SUBNET_ID późniejszego użycia.

    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)
    

    Wyniki:

    /xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/virtualNetworks/myVnetxxx/subnets/myNatClusterxxx
    
  7. Utwórz klaster usługi AKS przy użyciu podsieci z bramą NAT i tożsamością zarządzaną przy użyciu polecenia 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
    

    Wyniki:

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

Wyłącz OutboundNAT dla systemu Windows

Funkcja Windows OutboundNAT może powodować pewne problemy z połączeniem i komunikacją z zasobnikami usługi AKS. Przykładem problemu jest ponowne użycie portu węzła. W tym przykładzie system Windows OutboundNAT używa portów do tłumaczenia adresu IP zasobnika na adres IP hosta węzła systemu Windows, co może spowodować niestabilne połączenie z usługą zewnętrzną z powodu problemu z wyczerpaniem portów.

System Windows domyślnie włącza funkcję OutboundNAT. Teraz możesz ręcznie wyłączyć funkcję OutboundNAT podczas tworzenia nowych pul agentów systemu Windows.

Wymagania wstępne

  • Istniejący klaster usługi AKS z systemem w wersji 1.26 lub nowszej. Jeśli używasz platformy Kubernetes w wersji 1.25 lub starszej, musisz zaktualizować konfigurację wdrożenia.

Ograniczenia

  • Nie można ustawić typu wychodzącego klastra na LoadBalancer. Można ustawić dla bramy translatora adresów sieciowych lub trasy zdefiniowanej przez użytkownika:
    • Bramka NAT: Bramkę NAT można automatycznie obsługiwać i jest wydajniejsza niż Standardowy Load Balancer. W przypadku tej opcji mogą zostać naliczone dodatkowe opłaty.
    • Trasa zdefiniowana przez użytkownika (UserDefinedRouting): podczas konfigurowania reguł routingu należy pamiętać o ograniczeniach portów.
    • Jeśli musisz przełączyć się z równoważnika obciążenia na bramę NAT, możesz dodać bramę NAT do sieci wirtualnej lub uruchomić az aks upgrade, aby zaktualizować typ ruchu wychodzącego.

Uwaga

UserDefinedRouting ma następujące ograniczenia:

  • SNAT by Load Balancer (musi używać domyślnej wartości OutboundNAT) ma "64 porty na adresie IP hosta".
  • SNAT by Azure Firewall (disable OutboundNAT) ma 2496 portów na publiczny adres IP.
  • SNAT by NAT Gateway (disable OutboundNAT) ma 64512 portów na publiczny adres IP.
  • Jeśli zakres portów usługi Azure Firewall nie jest wystarczający dla swojej aplikacji, należy użyć NAT Gateway.
  • Usługa Azure Firewall nie wykonuje SNAT w przypadku reguł sieciowych, gdy docelowy adres IP znajduje się w prywatnym zakresie adresów IP zgodnie z IANA RFC 1918 lub we współużytkowanej przestrzeni adresowej zgodnie z IANA RFC 6598.

Ręczne wyłączanie OutboundNAT dla systemu Windows

  • Ręcznie wyłącz funkcję OutboundNAT dla systemu Windows podczas tworzenia nowych pul agentów systemu Windows przy użyciu az aks nodepool add polecenia z flagą --disable-windows-outbound-nat .

    Uwaga

    Możesz użyć istniejącego klastra AKS, ale być może trzeba będzie zaktualizować typ wyjściowy i dodać pulę węzłów, aby włączyć --disable-windows-outbound-nat.

    Następujące polecenie dodaje pulę węzłów systemu Windows do istniejącego klastra usługi AKS, wyłączając funkcję 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
    

    Wyniki:

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

Następne kroki

Aby uzyskać więcej informacji na temat Azure NAT Gateway, zobacz Azure NAT Gateway.