允许通过 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 集群

限制

您只能为静态 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 支持