Azure Kubernetes Service (AKS) でインスタンス レベルのパブリック IP を使用する

AKS ノードは、通信用に独自のパブリック IP アドレスを必要としません。 ただし、シナリオでは、ノード プール内のノードが専用のパブリック IP アドレスを受け取ることが必要な場合があります。 一般的なシナリオとしては、ゲームのワークロードがあります。この場合、ホップを最小限に抑えるために、コンソールをクラウド仮想マシンに直接接続する必要があります。 このシナリオは、ノード パブリック IP を使用することにより、AKS で実現することができます。

最初に、新しいリソース グループを作成します。

az group create --name <resourceGroup> --location <region>

新しい AKS クラスターを作成し、ノードのパブリック IP を接続します。 ノード プール内の各ノードは、一意のパブリック IP を受け取ります。 これを確認するには、仮想マシン スケール セットのインスタンスを参照します。

az aks create \
    --resource-group <resourceGroup> \
    --name <aksClusterName> \
    --location <region> \
    --enable-node-public-ip \
    --generate-ssh-keys

既存の AKS クラスターの場合は、新しいノード プールを追加し、ノードのパブリック IP を接続することもできます。

az aks nodepool add --resource-group <resourceGroup> --cluster-name <aksClusterName> --name <newNodePool> --enable-node-public-ip

パブリック IP プレフィックスを使用する

パブリック IP プレフィックスを使用することには、多くの利点があります。 AKS は、新しいクラスターの作成時またはノード プールの追加時にリソース ID をフラグ --node-public-ip-prefix-id と共に渡すことによって、ノードの既存のパブリック IP プレフィックスからのアドレスの使用をサポートします。

まず、az network public-ip prefix create を使用してパブリック IP プレフィックスを作成します。

az network public-ip prefix create --length 28 --location <region> --name <publicIPPrefixName> --resource-group <resourceGroup>

出力を表示し、プレフィックスの id を確認します。

{
  ...
  "id": "/subscriptions/<subscription-id>/resourceGroups/<resourceGroup>/providers/Microsoft.Network/publicIPPrefixes/<publicIPPrefixName>",
  ...
}

最後に、新しいクラスターを作成するとき、または新しいノード プールを追加するときに、フラグ --node-public-ip-prefix-id を使用して、プレフィックスのリソース ID を渡します。

az aks create \
    --resource-group <resourceGroup> \
    --name <aksClusterName> \
    --location <region> \
    --enable-node-public-ip \
    --node-public-ip-prefix-id /subscriptions/<subscription-id>/resourceGroups/<resourceGroup>/providers/Microsoft.Network/publicIPPrefixes/<publicIPPrefixName> \
    --generate-ssh-keys

デュアルスタック パブリック IP プレフィックスを使用する (プレビュー)

デュアルスタック クラスターのパブリック IP プレフィックスを使用して、ノード プール内の各ノードに IPv4 と IPv6 の両方のパブリック IP アドレスを割り当てることができます。 この機能は、IPv4 と IPv6 の両方で直接のインバウンド接続またはアウトバウンド接続を必要とするワークロードや、IPv6 コンプライアンスを必要とする環境で動作するアプリケーションに役立ちます。

次の 2 つの構成がサポートされています。

  • 独自の IPv4 プレフィックスと IPv6 プレフィックスを持ち込めます。 各ノードは、IPv4 プレフィックスから 1 つの IPv4 アドレスを受信し、IPv6 プレフィックスから 1 つの IPv6 アドレスを受信します。 この構成は、ファイアウォールやパートナー サービスが自分のプレフィックスからのトラフィックのみを許可する場合など、両方のアドレスを自分で管理するアドレス範囲から取得する必要がある場合に使用します。
  • 独自の IPv6 プレフィックスのみ 各ノードは IPv6 プレフィックスから 1 つの IPv6 アドレスを受信し、Azureは IPv4 アドレスを自動的に割り当てます。 この構成は、管理している範囲から IPv6 アドレスのみを取得する必要がある場合に使用します。 ノード プールは IPv4 プレフィックスのアドレスを使用しないため、IPv4 プレフィックスのサイズによって、ノード プールのスケーリング先となるノードの数は制限されません。

重要

AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。 詳細については、次のサポート記事を参照してください。

要件

