hostPort を使用して Autopilot Pod への直接接続を許可する


このページでは、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 マネージド コントローラではサポートされていません。

ランダムなポートをリクエストする

  1. 次のマニフェストを 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_PORTMIN_PORT の差)は 1,000 ポート以上でなければなりません。

  2. 次のようにマニフェストを適用します。

    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 で確認する