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


123

L'exécution kubectl logsme 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?


gardez à l'esprit que si vous ne définissez pas l'argument tail lors de l'utilisation d'un sélecteur, chaque journal de pod aura par défaut une longueur de 10 lignes
chachan le

Réponses:


175

Vous pouvez utiliser des étiquettes

kubectl logs -l app=elasticsearch

21
Bonne solution et très probablement assez pour répondre à la question d'origine mais elle ne finira pas: "erreur: un seul parmi follow (-f) ou selector (-l) est autorisé".
Nestor Urquiza

3
Et non --all-namespaces.
Eric Walker

Quel sera l'ordre de ces journaux? Je veux dire s'il y a plusieurs pods et que chaque pod aura ses propres journaux. Donc, si les journaux de tous sont affichés, dans quel ordre seront-ils affichés et comment identifier un pod source d'une ligne de journal particulière?
Shubham

6
Il semble que cela fonctionne avec -fmaintenant (à partir de Kubernetes 1.12+ / kubectl1.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.
geerlingguy

1
Est-il possible de faire de même en utilisant le tableau de bord Kubernetes.
mchawre le

70

J'ai créé un petit script bash appelé kubetailqui 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 .


Installé avec: brew tap johanhaleby/kubetail && brew install kubetail --with-short-namesdocumentation détaillée: kt -hgénial!
Khalil Gharbaoui

Impressionnant. J'ai quelques questions. `` 1. Pouvons-nous suivre les journaux de plusieurs pods appartenant à différents déploiements? Quelque chose comme "kt -l app = service1, app = service2" 2. Comment est-ce que je les écris tous dans un fichier? Faire ceci "kt -l app = service1` >> filename.log" écrit uniquement les noms des pods. 3. S'agit-il également d'une traînée en cas de déploiements à autoscaling? ``
Vasudev

19

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


13

Pour construire sur la réponse précédente si vous ajoutez, -fvous pouvez suivre les journaux.

kubectl logs -f deployment/app

10

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/

https://github.com/wercker/stern


6

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

Contenu essentiel du scénario

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



4

Vous pouvez obtenir de l'aide kubectl logs -het selon les informations,

kubectl logs -f deployment/myapp -c myapp --tail 100

-cest le nom du conteneur et --tailaffichera 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 -let spécifier une étiquette, mais en même temps, -felle ne sera pas utilisée.


3

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>

2

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

1

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.


-1

J'utilise cette commande.

kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m

1
salut! Bien que cette commande puisse résoudre la question, inclure une explication sur comment et pourquoi cela résout le problème aiderait vraiment à améliorer la qualité de votre message et entraînerait probablement plus de votes positifs. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, pas seulement à la personne qui la pose maintenant. Veuillez modifier votre réponse pour ajouter des explications et donner une indication des limites et des hypothèses applicables.
Brian le

-4

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

8
Lorsque vous obtenez des journaux par déploiement, il choisit l'un des pods répliqués (choisit au hasard) mais pas tous.
Akhil Bojedla

Vote contre le vote parce que cela ne sélectionne qu'un seul pod
Maximilian
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.