ノード パブリック IP でデュアルスタック パブリック IP プレフィックスを使用するには、次の前提条件が満たされていることを確認します。

  • クラスターは、IPv4 と IPv6 の両方の IP ファミリを持つデュアル スタック クラスターとして構成されます。 両方の構成 (IPv6 専用プレフィックス構成を含む) には、デュアルスタック クラスターが必要です。
  • クラスターでは、オーバーレイ ネットワークAzure CNI を使用します。
  • AKS クラスターと同じサブスクリプションとリージョンで使用する予定のパブリック IP プレフィックスを作成しました。 選択する構成に応じて、1 つの IPv4 プレフィックスと 1 つの IPv6 プレフィックス、または 1 つの IPv6 プレフィックスが必要です。
  • 各パブリック IP プレフィックスは Standard SKU を使用し、ロード バランサーに接続されていません。
  • AKS クラスター ID には、パブリック IP プレフィックスを管理するためのアクセス許可があります。 プレフィックスが別のリソース グループにある場合は、そのリソース グループのネットワーク共同作成者ロールをクラスター ID に割り当てます。

プレビュー機能を登録する

ノード パブリック IP のデュアル スタック (IPv4 および IPv6) パブリック IP プレフィックスのサポートは、現在プレビュー段階で利用できます。 この機能を使用する前に、Azure CLI拡張機能をインストールまたは更新し、NodePublicIPv6PrefixPreview機能フラグをサブスクリプションに登録する必要があります。

aks-preview 拡張機能をインストールまたは更新します。

az extension add --name aks-preview --upgrade

必要なプレビュー機能を登録します。

az feature register --namespace Microsoft.ContainerService --name NodePublicIPv6PrefixPreview

機能の登録が完了するまで数分かかる場合があります。 登録状態を確認するには、次のコマンドを実行します。

az feature show --namespace Microsoft.ContainerService --name NodePublicIPv6PrefixPreview --query "properties.state"

先に進む前に、機能が 登録済みの 状態を報告するまで待ってください。

機能フラグが登録されたら、リソース プロバイダーを更新して、変更が適用されていることを確認します。

az provider register --namespace Microsoft.ContainerService

登録が完了したら、ノード パブリック IP にデュアルスタック パブリック IP プレフィックスを使用するようにクラスターを作成または更新できます。

パブリック IP プレフィックスを作成する

Azure CLIを使用して、IPv4 と IPv6 のパブリック IP プレフィックスを作成します。 IPv6 のみのプレフィックス構成を使用する場合は、IPv6 プレフィックスのみを作成してください。

IPv4 の場合:

az network public-ip prefix create \
  --resource-group <resourceGroup> \
  --name <ipv4PrefixName> \
  --location <region> \
  --length 28 \
  --sku Standard \
  --version IPv4

IPv6 の場合:

az network public-ip prefix create \
  --resource-group <resourceGroup> \
  --name <ipv6PrefixName> \
  --location <region> \
  --length 124 \
  --sku Standard \
  --version IPv6

プレフィックスを作成したら、各プレフィックスのリソース ID をメモします。

デュアルスタック ノードのパブリック IP プレフィックスを使用して新しいクラスターを作成する

新しい AKS クラスターを作成するときは、 --node-public-ip-prefix-ids パラメーターを使用して、IPv4 パブリック IP プレフィックスと IPv6 パブリック IP プレフィックスの両方を指定します。

az aks create \
  --resource-group <resourceGroup> \
  --name <aksClusterName> \
  --location <region> \
  --enable-node-public-ip \
  --ip-families IPv4,IPv6 \
  --network-plugin azure \
  --network-plugin-mode overlay \
  --node-public-ip-prefix-ids "<ipv4PrefixResourceId>,<ipv6PrefixResourceId>" \
  --generate-ssh-keys

--node-public-ip-prefix-ids パラメーターは、パブリック IP プレフィックス リソース ID のコンマ区切りのリストを受け取ります。 リストには、IPv4 プレフィックスと IPv6 プレフィックスをそれぞれ最大 1 つまで含めることができます。 AKS は参照される各プレフィックスから IP バージョンを決定するため、順序は重要ではありません。

デュアルスタック ノードパブリック IP プレフィックスを持つノード プールを追加する

また、デュアルスタック ノードパブリック IP プレフィックスを持つノード プールを既存のデュアルスタック クラスターに追加することもできます。

az aks nodepool add \
  --resource-group <resourceGroup> \
  --cluster-name <aksClusterName> \
  --name <nodePoolName> \
  --enable-node-public-ip \
  --node-public-ip-prefix-ids "<ipv4PrefixResourceId>,<ipv6PrefixResourceId>"

