次の方法で共有


Azure Kubernetes Service (AKS) でデュアル スタック kubenet ネットワークを使用する

kubernet ネットワークとデュアルスタック Azure 仮想ネットワークを使用する場合、AKS クラスターをデュアルスタック モードでデプロイできます。 この構成では、ノードで、Azure 仮想ネットワーク サブネットから IPv4 と IPv6 の両方のアドレスを受け取ります。 ポッドでは、ノードの Azure 仮想ネットワーク サブネットとは論理的に異なるアドレス空間から IPv4 と IPv6 の両方のアドレスを受け取ります。 その後、ポッドで Azure 仮想ネットワークのリソースに到達できるように、ネットワーク アドレス変換 (NAT) が構成されます。 トラフィックの送信元 IP アドレスは、同じファミリのノードのプライマリ IP アドレス (IPv4 から IPv4 および IPv6 から IPv6) に NAT 処理されます。

この記事では、AKS クラスターでデュアルスタック ネットワークを使用する方法を示します。 ネットワークのオプションと考慮事項について詳しくは、Kubernetes および AKS のネットワークの概念に関する記事をご覧ください。

制限事項

  • Azure ルート テーブルには、テーブルあたり 400 ルートというハード制限があります
    • デュアルスタック クラスターの各ノードには 2 つのルート (IP アドレス ファミリごとに 1 つずつ) が必要であるため、デュアルスタック クラスターは 200 ノードに制限されます
  • Azure Linux ノード プールでは、サービス オブジェクトは externalTrafficPolicy: Local でのみサポートされます。
  • Azure 仮想ネットワークとポッド CIDR では、デュアルスタック ネットワークが必要です。
    • 単一スタック IPv6 のみは、ノードまたはポッドの IP アドレスではサポートされていません。 サービスは IPv4 または IPv6 でプロビジョニングできます。
  • 次の機能は、デュアルスタック kubenet ではサポートされていません

前提条件

  • kubernet ネットワークの構成のすべての前提条件が適用されます。
  • AKS デュアルスタック クラスターには Kubernetes バージョン v 1.21.2 以上が必要です。 v1.22.2 以降をお勧めします。
  • Azure Resource Manager テンプレートを使用する場合は、スキーマ バージョン 2021-10-01 が必要です。

Kubernetes のデュアルスタック ネットワークの概要

Kubernetes v.1.23 では、ポッドとサービス ネットワークを含む、IPv4/IPv6 デュアルスタック クラスターに対して、安定したアップストリーム サポートが提供されます。 ノードとポッドには常に IPv4 と IPv6 の両方のアドレスが割り当てられますが、サービスはデュアルスタックまたはいずれかのアドレス ファミリで単一スタックにすることができます。

AKS により、デュアルスタック ネットワークに必要なサポート サービスが構成されます。 この構成には次のものが含まれます。

  • デュアルスタック仮想ネットワークの構成 (マネージド仮想ネットワークを使用している場合)。
  • IPv4 および IPv6 ノードとポッド アドレス。
  • IPv4 と IPv6 の両方のトラフィックのアウトバウンド規則。
  • IPv4 および IPv6 サービス用のロード バランサーの設定。

Note

ユーザー定義ルーティングの送信の種類でデュアルスタックを使う場合、IPv6 トラフィックをインターネットに到達させる必要があるかどうかに応じて、IPv6 用の既定のルートを選択できます。 IPv6 用の既定のルートがない場合、クラスターの作成時に警告は表示されますが、クラスターの作成は妨げられません。

デュアルスタック クラスターのデプロイ

デュアルスタック クラスターをサポートするために、次の属性が提供されます。

  • --ip-families: クラスターで有効にする IP ファミリのコンマ区切りリストを取得します。
    • ipv4 または ipv4,ipv6 のみがサポートされています。
  • --pod-cidrs: ポッド IP を割り当てる CIDR 表記 IP 範囲のコンマ区切りリストを取得します。
    • このリスト内の範囲の数と順序は、--ip-families に指定されている値と一致する必要があります。
    • 値が指定されていない場合は、既定値の 10.244.0.0/16,fd12:3456:789a::/64 が使用されます。
  • --service-cidrs: サービス IP を割り当てる CIDR 表記 IP 範囲のコンマ区切りリストを取得します。
    • このリスト内の範囲の数と順序は、--ip-families に指定されている値と一致する必要があります。
    • 値が指定されていない場合は、既定値の 10.0.0.0/16,fd12:3456:789a:1::/108 が使用されます。
    • --service-cidrs に割り当てられている IPv6 サブネットは、/108 を超えることはできません。

デュアルスタック AKS クラスターをデプロイする

  1. az group create コマンドを使用して、クラスター用の Azure リソース グループを作成します。

    az group create --location <region> --name <resourceGroupName>
    
  2. --ip-families パラメーターが ipv4,ipv6 に設定された az aks create コマンドを使用して、デュアルスタック AKS クラスターを作成します。

    az aks create \
        --location <region> \
        --resource-group <resourceGroupName> \
        --name <clusterName> \
        --ip-families ipv4,ipv6 \
        --generate-ssh-keys
    
  3. クラスターが作成されたら、az aks get-credentials コマンドを使用してクラスター管理者の資格情報を取得します。

    az aks get-credentials --resource-group <resourceGroupName> --name <clusterName>
    

