"kubectl logs" me montre le stderr/stdout d'un conteneur Kubernetes. Comment 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?
Vous pouvez utiliser des étiquettes
kubectl logs -l app=elasticsearch
J'ai créé un petit script bash appelé kubetail
qui rend cela possible. Par exemple, pour aligner tous les journaux des pods nommés "app1", vous pouvez faire:
kubetail app1
Vous pouvez trouver le script ici .
Vous pouvez obtenir les journaux de plusieurs conteneurs à l'aide d'étiquettes, comme l'a suggéré Adrian Ng:
kubectl logs --selector app=yourappname
Si vous avez un pod avec plusieurs conteneurs, la commande ci-dessus va échouer et vous devez spécifier le nom du conteneur:
kubectl logs --selector app=yourappname --container yourcontainername
Remarque: Si vous voulez voir quelles étiquettes sont disponibles, la commande suivante les listera 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 certaines étiquettes peuvent ne pas être partagées par d'autres pods - choisir "app" semble être le plus simple.
Une option consiste à configurer la journalisation de cluster via Fluentd/ElasticSearch, comme décrit à l’adresse https://kubernetes.io/docs/user-guide/logging/elasticsearch/ . Une fois que les journaux sont dans ES, il est facile d'appliquer des filtres dans Kibana pour afficher les journaux de certains conteneurs.
J'utilise ce script simple pour obtenir un journal à partir 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 ensuite le journal de tous les pods commençant par ce "nom de déploiement".
Pour compléter la réponse précédente si vous ajoutez -f
, vous pouvez aligner les journaux.
kubectl logs -f deployment/app
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 poupe.
stern app1
Il correspond également aux expressions régulières et fait tail et -f (follow) par défaut. Un bon avantage 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-le via brew pour OSX.
https://kubernetes.io/blog/2016/10/tail-kubernetes-with-stern/
Si les pods sont nommés de manière significative, vous pouvez 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 portant le nom "nodejs". Découpez le journal de chacun d’eux en parallèle (une seule esperluette s’exécute en arrière-plan) en veillant à ce que, en cas d’échec des pods, toute la commande se termine (double esperluette). Cat les flux de chacune des commandes de queue dans un flux unique. Eval est nécessaire pour exécuter cette commande construite dynamiquement.
Pas sûr que ce soit une nouveauté, mais avec les déploiements, il est possible de le faire comme ceci:
kubectl logs deployment/app1
Vous pouvez obtenir de l'aide de 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, mais pas tous. 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 un libellé, mais en même temps, -f
ne sera pas utilisé.