本页面介绍如何在 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 上跟踪 Agones 对 Autopilot 的支持。