ノードを調べて両方の IP ファミリを確認する

  • クラスターがプロビジョニングされたら、kubectl get nodes コマンドを使用して、ノードにデュアルスタック ネットワークがプロビジョニングされていることを確認します。

    kubectl get nodes -o=custom-columns="NAME:.metadata.name,ADDRESSES:.status.addresses[?(@.type=='InternalIP')].address,PODCIDRS:.spec.podCIDRs[*]"
    

    kubectl get nodes コマンドからの出力には、ノードに IPv4 と IPv6 の両方のアドレスとポッドの IP 割り当て領域があることが示されます。

    NAME                                ADDRESSES                           PODCIDRS
    aks-nodepool1-14508455-vmss000000   10.240.0.4,2001:1234:5678:9abc::4   10.244.0.0/24,fd12:3456:789a::/80
    aks-nodepool1-14508455-vmss000001   10.240.0.5,2001:1234:5678:9abc::5   10.244.1.0/24,fd12:3456:789a:0:1::/80
    aks-nodepool1-14508455-vmss000002   10.240.0.6,2001:1234:5678:9abc::6   10.244.2.0/24,fd12:3456:789a:0:2::/80
    

ワークロードの例を作成する

クラスターが作成されたら、ワークロードをデプロイできます。 この記事では、NGINX Web サーバーのワークロードのデプロイ例について説明します。

NGINX Web サーバーをデプロイする

  1. kubectl create deployment nginx コマンドを使用して、NGINX Web サーバーを作成します。

    kubectl create deployment nginx --image=nginx:latest --replicas=3
    
  2. kubectl get pods コマンドを使用して、ポッド リソースを表示します。

    kubectl get pods -o custom-columns="NAME:.metadata.name,IPs:.status.podIPs[*].ip,NODE:.spec.nodeName,READY:.status.conditions[?(@.type=='Ready')].status"
    

    ポッドに IPv4 と IPv6 の両方のアドレスがあることが出力に示されます。 準備ができるまで、ポッドの IP アドレスは表示されません。

    NAME                     IPs                                NODE                                READY
    nginx-55649fd747-9cr7h   10.244.2.2,fd12:3456:789a:0:2::2   aks-nodepool1-14508455-vmss000002   True
    nginx-55649fd747-p5lr9   10.244.0.7,fd12:3456:789a::7       aks-nodepool1-14508455-vmss000000   True
    nginx-55649fd747-r2rqh   10.244.1.2,fd12:3456:789a:0:1::2   aks-nodepool1-14508455-vmss000001   True
    

LoadBalancer 型のサービスを使用してワークロードを公開する

重要

AKS v1.27 以降では、1 つの IPv4 パブリック IP と 1 つの IPv6 パブリック IP でプロビジョニングされるデュアルスタック LoadBalancer サービスを作成できます。 ただし、前のバージョンでは、サービスの最初の IP アドレスのみがロード バランサーにプロビジョニングされるため、デュアルスタック サービスでは、最初に一覧表示される IP ファミリのパブリック IP のみを受け取ります。 単一のデプロイにデュアルスタック サービスを提供するために、同じセレクターをターゲットとする 2 つのサービス (1 つは IPv4 用、もう 1 つは IPv6 用) を作成してください。

v1.27 以降の AKS

  1. kubectl expose deployment nginx コマンドを使用して、NGINX デプロイを公開します。

    kubectl expose deployment nginx --name=nginx --port=80 --type=LoadBalancer --overrides='{"spec":{"ipFamilyPolicy": "PreferDualStack", "ipFamilies": ["IPv4", "IPv6"]}}'
    

    サービスが公開されたことを示す出力が表示されます。

    service/nginx exposed
    
  2. デプロイが公開されて LoadBalancer サービスが完全にプロビジョニングされたら、kubectl get services コマンドを使用してサービスの IP アドレスを取得します。

    kubectl get services
    
    NAME         TYPE           CLUSTER-IP               EXTERNAL-IP         PORT(S)        AGE
    nginx        LoadBalancer   10.0.223.73   2603:1030:20c:9::22d,4.156.88.133   80:30664/TCP   2m11s
    
    kubectl get services nginx -ojsonpath='{.spec.clusterIPs}'
    
    ["10.0.223.73","fd17:d93e:db1f:f771::54e"]
    
  3. IPv6 対応ホストからのコマンド ライン Web 要求を使用して機能を確認します。 Azure Cloud Shell は IPv6 に対応していません。

    SERVICE_IP=$(kubectl get services nginx -o jsonpath='{.status.loadBalancer.ingress[1].ip}')
    curl -s "http://[${SERVICE_IP}]" | head -n5
    
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    

v1.27 より前の AKS

  1. kubectl expose deployment nginx コマンドを使用して、NGINX デプロイを公開します。

    kubectl expose deployment nginx --name=nginx-ipv4 --port=80 --type=LoadBalancer'
    kubectl expose deployment nginx --name=nginx-ipv6 --port=80 --type=LoadBalancer --overrides='{"spec":{"ipFamilies": ["IPv6"]}}'
    

    サービスが公開されたことを示す出力が表示されます。

    service/nginx-ipv4 exposed
    service/nginx-ipv6 exposed
    
  2. デプロイが公開されて LoadBalancer サービスが完全にプロビジョニングされたら、kubectl get services コマンドを使用してサービスの IP アドレスを取得します。

    kubectl get services
    
    NAME         TYPE           CLUSTER-IP               EXTERNAL-IP         PORT(S)        AGE
    nginx-ipv4   LoadBalancer   10.0.88.78               20.46.24.24         80:30652/TCP   97s
    nginx-ipv6   LoadBalancer   fd12:3456:789a:1::981a   2603:1030:8:5::2d   80:32002/TCP   63s
    
  3. IPv6 対応ホストからのコマンド ライン Web 要求を使用して機能を確認します。 Azure Cloud Shell は IPv6 に対応していません。

    SERVICE_IP=$(kubectl get services nginx-ipv6 -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    curl -s "http://[${SERVICE_IP}]" | head -n5
    
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>