デュアルスタック 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 ノード プールでは、サービス オブジェクトは
externalTrafficPolicy: Localでのみサポートされます。 - Azure 仮想ネットワークとポッド CIDR には、デュアルスタック ネットワークが必要です。
- ノードまたはポッドの IP アドレスでは、単一スタック IPv6 専用はサポートされていません。 サービスは、IPv4 または IPv6 でプロビジョニングできます。
- Azure CNI オーバーレイ が必要です
[前提条件]
- AKS デュアルスタック クラスターには、Kubernetes バージョン v1.21.2 以降が必要です。 v1.22.2 以降をお勧めします。
- Azure Resource Manager テンプレートを使用する場合は、スキーマ バージョン 2021-10-01 が必要です。
Kubernetes でのデュアル スタック ネットワークの概要
Kubernetes v1.23 では、ポッドやサービス ネットワークを含む IPv4/IPv6 デュアルスタック クラスターの安定したアップストリーム サポートが提供されます。 ノードとポッドには常に IPv4 アドレスと IPv6 アドレスの両方が割り当てられますが、サービスはどちらのアドレス ファミリでもデュアルスタックまたはシングルスタックにすることができます。
AKS は、デュアルスタック ネットワークに必要なサポート サービスを構成します。 この構成には、次のものが含まれます。
- マネージド仮想ネットワークを使用する場合は、デュアルスタック仮想ネットワーク構成。
- IPv4 および IPv6 ノードおよびポッド アドレス。
- IPv4 トラフィックと IPv6 トラフィックの両方の送信規則。
- IPv4 および IPv6 サービスのロード バランサーのセットアップ。
注
送信タイプのユーザー定義ルーティングでデュアルスタックを使用する場合は、インターネットに到達するために 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 クラスターをデプロイする
az group createコマンドを使用して、クラスターの Azure リソース グループを作成します。az group create --location <region> --name <resourceGroupName>az aks createパラメーターが--ip-familiesに設定されたipv4,ipv6コマンドを使用して、デュアルスタック AKS クラスターを作成します。az aks create \ --location <region> \ --resource-group <resourceGroupName> \ --name <clusterName> \ --ip-families ipv4,ipv6 \ --generate-ssh-keysクラスターが作成されたら、
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 サーバーをデプロイする
kubectl create deployment nginxコマンドを使用して NGINX Web サーバーを作成します。kubectl create deployment nginx --image=nginx:latest --replicas=3kubectl 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
AKS v1.27 以降では、1 つの IPv4 パブリック IP と 1 つの IPv6 パブリック IP でプロビジョニングされるデュアルスタック LoadBalancer サービスを作成できます。 ただし、以前のバージョンでは、サービスの最初の IP アドレスのみがロード バランサーにプロビジョニングされるため、デュアルスタック サービスは最初にリストされた IP ファミリのパブリック IP のみを受け取ります。 単一のデプロイにデュアルスタック サービスを提供するために、同じセレクターをターゲットとする 2 つのサービス (1 つは IPv4 用、もう 1 つは IPv6 用) を作成してください。
v1.27 以降の AKS
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デプロイが公開されて
LoadBalancerサービスが完全にプロビジョニングされたら、kubectl get servicesコマンドを使用してサービスの IP アドレスを取得します。kubectl get servicesNAME 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 2m11skubectl get services nginx -ojsonpath='{.spec.clusterIPs}'["10.0.223.73","fd17:d93e:db1f:f771::54e"]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
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デプロイが公開されて
LoadBalancerサービスが完全にプロビジョニングされたら、kubectl get servicesコマンドを使用してサービスの IP アドレスを取得します。kubectl get servicesNAME 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 63sIPv6 対応ホストからのコマンド ライン 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>