Cette page explique comment exposer un port aléatoire dans un pod exécuté dans un cluster Autopilot de Google Kubernetes Engine (GKE).
L'exposition d'un port dans un pod permet aux pods 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 des ports aléatoires 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 GameServers Agones avec la règle de port Dynamic
par défaut.
Lorsque vous demandez un port aléatoire, GKE remplace la valeur du champ hostPort
de la spécification de 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 les versions 1.24.7-gke.1200 et ultérieures, ou 1.25.3-gke.1100 et ultérieures.
Limites
Vous ne pouvez attribuer des hostPorts aléatoires que pour les pods statiques ou les 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 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 pour la plage à partir de laquelle GKE choisit un port aléatoire.MAX_PORT
: numéro de port maximal pour la plage à partir de 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'entre eux.
La plage de ports (la 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 attribue le port à votre conteneur. Si GKE attribue la même valeur de port à deux pods, il place automatiquement les pods 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 ports indiquant la valeur d'origine pourhostPort
que vous avez définie pour chaque conteneur et la valeur mise à jour pourhostPort
attribuée par GKE. Ce champ est utile si vous avez demandé plusieurs ports dans la spécification de votre pod.spec.containers.ports.hostPort
: port ouvert attribué par GKE à chaque conteneur.
Étapes suivantes
Suivre la compatibilité d'Agones avec Autopilot sur GitHub