Autoriser les connexions directes à des pods Autopilot à l'aide de hostPort


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

  1. 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 et MIN_PORT) doit être d'au moins 1 000 ports.

  2. 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 pour hostPort que vous avez définie pour chaque conteneur et la valeur mise à jour pour hostPort 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