web-dev-qa-db-fra.com

Comment obtenir les journaux de tous les pods d'un contrôleur de réplication Kubernetes?

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

77
Torsten Bronger

Vous pouvez utiliser des étiquettes

kubectl logs -l app=elasticsearch
104
Adrian Ng

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 .

56
Johan

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.

9
Jean Spector

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.

5
Thuc Nguyen

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

Résumé du script

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

4
Martlark

Pour compléter la réponse précédente si vous ajoutez -f, vous pouvez aligner les journaux.

kubectl logs -f deployment/app
4
Ruben

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/

https://github.com/wercker/stern

2
vienna

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.

1
Nestor Urquiza

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
0
Rasmus Rømer

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é.

0
zimmer