IPv6 専用パブリック IP プレフィックスを使用する

制御しているプレフィックスに由来する IPv6 アドレスのみが必要な場合は、1 つの IPv6 プレフィックスを指定します。 各ノードはプレフィックスから IPv6 アドレスを受け取り、Azure自動的に IPv4 アドレスを割り当てます。 ノード プールには引き続きデュアル スタック クラスターが必要です。

この構成は、IPv4 プレフィックスのサイズによってノード プールをスケーリングできる規模が制限される場合に使用します。 ノード プールはプレフィックスから IPv4 アドレスを割り当てないため、IPv6 プレフィックスの容量のみがノード数を制限します。

IPv6 専用ノードパブリック IP プレフィックスを持つ新しいクラスターを作成します。

az aks create \
  --resource-group <resourceGroup> \
  --name <aksClusterName> \
  --location <region> \
  --enable-node-public-ip \
  --ip-families IPv4,IPv6 \
  --network-plugin azure \
  --network-plugin-mode overlay \
  --node-public-ip-prefix-ids "<ipv6PrefixResourceId>" \
  --generate-ssh-keys

IPv6 専用ノード パブリック IP プレフィックスを持つノード プールを既存のデュアルスタック クラスターに追加する:

az aks nodepool add \
  --resource-group <resourceGroup> \
  --cluster-name <aksClusterName> \
  --name <nodePoolName> \
  --enable-node-public-ip \
  --node-public-ip-prefix-ids "<ipv6PrefixResourceId>"

Azureでは IPv4 アドレスが自動的に割り当てられるため、各ノードの IPv4 アドレスは予測できず、事前に許可リストに追加することはできません。 そのため、API サーバーの承認済み IP 範囲を使用するクラスターでは、IPv6 専用のパブリック IP プレフィックスを使用できません。 代わりに API Server VNet 統合 または プライベート クラスター を使用するか、一覧に IPv4 プレフィックスを含める。

ノードパブリック IP プレフィックスの構成を確認する

az aks nodepool show コマンドを使用して、ノード プールが使用するプレフィックスを確認します。

az aks nodepool show \
  --resource-group <resourceGroup> \
  --cluster-name <aksClusterName> \
  --name <nodePoolName> \
  --query "networkProfile.nodePublicIPPrefixIDs"

az vmss list-instance-public-ips コマンドを使用して、ノードに割り当てられたパブリック IP アドレスを一覧表示します。 ノード リソース グループを使用します。

az vmss list-instance-public-ips \
  --resource-group <MC_resourceGroup_aksClusterName_region> \
  --name <virtualMachineScaleSetName> \
  --query "[].{name:name, ipAddress:ipAddress, version:publicIPAddressVersion}" \
  --output table

IPv6 専用プレフィックスの場合、各ノードにはプレフィックスからの 1 つの IPv6 アドレスと、Azureマネージド アドレス プールからの 1 つの IPv4 アドレスがあります。

Limitations

ノードのパブリック IP 用のパブリック IP プレフィックスには、次の制限が適用されます。

プレフィックス一覧:

  • プレフィックス リストには、最大で 1 つの IPv4 プレフィックスと 1 つの IPv6 プレフィックスを含めることができます。 同じ IP バージョンの 2 つのプレフィックスが拒否されます。
  • プレフィックスを指定するときは、ノード プールでノード パブリック IP を有効にする必要があります。
  • 同じコマンドで --node-public-ip-prefix-ids パラメーターと --node-public-ip-prefix-id パラメーターを使用することはできません。
  • ノードのパブリック IP 構成は変更できません。 パブリック IP プレフィックスを変更するには、新しいノード プールを作成し、ワークロードを移行する必要があります。

リソースのプレフィックス:

  • 各プレフィックスは Standard SKU を使用する必要があります。 Basic および Standard V2 プレフィックスはサポートされていません。
  • 各プレフィックスは、AKS クラスターと同じサブスクリプションと同じリージョンに存在する必要があります。
  • ロード バランサーに既にアタッチされているプレフィックスは使用できません。
  • ノード プールで可用性ゾーンが使用されている場合は、各プレフィックスのゾーンがノード プールのゾーンをカバーする必要があります。 ゾーンが割り当てられていないゾーン冗長プレフィックスは、任意のノード プールで動作します。

