使用 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,取得最新版本。
  • 請確認您已建立 GKE Autopilot 叢集,且執行版本為 1.24.7-gke.1200 以上或 1.25.3-gke.1100 以上。

限制

您只能為靜態 Pod 或由自訂控制器 (例如 Agones) 管理的 Pod 指派隨機 hostPort。Kubernetes 代管控制器 (例如 Deployment) 不支援這項功能。

要求隨機通訊埠

  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 之間的差異) 必須至少為 1000 個通訊埠。

  2. 套用資訊清單:

    kubectl apply -f host-port-pod.yaml
    

套用資訊清單時,GKE 會從您的範圍中選取隨機通訊埠,並將該通訊埠指派給容器。如果 GKE 為兩個 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 為每個容器指派的已開啟通訊埠。

後續步驟

在 GitHub 上追蹤 Autopilot 的 Agones 支援