2 votes

Les ports dans le pod ne sont pas les mêmes que dans le descripteur de déploiement

Nous avons constaté que les ports définis dans notre descriptif de déploiement de daemonset ne sont pas reflétés dans les pods en cours d'exécution. L'image que nous utilisons est NGINX, et nous avons routé ces ports hôtes vers 80 et 8080 :

       ports:
        - containerPort: 80
          hostPort: 30003
        - containerPort: 8080
          hostPort: 30002

Rien d'anormal là-dedans, et l'historique de déploiement montre que ces ports sont actifs dans le pod :

daemonset.extensions/nginx-licensed avec la révision n°25
Modèle de pod :
  Conteneurs :
   nginx-licensed :
    Image : nginx-licensed:1.0.117
    Ports : 80/TCP, 8080/TCP
    Ports hôte : 30003/TCP, 30002/TCP

Nous voulions changer le port hôte utilisé et, pour permettre les changements d'infrastructure à être effectués progressivement, nous avons attribué à la fois les anciens et les nouveaux ports hôtes aux mêmes ports de contenu :

        ports:
        - nom : new80
          containerPort: 80
          hostPort: 20003
        - nom : old80
          containerPort: 80
          hostPort: 30003
        - nom : new8080
          containerPort: 8080
          hostPort: 20002
        - nom : old8080
          containerPort: 8080
          hostPort: 30002

À ce stade, 'kubectl apply' n'active que les ports 2000x :

daemonset.extensions/nginx-licensed avec la révision n°26
Modèle de pod :
  Conteneurs :
   nginx-licensed :
    Image : nginx-licensed:1.0.119
    Ports : 80/TCP, 8080/TCP
    Ports hôte : 20003/TCP, 20002/TCP

À noter que si nous redémarrons les pods, les quatre ports deviennent actifs :

daemonset.extensions/nginx-licensed avec la révision n°1
Modèle de pod :
  Conteneurs :
   nginx-licensed :
    Image : nginx-licensed:1.0.119
    Ports : 80/TCP, 80/TCP, 8080/TCP, 8080/TCP
    Ports hôte : 20003/TCP, 30003/TCP, 20002/TCP, 30002/TCP

Cependant, si nous ne redémarrons pas les pods et essayons de supprimer les pods 3000x, c'est-à-dire ceci :

        ports:
        - containerPort: 80
          hostPort: 20003
        - containerPort: 8080
          hostPort: 20002

Nous nous retrouvons sans ports de conteneur ! :

daemonset.extensions/nginx-licensed avec la révision n°27
Modèle de pod :
  Conteneurs :
   nginx-licensed :
    Image : nginx-licensed:1.0.119
    Ports : 80/TCP, 8080/TCP
    Ports hôte : 0/TCP, 0/TCP

Avez-vous une idée de ce qui se passe, ou de ce que nous avons mal fait ? Nous sommes revenus à la version avec quatre ports définis (c'est-à-dire à la fois 2000x et 3000x), et cela a résulté uniquement dans les ports hôtes 2000x actifs.

Cela ressemble-t-il à un bogue ?

Merci !

0voto

Mark Watney Points 3543

J'ai reproduit votre scénario sur GKE et j'ai les mêmes symptômes que vous.

Il y a un moyen d'atteindre ce dont vous avez besoin et pour cela vous devez modifier vos objets. Vous devez utiliser le type de patch merge-patch+json et en tant que patch, vous devez fournir une liste complète/désirée de containerPort.

Tout d'abord, vous devez exporter votre fichier yaml et apporter les modifications nécessaires:

$ kubectl get deployments  -o yaml --export > patch-file.yaml

Après avoir apporté les modifications, appliquez le patch:

$ kubectl patch deployments  --type merge --patch "$(cat patch-file.yaml)"

Après avoir fait cela, j'ai votre état souhaité:

$ kubectl describe deployments nginx-deployment | grep -i ports
    Ports: 80 / TCP, 80 / TCP, 8080 / TCP, 8080 / TCP
    Ports hôtes: 20003 / TCP, 30003 / TCP, 20002 / TCP, 30002 / TCP

Si vous souhaitez approfondir la compréhension de la façon dont cela fonctionne en arrière-plan, consultez la documentation ici et ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X