容量と拡張性:

  • 各プレフィックスは、各ノードが指定した各プレフィックスから 1 つのアドレスを消費するため、ノード プールのノード数に対して十分なアドレスが必要です。
  • クラスター オートスケーラーはサポートされていますが、構成された最大ノード数が、指定した各プレフィックスで使用可能な IP アドレスの数を超えないようにしてください。 IPv6 専用プレフィックスを使用する場合は、IPv6 プレフィックスのみがノード数を制限します。これは、Azureが IPv4 アドレスを自動的に割り当てるためです。

機能の互換性:

  • AZUREはノードの IPv4 アドレスを自動的に割り当て、事前に許可リストに追加できないため、API サーバーで承認された IP 範囲を使用するクラスターで IPv6 専用パブリック IP プレフィックスを使用することはできません。 代わりに API Server VNet 統合またはプライベート クラスターを使用するか、一覧に IPv4 プレフィックスを含めてください。
  • 各ノードには、1 つの IPv6 パブリック IP アドレスが割り当てられます。
  • この機能は、AKS 自動プロビジョニングまたはノード自動プロビジョニングではサポートされていません。
  • マルチ NIC ノード プールはサポートされていません。

ノードのパブリック IP を検索する

ノードのパブリック IP は、さまざまな方法で見つけることができます。

重要

ノード リソース グループには、ノードとそのパブリック IP が含まれています。 ノードのパブリック IP を検索するコマンドを実行するときは、ノード リソース グループを使用します。

az vmss list-instance-public-ips --resource-group <MC_region_aksClusterName_region> --name <virtualMachineScaleSetName>

ノード パブリック IP でパブリック IP タグを使用する

パブリック IP タグは、ノードのパブリック IP で使用して、指定されたリージョンで使用できる Azure ルーティング基本設定機能を利用できます。

要件

  • AKS バージョン 1.29 以降が必要です。

ルーティング優先インターネットを使用して新しいクラスターを作成する

az aks create \
    --name <aksClusterName> \
    --location <region> \
    --resource-group <resourceGroup> \
    --enable-node-public-ip \
    --node-public-ip-tags RoutingPreference=Internet \
    --generate-ssh-keys

ルーティング優先インターネットを使用してノード プールを追加する

az aks nodepool add --cluster-name <aksClusterName> \
  --name <nodePoolName> \
  --location <region> \
  --resource-group <resourceGroup> \
  --enable-node-public-ip \
  --node-public-ip-tags RoutingPreference=Internet

ホスト ポート接続を許可し、ノード プールをアプリケーション セキュリティ グループに追加する

ホスト アドレスでサービスをホストするノード パブリック IP を使用する AKS ノードでは、トラフィックを許可するために NSG 規則を追加する必要があります。 ノード プール構成に目的のポートを追加すると、クラスター ネットワーク セキュリティ グループに適切な許可規則が作成されます。

Bring Your Own Virtual Network を使用するクラスターがあるサブネット上にネットワーク セキュリティ グループが配置されている場合は、そのネットワーク セキュリティ グループに許可規則を追加する必要があります。 これは、特定のノード プールをアプリケーション セキュリティ グループ (ASG) に追加することで、そのノード プール内のノードに限定できます。 許可されたホスト ポートが指定されている場合、マネージド ASG は既定で管理対象リソース グループに作成されます。 ノード プール パラメーターで NSG のリソース ID を指定して、1 つ以上のカスタム ASG にノードを追加することもできます。

ホスト ポート仕様の形式

許可するポートのリストを指定するときは、port/protocol または startPort-endPort/protocol の形式のエントリを含むコンマ区切りのリストを使用します。

例:

  • 80/tcp
  • 80/tcp,443/tcp
  • 53/udp,80/tcp
  • 50000-60000/tcp

要件

  • AKS バージョン 1.29 以降が必要です。

許可されたポートとアプリケーション セキュリティ グループを使用して新しいクラスターを作成する

az aks create \
    --resource-group <resourceGroup> \
    --name <aksClusterName> \
    --nodepool-name <nodePoolName> \
    --nodepool-allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp\
    --nodepool-asg-ids "<asgId>,<asgId>" \
    --generate-ssh-keys

許可されたポートとアプリケーション セキュリティ グループを使用して新しいノード プールを追加する

az aks nodepool add \
  --resource-group <resourceGroup> \
  --cluster-name <aksClusterName> \
  --name <nodePoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

ノード プールの許可されたポートとアプリケーション セキュリティ グループを更新する

