Azure Kubernetes Service (AKS) でインスタンス レベルのパブリック IP を使用する
AKS ノードは、通信用に独自のパブリック IP アドレスを必要としません。 ただし、シナリオでは、ノード プール内のノードが専用のパブリック IP アドレスを受け取ることが必要な場合があります。 一般的なシナリオとしては、ゲームのワークロードがあります。この場合、ホップを最小限に抑えるために、コンソールをクラウド仮想マシンに直接接続する必要があります。 このシナリオは、ノード パブリック IP を使用することにより、AKS で実現することができます。
最初に、新しいリソース グループを作成します。
az group create --name myResourceGroup2 --location eastus
新しい AKS クラスターを作成し、ノードのパブリック IP を接続します。 ノード プール内の各ノードは、一意のパブリック IP を受け取ります。 これを確認するには、仮想マシン スケール セットのインスタンスを参照します。
az aks create \
--resource-group MyResourceGroup2 \
--name MyManagedCluster \
--location eastus \
--enable-node-public-ip \
--generate-ssh-keys
既存の AKS クラスターの場合は、新しいノード プールを追加し、ノードのパブリック IP を接続することもできます。
az aks nodepool add --resource-group MyResourceGroup2 --cluster-name MyManagedCluster --name 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 \
--resource-group MyResourceGroup3 \
--name MyManagedCluster \
--location eastus \
--enable-node-public-ip \
--node-public-ip-prefix /subscriptions/<subscription-id>/resourcegroups/MyResourceGroup3/providers/Microsoft.Network/publicIPPrefixes/MyPublicIPPrefix \
--generate-ssh-keys
ノードのパブリック IP を検索する
ノードのパブリック IP は、さまざまな方法で見つけることができます。
- Azure CLI コマンド
az vmss list-instance-public-ips
を使用します。 - PowerShell または Bash コマンドを使用。
- 仮想マシン スケール セット内のインスタンスを表示して、Azure portal 内のパブリック IP を表示することも可能です。
重要
ノード リソース グループには、ノードとそのパブリック IP が含まれています。 ノードのパブリック IP を検索するコマンドを実行するときは、ノード リソース グループを使用します。
az vmss list-instance-public-ips --resource-group MC_MyResourceGroup2_MyManagedCluster_eastus --name YourVirtualMachineScaleSetName
ノード パブリック IP でパブリック IP タグを使用する
ノード パブリック IP でパブリック IP タグを使用して、Azure のルーティング優先設定機能を利用できます。
要件
- AKS バージョン 1.24 以降が必要です。
ルーティング優先インターネットを使用して新しいクラスターを作成する
az aks create \
--name <clusterName> \
--location <location> \
--resource-group <resourceGroup> \
--enable-node-public-ip \
--node-public-ip-tags RoutingPreference=Internet \
--generate-ssh-keys
ルーティング優先インターネットを使用してノード プールを追加する
az aks nodepool add --cluster-name <clusterName> --name <nodepoolName> --location <location> --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.24 以降が必要です。
許可されたポートとアプリケーション セキュリティ グループを使用して新しいクラスターを作成する
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>" \
--generate-ssh-keys
許可されたポートとアプリケーション セキュリティ グループを使用して新しいノード プールを追加する
--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
次のステップ
AKS での複数のノード プールの使用について説明します。
AKS での標準ロード バランサーの使用について説明します。
Azure Kubernetes Service