Wie erhalte ich Protokolle von allen Pods eines Kubernetes-Replikationscontrollers?

123

Laufen kubectl logszeigt mir das stderr / stdout eines Kubernetes-Containers.

Wie kann ich das aggregierte stderr / stdout einer Reihe von Pods abrufen, vorzugsweise derjenigen, die von einem bestimmten Replikationscontroller erstellt wurden?

Torsten Bronger
quelle
Denken Sie daran, dass das Nicht-Setzen des Tail-Arguments bei Verwendung eines Selektors standardmäßig jedes Pod-Protokoll auf 10 Zeilen Länge setzt
Chachan

Antworten:

175

Sie können Etiketten verwenden

kubectl logs -l app=elasticsearch
Adrian Ng
quelle
21
Gute Lösung und höchstwahrscheinlich genug, um die ursprüngliche Frage zu beantworten, aber sie wird nicht enden: "Fehler: Es ist nur eine der folgenden (-f) oder Selektoren (-l) zulässig".
Nestor Urquiza
3
Auch nein --all-namespaces.
Eric Walker
Wie wird die Reihenfolge dieser Protokolle sein? Ich meine, wenn es mehrere Pods gibt und jeder Pod seine eigenen Protokolle hat. Wenn also Protokolle von allen angezeigt werden, in welcher Reihenfolge werden sie angezeigt und wie identifiziere ich einen Quell-Pod einer bestimmten Protokollzeile?
Shubham
6
Es scheint, dass dies -fjetzt funktioniert (ab Kubernetes 1.12+ / kubectl1.12+). Auch @Shubham - es zeigt die Nachrichten in der Reihenfolge an, in der sie empfangen wurden, es gibt keine Tags oder irgendetwas in den Protokollzeilen. Dies dient nur zum schnellen Debuggen. Wenn Sie mehr Protokolldetails benötigen, müssen Sie Ihre Protokolle an ein zentrales Protokollierungssystem wie EFK, SumoLogic, Datadog usw.
senden
1
Gibt es sowieso das gleiche mit kubernetes Dashboard zu tun.
Mchawre
69

Ich habe ein kleines Bash-Skript namens erstellt kubetail, das dies ermöglicht. Um beispielsweise alle Protokolle für Pods mit dem Namen "app1" zu beenden, können Sie Folgendes tun:

kubetail app1

Das Skript finden Sie hier .

Johan
quelle
Installiert mit: brew tap johanhaleby/kubetail && brew install kubetail --with-short-namesDetaillierte Dokumentation: kt -hSuper!
Khalil Gharbaoui
Genial. Ich habe ein paar Fragen. `` `1. Können wir Protokolle mehrerer Pods verfolgen, die zu verschiedenen Bereitstellungen gehören? So etwas wie "kt -l app = service1, app = service2" 2. Wie schreibe ich sie alle in eine Datei? Wenn Sie dies tun, schreibt "kt -l app = service1` >> filename.log" nur Pod-Namen darauf. 3. Wird es auch bei Bereitstellungen mit automatischer Skalierung eingestellt? `` `
Vasudev
18

Sie können die Protokolle aus mehreren Containern mithilfe von Etiketten abrufen, wie von Adrian Ng vorgeschlagen:

kubectl logs --selector app=yourappname

Wenn Sie einen Pod mit mehreren Containern haben, schlägt der obige Befehl fehl und Sie müssen den Containernamen angeben:

kubectl logs --selector app=yourappname --container yourcontainername

Hinweis: Wenn Sie sehen möchten, welche Beschriftungen Ihnen zur Verfügung stehen, werden sie mit dem folgenden Befehl alle aufgelistet:

kubectl get pod <one of your pods> -o template --template='{{.metadata.labels}}'

... wo die Ausgabe ungefähr so ​​aussehen wird

map [app: yourappname controller-revision-hash: 598302898 pod-vorlagengenerierung: 1]

Beachten Sie, dass einige der Labels möglicherweise nicht von anderen Pods geteilt werden. Die Auswahl von "App" scheint die einfachste zu sein

Jean Spector
quelle
13

Um auf der vorherigen Antwort aufzubauen -f, können Sie die Protokolle beenden.

