Laufen kubectl logs
zeigt 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?
Laufen kubectl logs
zeigt 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?
Antworten:
Sie können Etiketten verwenden
kubectl logs -l app=elasticsearch
--all-namespaces
.
-f
jetzt funktioniert (ab Kubernetes 1.12+ / kubectl
1.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.
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 .
brew tap johanhaleby/kubetail && brew install kubetail --with-short-names
Detaillierte Dokumentation: kt -h
Super!
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
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/
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
Verwendung: log_deployment.sh "Bereitstellungsname".
Das Skript zeigt dann das Protokoll aller Pods an, die mit diesem "Bereitstellungsnamen" beginnen.
Eine Möglichkeit besteht darin, die Clusterprotokollierung über Fluentd / ElasticSearch einzurichten, wie unter https://kubernetes.io/docs/user-guide/logging/elasticsearch/ beschrieben . Sobald sich Protokolle in ES befinden, können Filter in Kibana einfach angewendet werden, um Protokolle aus bestimmten Containern anzuzeigen.
Sie können Hilfe von kubectl logs -h
und gemäß den Informationen erhalten,
kubectl logs -f deployment/myapp -c myapp --tail 100
-c
ist der Containername und --tail
zeigt 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 -l
anzeigen möchten, können Sie eine Beschriftung verwenden und angeben, diese wird jedoch gleichzeitig -f
nicht verwendet.
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>
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
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.
Ich benutze diesen Befehl.
kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
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