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