web-dev-qa-db-fra.com

Trouver le nom d'un nouveau pod avec kubectl

Je suis nouveau sur k8s et je rencontre un petit problème ici.

Voici le contexte: je dois invoquer kubectl delete [podname] via une crontask une fois par jour, et attendez que k8s recrée le pod, puis connectez-vous au conteneur dans ce pod et exécutez une commande Shell.

Je demande donc le déploiement et j'obtiens quelque chose comme ceci:

user@Host:~$ kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
firstpod-123456789-something           1/1       Running   570        2d
secondpod-http-backend-something       1/1       Running   597        2d

puis j'ai écrit un script bash qui supprimerait les pods dans un intervalle de 5 minutes. Voilà la partie facile.

Supposons que j'invoque kubectl delete firstpod-123456789-something et attendez que k8s recrée un nouveau pod. Ce nouveau pod aurait un nouveau nom comme firstpod-[some random hash here]-something

Le problème est que je dois capturer le nom de ce pod dans mon script bash afin que je puisse exécuter une commande dans ce pod comme uname -a ou quoi que ce soit pour vérifier que le nouveau pod fonctionne correctement.

Je l'ai googlé et lu les documents de kubectl mais je ne pense pas qu'il existe un moyen facile de le faire via un script bash? Je suppose que le seul moyen d'obtenir le nom du pod ici serait via l'API k8s?

Je suis heureux d'utiliser n'importe quelle solution à ce stade. Je me demande s'il y a un moyen de renommer le nouveau pod lorsque k8s en crée un nouveau? pour que je puisse chercher un mot clé spécifique?

Notez que je ne veux pas egrep quelque chose comme firstpod-[0-9]-something parce que ce n'est qu'un exemple. Beaucoup de pods ont beaucoup de noms différents, ce n'était qu'un exemple.

Merci!

19
Bluz

Vous devez étiqueter votre deployment d'une manière ou d'une autre, par exemple, nous définissons l'étiquette app: myapp au dessous de:

apiVersion: extensions/v1beta1                                                                                                                                                                          
kind: Deployment                                                                                                                                                                                        
metadata:                                                                                                                                                                                               
  name: nginx                                                                                                                                                                                     
spec:                                                                                                                                                                                                   
  template:                                                                                                                                                                                             
    metadata:                                                                                                                                                                                           
      labels:                                                                                                                                                                                           
        app: my-app                                                                                                                                                                                
    spec:                                                                                                                                                                                               
      containers:                                                                                                                                                                                       
      - image: nginx                                                                                                                                                    
        name: nginx  

Après cela, vous pouvez obtenir le nom du module de déploiement très facilement:

POD=$(kubectl get pod -l app=my-app -o jsonpath="{.items[0].metadata.name}")

et y exécuter une commande, par exemple:

kubectl exec -ti $POD -- uname -a
36
Nickolay

Comme Nickolay l'a écrit, utilisez une étiquette pour faciliter la sélection. Ensuite, vous pouvez utiliser

kubectl get pods -l app=my-app -o custom-columns=:metadata.name

Cela vous donne le nom du pod qui a le libellé "app = my-app"

5
P.Stromberg