kubectl logs -f deployment/app
Ruben
quelle
10

Zuvor bereitgestellte Lösungen sind nicht so optimal. Das kubernetes-Team selbst hat vor einiger Zeit eine Lösung namens stern bereitgestellt.

stern app1

Es stimmt auch mit regulären Ausdrücken überein und führt standardmäßig tail und -f (follow) aus. Ein schöner Vorteil ist, dass es Ihnen auch den Pod zeigt, der das Protokoll generiert hat.

app1-12381266dad-3233c foobar log
app1-99348234asd-959cc foobar log2

Holen Sie sich die Go-Binärdatei für Linux oder installieren Sie sie über Brew für OSX.

https://kubernetes.io/blog/2016/10/tail-kubernetes-with-stern/

https://github.com/wercker/stern

Wien
quelle
6

Ich verwende dieses einfache Skript, um ein Protokoll aus den Pods einer Bereitstellung abzurufen:

#!/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

Kern des Drehbuchs

Verwendung: log_deployment.sh "Bereitstellungsname".

Das Skript zeigt dann das Protokoll aller Pods an, die mit diesem "Bereitstellungsnamen" beginnen.

Martlark
quelle
4

Sie können Hilfe von kubectl logs -hund gemäß den Informationen erhalten,

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

-cist der Containername und --tailzeigt die neuesten Zahlenlinien an. Dabei wird jedoch ein Pod der Bereitstellung ausgewählt, nicht alle Pods. Dies ist etwas, das Sie beachten müssen.

kubectl logs -l app=myapp -c myapp --tail 100

Wenn Sie Protokolle aller Pods -lanzeigen möchten, können Sie eine Beschriftung verwenden und angeben, diese wird jedoch gleichzeitig -fnicht verwendet.

zimmer
quelle
3

Sie können dies auch anhand des Dienstnamens tun.

Versuchen Sie zunächst, den Dienstnamen des jeweiligen Pods zu ermitteln, der mehreren Pods desselben Dienstes entspricht. kubectl get svc.

Führen Sie als Nächstes den folgenden Befehl aus, um Protokolle von jedem Container anzuzeigen.

kubectl logs -f service/<service-name>
Harshit
quelle
2

In diesem Beispiel können Sie das <namespace>und ersetzen <app-name>, um die Protokolle abzurufen, wenn in einem Pod mehrere Container definiert sind.

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

Wenn die Pods sinnvoll benannt sind, könnte man einfachen Plain Old Bash verwenden:

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

Erläuterung: Durchlaufen Sie laufende Pods mit dem Namen "nodejs". Tail das Protokoll für jeden von ihnen parallel (einzelnes kaufmännisches Und läuft im Hintergrund), um sicherzustellen, dass der gesamte Befehl beendet wird, wenn eines der Pods fehlschlägt (doppeltes kaufmännisches Und). Ordnen Sie die Streams von jedem der Tail-Befehle einem eindeutigen Stream zu. Eval wird benötigt, um diesen dynamisch erstellten Befehl auszuführen.

Nestor Urquiza
quelle
-1

Ich benutze diesen Befehl.

kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
Muhammad Naeem
quelle
1
Hallo! Während dieser Befehl die Frage lösen kann, einschließlich einer Erklärung, wie und warum dies das Problem löst, würde dies wirklich dazu beitragen, die Qualität Ihres Beitrags zu verbessern, und wahrscheinlich zu mehr Up-Votes führen. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt. Bitte bearbeiten Sie Ihre Antwort, um Erklärungen hinzuzufügen und anzugeben, welche Einschränkungen und Annahmen gelten.
Brian
-4

Ich bin mir nicht sicher, ob dies eine neue Sache ist, aber mit Bereitstellungen ist es möglich, dies folgendermaßen zu tun:

kubectl logs deployment/app1
Rasmus Rømer
quelle
8
Wenn Sie Protokolle durch Bereitstellung erhalten, wird einer der replizierten Pods ausgewählt (zufällig ausgewählt), jedoch nicht alle.
Akhil Bojedla
Downvoting, weil dies nur einen Pod auswählt
Maximilian