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 au pod d'accepter directement les connexions entrantes, sans équilibreur de charge. GKE choisit un port aléatoire à ouvrir dans une plage que vous spécifiez dans la spécification du pod. Ce type d'exposition de port aléatoire 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 GameServer Agones avec la stratégie 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 :
- Activez l'API Google Kubernetes Engine. Activer l'API Google Kubernetes Engine
- 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 que pour des pods statiques ou pour des pods 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
: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
Remplacez les éléments suivants :
MIN_PORT
: numéro de port minimal de la plage à partir de 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 disposez de plusieurs conteneurs, utilisez des numéros de port différents pour chacun d'eux.
La plage de ports (différence entre
MAX_PORT
etMIN_PORT
) doit être d'au moins 1 000 ports.Appliquer le fichier manifeste :
kubectl apply -f host-port-pod.yaml
Lorsque vous appliquez le fichier manifeste, GKE sélectionne un port aléatoire de 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 afin d'éviter tout conflit de port.
Vérifier le port attribué
Pour trouver le numéro de port attribué par GKE à vos conteneurs, inspectez le pod:
kubectl get pod game-pod --output=yaml
Le résultat ressemble à ce qui suit :
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
Dans ce résultat :
metadata.annotations.autopilot.gke.io/host-port-assignment
: attributions de port, indiquant la valeur d'origine dehostPort
que vous avez définie pour chaque conteneur et la valeur mise à jour dehostPort
attribuée par GKE. Ce champ est utile si vous avez demandé plusieurs ports dans la spécification de pod.spec.containers.ports.hostPort
: port ouvert que GKE a attribué à chaque conteneur.
Étapes suivantes
Suivez l'assistance Agones sur Autopilot sur GitHub.