このページでは、Google Kubernetes Engine(GKE)Autopilot クラスタで実行されている Pod でランダムなポートを公開する方法について説明します。
Pod でポートを公開すると、Pod はロードバランサなしで受信接続を直接受け入れるようになります。GKE では、Pod 仕様で指定した範囲から開くポートをランダムに選択します。このタイプのランダムなポート公開は、ワークロードが直接の受信接続を必要としながらも、永続的なポート番号に依存しない場合に有用です。このタイプのワークロードの例としては、デフォルトの Dynamic
ポートポリシーが設定された Agones GameServer リソースがあります。
ランダムなポートをリクエストすると、GKE ではコンテナ仕様の hostPort
フィールドの値が GKE が選択したポートにオーバーライドされます。
始める前に
始める前に、次の作業が完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
- バージョン 1.24.7-gke.1200 以降または 1.25.3-gke.1100 以降を実行している GKE Autopilot クラスタがあることを確認します。
制限事項
ランダムな hostPorts は、静的な Pod またはカスタム コントローラが管理する Pod(Agones など)に対してのみ割り当てることができます。この機能は、Deployment などの Kubernetes マネージド コントローラではサポートされていません。
ランダムなポートをリクエストする
次のマニフェストを
host-port-pod.yaml
として保存します。apiVersion: v1 kind: Pod metadata: name: game-pod annotations: autopilot.gke.io/host-port-assignment: '{"min":MIN_PORT,"max":MAX_PORT}' spec: containers: - name: local-chat image: ubuntu ports: - containerPort: 80 hostPort: HOST_PORT1 protocol: tcp - name: game-server image: ubuntu ports: - containerPort: 80 hostPort: HOST_PORT2 protocol: udp
次のように置き換えます。
MIN_PORT
: GKE がランダムなポートを選択する範囲で最小のポート番号。MAX_PORT
: GKE がランダムなポートを選択する範囲で最大のポート番号。HOST_PORT1, HOST_PORT2
: 有効なポート番号。Pod がスケジュールされると、GKE はランダムに割り当てられたポートでこのフィールドを更新します。複数のコンテナがある場合は、コンテナごとに異なるポート番号を使用します。
ポート範囲(
MAX_PORT
とMIN_PORT
の差)は 1,000 ポート以上でなければなりません。次のようにマニフェストを適用します。
kubectl apply -f host-port-pod.yaml
マニフェストを適用すると、GKE は指定の範囲からランダムなポートを選択してコンテナにポートを割り当てます。GKE が同じポート値を 2 つの Pod に割り当てると、ポートの競合を避けるために GKE はその Pod を自動で別々のノードに配置します。
割り当てられたポートを確認する
GKE がコンテナに割り当てたポート番号を確認するには Pod を調べます。
kubectl get pod game-pod --output=yaml
出力は次のようになります。
apiVersion: v1
kind: Pod
metadata:
annotations:
autopilot.gke.io/host-port-assignment: '{"min":MIN_PORT,"max":MAX_PORT,"portsAssigned":{"HOST_PORT1":7300,"HOST_PORT2":7450}}'
name: game-pod
namespace: default
spec:
containers:
- name: local-chat
image: ubuntu
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 7300
protocol: TCP
- name: game-server
image: ubuntu
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 7450
protocol: UDP
この出力で:
metadata.annotations.autopilot.gke.io/host-port-assignment
: ポートの割り当て。各コンテナに設定したhostPort
の元の値と GKE が割り当てたhostPort
の更新値を示します。このフィールドは、Pod 仕様で複数のポートをリクエストした場合に有用です。spec.containers.ports.hostPort
: GKE が各コンテナに割り当てた開いているポート。
次のステップ
Autopilot での Agones のサポートを GitHub で確認する。