Questa pagina mostra come esporre una porta casuale in un pod in esecuzione in un cluster Google Kubernetes Engine (GKE) Autopilot.
L'esposizione di una porta in un pod consente al pod di accettare direttamente le connessioni in entrata,
senza un bilanciatore del carico. GKE sceglie una porta casuale da aprire
da un intervallo specificato nella specifica del pod. Questo tipo di esposizione
delle porte casuale è utile quando il tuo carico di lavoro richiede connessioni in entrata dirette
ma non si basa su un numero di porta persistente. Un esempio di questo tipo di workload è una risorsa Agones GameServer con il criterio di porta Dynamic predefinito.
Quando richiedi una porta casuale, GKE esegue l'override del valore nel
campo hostPort nella specifica del container con la porta che
GKE ha selezionato per te.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
Se vuoi utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza
gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima versione
eseguendo gcloud components update.
Assicurati di avere un
cluster GKE Autopilot
che esegue la versione 1.24.7-gke.1200 e successive o 1.25.3-gke.1100 e successive.
Limitazioni
Puoi assegnare hostPort casuali solo per i pod statici o per i pod gestiti da un controller personalizzato, come Agones. Questa funzionalità non è supportata sui controller gestiti da Kubernetes, come i deployment.
Richiedere una porta casuale
Salva il seguente manifest come host-port-pod.yaml:
MIN_PORT: il numero di porta minimo per l'intervallo
da cui GKE sceglie una porta casuale.
MAX_PORT: il numero di porta massimo per l'intervallo
da cui GKE sceglie una porta casuale.
HOST_PORT1, HOST_PORT2: qualsiasi numero di porta valido. Quando il pod viene pianificato, GKE aggiorna questo campo con la porta assegnata in modo casuale. Se hai più contenitori,
utilizza numeri di porta diversi per ciascun contenitore.
L'intervallo di porte (la differenza tra MAX_PORT
e MIN_PORT) deve essere di almeno 1000 porte.
Applica il manifest:
kubectlapply-fhost-port-pod.yaml
Quando applichi il manifest, GKE seleziona una porta casuale dall'intervallo e la assegna al container. Se GKE assegna lo stesso valore di porta a due pod, li posiziona automaticamente su nodi separati per evitare conflitti di porta.
Controlla la porta assegnata
Per trovare il numero di porta assegnato da GKE ai tuoi container,
ispeziona il pod:
metadata.annotations.autopilot.gke.io/host-port-assignment: le assegnazioni di porte, che mostrano il valore originale di hostPort che hai impostato per ogni container e il valore aggiornato di hostPort assegnato da GKE. Questo campo è utile se hai richiesto più porte nella specifica del pod.
spec.containers.ports.hostPort: la porta aperta che GKE
ha assegnato a ogni container.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Difficile da capire","hardToUnderstand","thumb-down"],["Informazioni o codice di esempio errati","incorrectInformationOrSampleCode","thumb-down"],["Mancano le informazioni o gli esempi di cui ho bisogno","missingTheInformationSamplesINeed","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-09-01 UTC."],[],[],null,["# Allow direct connections to Autopilot Pods using hostPort\n\n[Autopilot](/kubernetes-engine/docs/concepts/autopilot-overview)\n\n*** ** * ** ***\n\nThis page shows you how to expose a random port in a Pod running in a\nGoogle Kubernetes Engine (GKE) Autopilot cluster.\n\nExposing a port in a Pod lets the Pod accept incoming connections directly,\nwithout a load balancer. GKE chooses a random port to open\nfrom a range that you specify in the Pod specification. This type of random\nport exposure is useful when your workload requires direct incoming connections\nbut doesn't rely on a persistent port number. An example of this type of workload is an [Agones GameServer resource](https://agones.dev/site/docs/reference/gameserver/) with the\ndefault `Dynamic` port policy.\n\nWhen you request a random port, GKE overrides the value in the\n`hostPort` field in the container specification to the port that\nGKE selected for you.\n\nBefore you begin\n----------------\n\nBefore you start, make sure that you have performed the following tasks:\n\n- Enable the Google Kubernetes Engine API.\n[Enable Google Kubernetes Engine API](https://console.cloud.google.com/flows/enableapi?apiid=container.googleapis.com)\n- If you want to use the Google Cloud CLI for this task, [install](/sdk/docs/install) and then [initialize](/sdk/docs/initializing) the gcloud CLI. If you previously installed the gcloud CLI, get the latest version by running `gcloud components update`. **Note:** For existing gcloud CLI installations, make sure to set the `compute/region` [property](/sdk/docs/properties#setting_properties). If you use primarily zonal clusters, set the `compute/zone` instead. By setting a default location, you can avoid errors in the gcloud CLI like the following: `One of [--zone, --region] must be supplied: Please specify location`. You might need to specify the location in certain commands if the location of your cluster differs from the default that you set.\n\n\u003c!-- --\u003e\n\n- Ensure that you have a [GKE Autopilot cluster](/kubernetes-engine/docs/how-to/creating-an-autopilot-cluster) running version 1.24.7-gke.1200 and later or 1.25.3-gke.1100 and later.\n\n### Limitations\n\nYou can only assign random hostPorts for static Pods or for Pods that are\nmanaged by a custom controller, such as Agones. This functionality isn't\nsupported on\n[Kubernetes managed controllers](https://kubernetes.io/docs/concepts/workloads/controllers/)\nsuch as Deployments.\n\nRequest a random port\n---------------------\n\n1. Save the following manifest as `host-port-pod.yaml`:\n\n apiVersion: v1\n kind: Pod\n metadata:\n name: game-pod\n annotations:\n autopilot.gke.io/host-port-assignment: '{\"min\":\u003cvar translate=\"no\"\u003eMIN_PORT\u003c/var\u003e,\"max\":\u003cvar translate=\"no\"\u003eMAX_PORT\u003c/var\u003e}'\n spec:\n containers:\n - name: local-chat\n image: ubuntu\n ports:\n - containerPort: 80\n hostPort: \u003cvar translate=\"no\"\u003e\u003cspan class=\"devsite-syntax-l devsite-syntax-l-Scalar devsite-syntax-l-Scalar-Plain\"\u003eHOST_PORT1\u003c/span\u003e\u003c/var\u003e\n protocol: tcp\n - name: game-server\n image: ubuntu\n ports:\n - containerPort: 80\n hostPort: \u003cvar translate=\"no\"\u003e\u003cspan class=\"devsite-syntax-l devsite-syntax-l-Scalar devsite-syntax-l-Scalar-Plain\"\u003eHOST_PORT2\u003c/span\u003e\u003c/var\u003e\n protocol: udp\n\n Replace the following:\n - \u003cvar translate=\"no\"\u003eMIN_PORT\u003c/var\u003e: the minimum port number for the range from which GKE chooses a random port.\n - \u003cvar translate=\"no\"\u003eMAX_PORT\u003c/var\u003e: the maximum port number for the range from which GKE chooses a random port.\n - \u003cvar translate=\"no\"\u003eHOST_PORT1\u003c/var\u003e`, `\u003cvar translate=\"no\"\u003eHOST_PORT2\u003c/var\u003e: any valid port number. When the Pod is scheduled, GKE updates this field with the randomly assigned port. If you have multiple containers, use different port numbers for each container.\n\n The port range (the difference between \u003cvar translate=\"no\"\u003eMAX_PORT\u003c/var\u003e\n and \u003cvar translate=\"no\"\u003eMIN_PORT\u003c/var\u003e) must be at least 1000 ports.\n2. Apply the manifest:\n\n kubectl apply -f host-port-pod.yaml\n\nWhen you apply the manifest, GKE selects a random port from your\nrange and assigns the port to your container. If GKE assigns the\nsame port value to two Pods, GKE automatically places the Pods\non separate nodes to avoid port conflict.\n\nCheck the assigned port\n-----------------------\n\nTo find the port number that GKE assigned to your containers,\ninspect the Pod: \n\n kubectl get pod game-pod --output=yaml\n\nThe output is similar to the following: \n\n apiVersion: v1\n kind: Pod\n metadata:\n annotations:\n autopilot.gke.io/host-port-assignment: '{\"min\":\u003cvar scope=\"MIN_PORT\" translate=\"no\"\u003eMIN_PORT\u003c/var\u003e,\"max\":\u003cvar scope=\"MAX_PORT\" translate=\"no\"\u003eMAX_PORT\u003c/var\u003e,\"portsAssigned\":{\"\u003cvar scope=\"HOST_PORT1\" translate=\"no\"\u003eHOST_PORT1\u003c/var\u003e\":7300,\"\u003cvar scope=\"HOST_PORT2\" translate=\"no\"\u003eHOST_PORT2\u003c/var\u003e\":7450}}'\n name: game-pod\n namespace: default\n spec:\n containers:\n - name: local-chat\n image: ubuntu\n imagePullPolicy: IfNotPresent\n ports:\n - containerPort: 80\n hostPort: 7300\n protocol: TCP\n - name: game-server\n image: ubuntu\n imagePullPolicy: IfNotPresent\n ports:\n - containerPort: 80\n hostPort: 7450\n protocol: UDP\n\nIn this output:\n\n- `metadata.annotations.autopilot.gke.io/host-port-assignment`: the port assignments, showing the original value for `hostPort` that you set for each container and the updated value for `hostPort` that GKE assigned. This field is useful if you requested multiple ports in your Pod specification.\n- `spec.containers.ports.hostPort`: the opened port that GKE assigned to each container.\n\nWhat's next\n-----------\n\n[Track Agones support on Autopilot on GitHub](https://github.com/googleforgames/agones/issues/2777)."]]