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

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

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

Von Bedeutung

2025 年 11 月 30 日から、Azure Kubernetes Service (AKS) は、Azure Linux 2.0 のセキュリティ更新プログラムをサポートまたは提供しなくなりました。 Azure Linux 2.0 ノード イメージは、 202512.06.0 リリースでフリーズします。 2026 年 3 月 31 日以降、ノード イメージは削除され、ノード プールをスケーリングできなくなります。 ノード プールをサポートされている Kubernetes バージョンにアップグレードするか、osSku AzureLinux3 に移行して、サポートされている Azure Linux バージョンに移行します。 詳細については、 廃止に関する GitHub の問題Azure 更新プログラムの提供終了に関するお知らせを参照してください。 お知らせや更新情報を常に把握するには、 AKS のリリース ノートに従ってください。

制限事項

  • Azure Linux ノード プールでは、IPv6 サービスにexternalTrafficPolicy: Localが必要です。
  • Azure 仮想ネットワークとポッド CIDR には、デュアルスタック ネットワークが必要です。
    • ノードまたはポッドの IP アドレスでは、単一スタック IPv6 専用はサポートされていません。 サービスは、IPv4 または IPv6 でプロビジョニングできます。
  • Azure CNI オーバーレイでは、デュアルスタック ネットワークを使用した Azure または Calico ネットワーク ポリシーはサポートされていません。 ネットワーク ポリシーを使用するには、Azure CNI Powered by Cilium を使用してください。
  • Standard NAT ゲートウェイでは、IPv4 のみがサポートされます。 デュアルスタック エグレスの場合は、StandardV2 NAT ゲートウェイを使用します。 AKS 管理の managedNATGatewayV2 アウトバウンドの種類はプレビュー段階にあります。
  • 仮想ノード アドオンは、デュアルスタック ネットワークではサポートされていません。

[前提条件]

この記事では、Azure CNI オーバーレイを使用します。 Kubernetes バージョン 1.29 以降を実行している Linux クラスターに、Azure CNI Powered by Cilium を使用してデュアルスタック クラスターをデプロイすることもできます。

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

Kubernetes v1.23 では、ポッドやサービス ネットワークを含む IPv4/IPv6 デュアルスタック クラスターの安定したアップストリーム サポートが提供されます。 ノードとポッドには常に IPv4 アドレスと IPv6 アドレスの両方が割り当てられますが、サービスはどちらのアドレス ファミリでもデュアルスタックまたはシングルスタックにすることができます。

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

  • マネージド仮想ネットワークを使用する場合は、デュアルスタック仮想ネットワーク構成です。
  • IPv4 および IPv6 ノードおよびポッド アドレス。
  • IPv4 トラフィックと IPv6 トラフィックの両方の送信規則。
  • IPv4 および IPv6 サービスのロード バランサーのセットアップ。

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

デュアルスタック クラスターのパラメーター

次のパラメーターは、デュアルスタック クラスターをサポートしています。

パラメーター 指定可能な値 既定値 Constraints
--ip-families ipv4 または ipv4,ipv6 指定なし クラスターで有効にする IP ファミリのコンマ区切りの一覧を指定します。
--pod-cidrs コンマ区切りの CIDR 範囲 10.244.0.0/16,fd12:3456:789a::/64 範囲の数と順序は、 --ip-families一致する必要があります。
--service-cidrs コンマ区切りの CIDR 範囲 10.0.0.0/16,fd12:3456:789a:1::/108 範囲の数と順序は、 --ip-families一致する必要があります。 IPv6 サブネットは、 /108以下にすることができます。

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

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

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

    az aks create \
        --location <region> \
        --resource-group <resourceGroupName> \
        --name <clusterName> \
        --network-plugin azure \
        --network-plugin-mode overlay \
        --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

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

3 つのレプリカを含む NGINX Web サーバーをデプロイして、デュアルスタック ポッドの IP 割り当てを確認します。

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 型のサービスを使用してワークロードを公開する

Von Bedeutung

Azure Load Balancer により、リンクローカル アドレスから IPv6 宛先に正常性プローブが送信されます。 Azure Linux ノード プールでは、externalTrafficPolicy: Clusterを使用する IPv6 サービスへのトラフィックは失敗します。 次の例では、kube-proxyがノード上のプローブに応答するように、IPv6 サービスにexternalTrafficPolicy: Localを設定します。

  1. kubectl expose deployment nginx コマンドを使用して、個別の IPv4 および IPv6 LoadBalancer サービスを使用して 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":{"externalTrafficPolicy":"Local","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 アドレスが割り当てられ、IPv6 ルーティングが構成されている Linux VM またはオンプレミス のマシンの機能を確認します。 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>