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

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

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

az group create --name myResourceGroup2 --location eastus

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

az aks create -g MyResourceGroup2 -n MyManagedCluster -l eastus  --enable-node-public-ip

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

az aks nodepool add -g MyResourceGroup2 --cluster-name MyManagedCluster -n nodepool2 --enable-node-public-ip

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

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

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

az network public-ip prefix create --length 28 --location eastus --name MyPublicIPPrefix --resource-group MyResourceGroup3

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

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

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

az aks create -g MyResourceGroup3 -n MyManagedCluster -l eastus --enable-node-public-ip --node-public-ip-prefix /subscriptions/<subscription-id>/resourcegroups/MyResourceGroup3/providers/Microsoft.Network/publicIPPrefixes/MyPublicIPPrefix

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

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

重要

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

az vmss list-instance-public-ips -g MC_MyResourceGroup2_MyManagedCluster_eastus -n YourVirtualMachineScaleSetName

ノード パブリック IP でパブリック IP タグを使用する (プレビュー)

ノード パブリック IP でパブリック IP タグを使用して、Azure のルーティング優先設定機能を利用できます。

重要

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

要件

  • AKS バージョン 1.24 以降が必要です。
  • aks-preview 拡張機能のバージョン 0.5.115 が必要です。

aksプレビューの Azure CLI 拡張機能をインストールする

aksプレビュー拡張機能をインストールして、次のコマンドを実行します:

az extension add --name aks-preview

次のコマンドを実行して、リリースされた最新バージョンの拡張機能に更新します:

az extension update --name aks-preview

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

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

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

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

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

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

az provider register --namespace Microsoft.ContainerService

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

az aks create -n <clusterName> -l <location> -g <resourceGroup> \
  --enable-node-public-ip \
  --node-public-ip-tags RoutingPreference=Internet

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

az aks nodepool add --cluster-name <clusterName> -n <nodepoolName> -l <location> -g <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.24 以降が必要です。
  • aks-preview 拡張機能のバージョン 0.5.110 が必要です。

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

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

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

  --resource-group <resourceGroup> \
  --cluster-name <clusterName> \
  --name <nodepoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

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

  --resource-group <resourceGroup> \
  --cluster-name <clusterName> \
  --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.24 以降が必要です。

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

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

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

次のステップ