L'exécution kubectl logs
me montre le stderr / stdout d'un conteneur Kubernetes.
Comment puis-je obtenir le stderr / stdout agrégé d'un ensemble de pods, de préférence ceux créés par un certain contrôleur de réplication?
L'exécution kubectl logs
me montre le stderr / stdout d'un conteneur Kubernetes.
Comment puis-je obtenir le stderr / stdout agrégé d'un ensemble de pods, de préférence ceux créés par un certain contrôleur de réplication?
Réponses:
Vous pouvez utiliser des étiquettes
kubectl logs -l app=elasticsearch
--all-namespaces
.
-f
maintenant (à partir de Kubernetes 1.12+ / kubectl
1.12+). Aussi @Shubham - il affiche les messages dans l'ordre reçu, il n'y a pas de balises ou quoi que ce soit sur les lignes de journal. C'est juste pour un débogage rapide. Si vous avez besoin de plus de détails sur les journaux, vous devrez envoyer vos journaux à un système de journalisation central tel que EFK, SumoLogic, Datadog, etc.
J'ai créé un petit script bash appelé kubetail
qui rend cela possible. Par exemple, pour suivre tous les journaux des pods nommés "app1", vous pouvez faire:
kubetail app1
Vous pouvez trouver le script ici .
brew tap johanhaleby/kubetail && brew install kubetail --with-short-names
documentation détaillée: kt -h
génial!
Vous pouvez obtenir les journaux de plusieurs conteneurs en utilisant des étiquettes comme Adrian Ng l'a suggéré:
kubectl logs --selector app=yourappname
Si vous avez un pod avec plusieurs conteneurs, la commande ci-dessus échouera et vous devrez spécifier le nom du conteneur:
kubectl logs --selector app=yourappname --container yourcontainername
Remarque: si vous souhaitez voir quelles étiquettes vous sont disponibles, la commande suivante les répertorie toutes:
kubectl get pod <one of your pods> -o template --template='{{.metadata.labels}}'
... où la sortie ressemblera à quelque chose comme
map [app: yourappname controller-revision-hash: 598302898 pod-template-generation: 1]
Notez que certains des libellés peuvent ne pas être partagés par d'autres pods - choisir "application" semble être le plus simple
Les solutions fournies précédemment ne sont pas optimales. L'équipe kubernetes elle-même a fourni une solution il y a quelque temps, appelée stern.
stern app1
Il correspond également aux expressions régulières et fait par défaut tail et -f (follow). Un avantage appréciable est qu'il vous montre également le pod qui a généré le journal.
app1-12381266dad-3233c foobar log
app1-99348234asd-959cc foobar log2
Prenez le go-binary pour Linux ou installez via brew pour OSX.
https://kubernetes.io/blog/2016/10/tail-kubernetes-with-stern/
J'utilise ce script simple pour obtenir un journal des pods d'un déploiement:
#!/usr/bin/env bash
DEPLOYMENT=$1
for p in $(kubectl get pods | grep ^${DEPLOYMENT}- | cut -f 1 -d ' '); do
echo ---------------------------
echo $p
echo ---------------------------
kubectl logs $p
done
Utilisation: log_deployment.sh "nom-de-déploiement".
Le script affichera alors le journal de tous les pods commençant par ce "nom de déploiement".
Une option consiste à configurer la journalisation du cluster via Fluentd / ElasticSearch comme décrit à l' adresse https://kubernetes.io/docs/user-guide/logging/elasticsearch/ . Une fois les journaux dans ES, il est facile d'appliquer des filtres dans Kibana pour afficher les journaux de certains conteneurs.
Vous pouvez obtenir de l'aide kubectl logs -h
et selon les informations,
kubectl logs -f deployment/myapp -c myapp --tail 100
-c
est le nom du conteneur et --tail
affichera les dernières lignes numériques , mais cela choisira un pod du déploiement, pas tous les pods. C'est quelque chose que vous devez garder à l'esprit.
kubectl logs -l app=myapp -c myapp --tail 100
Si vous souhaitez afficher les journaux de tous les pods, vous pouvez utiliser -l
et spécifier une étiquette, mais en même temps, -f
elle ne sera pas utilisée.
Vous pouvez également le faire par nom de service.
Tout d'abord, essayez de trouver le nom de service du pod respectif qui correspond à plusieurs pods du même service. kubectl get svc
.
Ensuite, exécutez la commande suivante pour afficher les journaux de chaque conteneur.
kubectl logs -f service/<service-name>
Dans cet exemple, vous pouvez remplacer <namespace>
et <app-name>
pour obtenir les journaux lorsque plusieurs conteneurs sont définis dans un pod.
kubectl -n <namespace> logs -f deployment/<app-name>
--all-containers=true --since=10m
Si les pods sont nommés de manière significative, on peut utiliser un simple Plain Old Bash:
keyword=nodejs
command="cat <("
for line in $(kubectl get pods | \
grep $keyword | grep Running | awk '{print $1}'); do
command="$command (kubectl logs --tail=2 -f $line &) && "
done
command="$command echo)"
eval $command
Explication: Parcourez les pods en cours d'exécution dont le nom contient "nodejs". Complétez le journal de chacun d'eux en parallèle (une seule esperluette s'exécute en arrière-plan) en vous assurant que si l'un des pods échoue, la commande entière se termine (double esperluette). Transformez les flux de chacune des commandes tail en un flux unique. Eval est nécessaire pour exécuter cette commande générée dynamiquement.
J'utilise cette commande.
kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
Je ne sais pas si c'est une nouveauté, mais avec les déploiements, il est possible de le faire comme ceci:
kubectl logs deployment/app1