本页面介绍了如何在 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)不支持此功能。
请求随机端口
将以下清单保存为
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
之间的差值)必须至少为 1000 个端口。应用清单:
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 支持。