az aks nodepool update \
  --resource-group <resourceGroup> \
  --cluster-name <aksClusterName> \
  --name <nodePoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

ポッド ワークロードのホスト ポートを自動的に割り当てる (プレビュー)

ノードでパブリック IP が構成されている場合、ホスト ポートを利用して、ロード バランサー サービスを構成しなくても、ポッドがトラフィックを直接受信できるようにすることができます。 これは、よく知られているホスト名のマッチメーカー サービスが接続時に使用する正しいホストとポートを提供できるため、ノード IP とポートのエフェメラルな性質が問題にならないゲームなどのシナリオで特に役立ちます。 ただし、同じポートでリッスンできるのはホスト上の 1 つのプロセスだけなので、ホスト ポートでアプリケーションを使用すると、スケジュール設定で問題が発生する可能性があります。 この問題を回避するために、AKS には、スケジュール設定時にシステムに使用可能なポートを動的に割り当て、競合を防ぐ機能が用意されています。

警告

ポッド ホスト ポート トラフィックは、クラスターに配置されている既定の NSG 規則によってブロックされます。 この機能は、トラフィックのフローを許可するために、ノード プール上のホスト ポートの許可と組み合わせる必要があります。

重要

AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。 詳細については、次のサポート記事を参照してください。

要件

  • AKS バージョン 1.29 以降が必要です。

"PodHostPortAutoAssignPreview" 機能フラグを登録する

PodHostPortAutoAssignPreview 機能フラグは、次の例のとおり、az feature register コマンドを使用して登録します。

az feature register --namespace "Microsoft.ContainerService" --name "PodHostPortAutoAssignPreview"

状態が [登録済み] と表示されるまでに数分かかります。 登録の状態は、az feature show コマンドで確認します。

az feature show --namespace "Microsoft.ContainerService" --name "PodHostPortAutoAssignPreview"

状態が Registered として表示されたら、az provider register コマンドを使用して Microsoft.ContainerService リソース プロバイダーの登録を最新の情報に更新します。

az provider register --namespace Microsoft.ContainerService

ポッドにホスト ポートを自動的に割り当てる

ホスト ポートの自動割り当てをトリガーするには、ホスト ポートを使用せずにワークロードをデプロイし、ホスト ポートの割り当てが必要なポートのリストを含む kubernetes.azure.com/assign-hostports-for-containerports 注釈を適用します。 注釈の値は、port/protocol のようなエントリのコンマ区切りリストとして指定する必要があります。ここで、ポートはポッド仕様で定義されている個々のポート番号で、プロトコルは tcp または udp です。

ポートは 40000-59999 の範囲から割り当てられ、クラスター全体で一意になります。 割り当てられたポートは、アプリケーションが割り当てられたポートを決定できるように、ポッド内の環境変数にも追加されます。 環境変数名は、<deployment name>_PORT_<port number>_<protocol>_HOSTPORT の形式になります (以下の例)。したがって、例は mydeployment_PORT_8080_TCP_HOSTPORT: 41932 になります。

ポート 8080 と 8443 のホスト ポートのマッピングを示す echoserver デプロイの例を次に示します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echoserver-hostport
  labels:
    app: echoserver-hostport
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echoserver-hostport
  template:
    metadata:
      annotations:
        kubernetes.azure.com/assign-hostports-for-containerports: 8080/tcp,8443/tcp
      labels:
        app: echoserver-hostport
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - name: echoserver-hostport
          image: k8s.gcr.io/echoserver:1.10
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            - name: https
              containerPort: 8443
              protocol: TCP

デプロイが適用されると、hostPort エントリは個々のポッドの YAML に含まれます。

$ kubectl describe pod echoserver-hostport-75dc8d8855-4gjfc
<cut for brevity>
Containers:
  echoserver-hostport:
    Container ID:   containerd://d0b75198afe0612091f412ee7cf7473f26c80660143a96b459b3e699ebaee54c
    Image:          k8s.gcr.io/echoserver:1.10
    Image ID:       k8s.gcr.io/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229                                                                                                      Ports:          8080/TCP, 8443/TCP
    Host Ports:     46645/TCP, 49482/TCP
    State:          Running
      Started:      Thu, 12 Jan 2023 18:02:50 +0000
    Ready:          True
    Restart Count:  0
    Environment:
      echoserver-hostport_PORT_8443_TCP_HOSTPORT:  49482
      echoserver-hostport_PORT_8080_TCP_HOSTPORT:  46645

次のステップ