次の方法で共有


Azure Kubernetes Service (AKS) クラスターのマネージドまたはユーザー割り当て NAT ゲートウェイを作成する

Azure Load Balancer 経由でエグレス トラフィックをルーティングできますが、使用できる送信フローのトラフィック数には制限があります。 Azure NAT Gateway では、IP アドレスあたり最大で 64,512 個の送信 UDP および TCP トラフィック フローが許容され、最大で 16 個の IP アドレスを使用できます。

この記事では、エグレス トラフィック用のマネージド NAT ゲートウェイとユーザー割り当て NAT ゲートウェイを含む Azure Kubernetes Service (AKS) クラスターを作成する方法について説明します。 Windows で OutboundNAT を無効にする方法についても説明します。

開始する前に

  • 最新バージョンの Azure CLI を使用していることを確認してください。
  • Kubernetes バージョン 1.20.x 以降を使用していることを確認します。
  • マネージド NAT ゲートウェイは、カスタム仮想ネットワークと互換性がありません。

重要

公開クラスターでは、API サーバー クラスターのトラフィックは、クラスターのアウトバウンド タイプを通じてルーティングされ、処理されます。 API サーバー トラフィックがパブリック トラフィックとして処理されることを防ぐには、プライベート クラスターの使用を検討するか、API Server VNet 統合機能を確認してください。

マネージド NAT Gateway を使用して AKS クラスターを作成する

  • az aks create--outbound-type managedNATGateway、および --nat-gateway-managed-outbound-ip-count パラメーターを指定して --nat-gateway-idle-timeout コマンドを使用して、新しいマネージド NAT ゲートウェイで AKS クラスターを作成します。 NAT ゲートウェイを特定の可用性ゾーンから操作する場合は、--zones を使用してゾーンを指定します。
  • マネージド NAT ゲートウェイの作成時にゾーンが指定されていない場合、NAT ゲートウェイは既定で "ゾーンなし" にデプロイされます。 NAT ゲートウェイがゾーンに配置されていない場合、Azure はリソースをゾーンに配置します。 ゾーンなしのデプロイ モデルの詳細については、ゾーンなしの NAT ゲートウェイに関する記事を参照してください。
  • マネージド NAT ゲートウェイ リソースは複数の可用性ゾーンで使用できません。

次のコマンドは、最初に必要なリソース グループを作成し、次にマネージド NAT ゲートウェイを持つ AKS クラスターを作成します。

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"
}
  • az aks update または --nat-gateway-managed-outbound-ip-count パラメーターを指定して --nat-gateway-idle-timeout コマンドを使用して、送信 IP アドレスまたはアイドル タイムアウトを更新します。

次の例では、AKS クラスターの NAT ゲートウェイマネージド送信 IP 数を 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"
}

ユーザー割り当て NAT Gateway を使用して AKS クラスターを作成する

この構成は、独自のネットワークを (Kubenet または Azure CNI 経由で) 持ち込むことと、NAT ゲートウェイがサブネットであらかじめ構成されていることを必要とします。 以下のコマンドを使用すると、このシナリオに必要なリソースが作成されます。

  1. 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"
    }
    
  2. ネットワークのアクセス許可のためのマネージド ID を作成し、後で使用できるように ID を $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
    
  3. az network public-ip create コマンドを使用して、NAT ゲートウェイのパブリック IP を作成します。

    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",
        ...
      }
    }
    
  4. az network nat gateway create コマンドを使用して、NAT ゲートウェイを作成します。

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

    重要

    1 つの NAT ゲートウェイ リソースを複数の可用性ゾーンで使用することはできません。 ゾーンの回復性を確保するには、NAT ゲートウェイ リソースを各可用性ゾーンにデプロイし、各ゾーン内の AKS クラスターを含むサブネットに割り当てることをお勧めします。 このデプロイ モデルの詳細については、各ゾーンの NAT ゲートウェイに関する記事を参照してください。 NAT ゲートウェイ用にゾーンが構成されていない場合、既定のゾーン配置は "ゾーンなし" で、その場合、Azure によって NAT ゲートウェイがゾーンに配置されます。

  5. 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",
        ...
      }
    }
    
  6. NAT ゲートウェイを使用して仮想ネットワークにサブネットを作成し、後で使用できるように ID を $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
    
  7. az aks create コマンドを使用して、NAT ゲートウェイがあるサブネットとマネージド ID を使用する AKS クラスターを作成します。

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

Windows の OutboundNAT を無効にする

Windows OutboundNAT が原因で、AKS ポッドとの特定の接続と通信で問題が発生する可能性があります。 問題問題の一例として、ノード ポートの再利用があります。 この例では、Windows OutboundNAT で、ポッド IP を Windows ノード ホスト IP に変換するためにポートが使用されるため、ポートの枯渇の問題が原因で外部サービスへの接続が不安定になる可能性があります。

Windows では、既定で OutboundNAT が有効になります。 新しい Windows エージェント プールを作成するとき、OutboundNAT を手動で無効にできます。

前提条件

  • v1.26 以上の既存の AKS クラスター。 Kubernetes バージョン 1.25 以前を使用している場合は、デプロイ構成を更新する必要があります。

制限事項

  • クラスターの送信の種類を LoadBalancer に設定することはできません。 これは、Nat Gateway または UDR に設定できます。
    • Nat Gateway: Nat Gateway は、NAT 接続を自動的に処理でき、Standard Load Balancer よりも強力です。 このオプションを使用すると、追加料金が発生する場合があります。
    • UDR (UserDefinedRouting): ルーティング規則を構成する場合は、ポートの制限事項に留意する必要があります。
    • ロード バランサーから NAT Gateway に切り替える必要がある場合は、NAT Gateway を VNet に追加するか、az aks upgrade を実行して送信の種類を更新できます。

UserDefinedRouting には次の制限があります。

  • Load Balancer による SNAT (既定の OutboundNAT を使用する必要があります) には、"ホスト IP 上に 64 ポート" があります。
  • Azure Firewall による SNAT (OutboundNAT を無効にする) には、パブリック IP あたり 2,496 ポートがあります。
  • NAT Gateway による SNAT (OutboundNAT を無効にする) には、パブリック IP あたり 64,512 ポートがあります。
  • Azure Firewall のポート範囲がアプリケーションに十分ではない場合、NAT Gateway を使用する必要があります。
  • 宛先の IP アドレスが IANA RFC 1918 に基づくプライベート IP アドレス範囲、または IANA RFC 6598 に基づく共有アドレス空間内にある場合、Azure Firewall では、ネットワーク ルールによる SNAT は行われません。

Windows の OutboundNAT を手動で無効にする

  • az aks nodepool add コマンドを使用して新しい Windows エージェント プールを作成するときに、--disable-windows-outbound-nat フラグを指定して Windows の OutboundNAT を手動で無効にします。

    既存の AKS クラスターを使用できますが、送信の種類を更新し、ノード プールを追加して --disable-windows-outbound-nat を有効にすることが必要な合があります。

    次のコマンドは、既存の AKS クラスターに Windows ノード プールを追加し、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 Gateway の詳細については、Azure NAT Gateway に関する記事を参照してください。