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 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

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