Cette page explique comment exposer un port aléatoire dans un pod exécuté dans un cluster Google Kubernetes Engine (GKE) Autopilot.
L'exposition d'un port dans un pod permet à celui-ci d'accepter directement les connexions entrantes, sans équilibreur de charge. GKE choisit un port aléatoire à ouvrir à partir d'une plage que vous spécifiez dans la spécification du pod. Ce type d'exposition aléatoire des ports est utile lorsque votre charge de travail nécessite des connexions entrantes directes, mais ne repose pas sur un numéro de port persistant. Un exemple de ce type de charge de travail est une ressource Agones GameServer avec la règle de port Dynamic par défaut.
Lorsque vous demandez un port aléatoire, GKE remplace la valeur du champ hostPort dans la spécification du conteneur par le port que GKE a sélectionné pour vous.
Avant de commencer
Avant de commencer, effectuez les tâches suivantes :
Si vous souhaitez utiliser Google Cloud CLI pour cette tâche, installez puis initialisez gcloud CLI. Si vous avez déjà installé gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande gcloud components update.
Assurez-vous de disposer d'un cluster GKE Autopilot exécutant la version 1.24.7-gke.1200 ou ultérieure, ou la version 1.25.3-gke.1100 ou ultérieure.
Limites
Vous ne pouvez attribuer des hostPorts aléatoires qu'aux pods statiques ou à ceux gérés par un contrôleur personnalisé, tel qu'Agones. Cette fonctionnalité n'est pas compatible avec les contrôleurs gérés par Kubernetes, tels que les déploiements.
Demander un port aléatoire
Enregistrez le manifeste suivant sous le nom host-port-pod.yaml :
MIN_PORT : numéro de port minimal de la plage dans laquelle GKE choisit un port aléatoire.
MAX_PORT : numéro de port maximal de la plage dans laquelle GKE choisit un port aléatoire.
HOST_PORT1, HOST_PORT2 : un numéro de port valide. Lorsque le pod est planifié, GKE met à jour ce champ avec le port attribué de manière aléatoire. Si vous avez plusieurs conteneurs, utilisez des numéros de port différents pour chacun d'eux.
La plage de ports (la différence entre MAX_PORT et MIN_PORT) doit comporter au moins 1 000 ports.
Appliquer le fichier manifeste :
kubectlapply-fhost-port-pod.yaml
Lorsque vous appliquez le fichier manifeste, GKE sélectionne un port aléatoire dans votre plage et l'attribue à votre conteneur. Si GKE attribue la même valeur de port à deux pods, il les place automatiquement sur des nœuds distincts pour éviter tout conflit de port.
Vérifier le port attribué
Pour trouver le numéro de port que GKE a attribué à vos conteneurs, inspectez le pod :
metadata.annotations.autopilot.gke.io/host-port-assignment : les attributions de ports, qui indiquent la valeur d'origine de hostPort que vous avez définie pour chaque conteneur et la valeur mise à jour de hostPort que GKE a attribuée. Ce champ est utile si vous avez demandé plusieurs ports dans la spécification de votre pod.
spec.containers.ports.hostPort : port ouvert que GKE a attribué à chaque conteneur.
Sauf indication contraire, le contenu de cette page est régi par une licence Creative Commons Attribution 4.0, et les échantillons de code sont régis par une licence Apache 2.0. Pour en savoir plus, consultez les Règles du site Google Developers. Java est une marque déposée d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/09/01 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Difficile à comprendre","hardToUnderstand","thumb-down"],["Informations ou exemple de code incorrects","incorrectInformationOrSampleCode","thumb-down"],["Il n'y a pas l'information/les exemples dont j'ai besoin","missingTheInformationSamplesINeed","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 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)."]]