Come ottengo i log da tutti i pod di un controller di replica Kubernetes?


123

L'esecuzione kubectl logsmi mostra lo stderr / stdout di un contenitore Kubernetes.

Come posso ottenere lo stderr / stdout aggregato di un set di pod, preferibilmente quelli creati da un determinato controller di replica?


tenere presente che se non si imposta l'argomento di coda quando si utilizza un selettore, ogni registro pod avrà una lunghezza predefinita di 10 righe
chachan

Risposte:


175

Puoi usare le etichette

kubectl logs -l app=elasticsearch

21
Buona soluzione e molto probabilmente abbastanza per rispondere alla domanda originale ma non seguirà: "errore: è consentito solo uno tra follow (-f) o selector (-l)".
Nestor Urquiza

3
Inoltre, no --all-namespaces.
Eric Walker,

Quale sarà l'ordine di quei registri? Voglio dire, se ci sono più pod e ogni pod avrà i propri log. Quindi, se vengono visualizzati i registri di tutti, in quale ordine verranno visualizzati e come si identifica un pod di origine di una particolare riga di registro?
Shubham

6
Sembra che -ffunzioni con ora (a partire da Kubernetes 1.12+ / kubectl1.12+). Anche @Shubham: visualizza i messaggi nell'ordine ricevuto, non ci sono tag o altro sulle righe di registro. Questo è solo per il debug veloce. Se hai bisogno di maggiori dettagli sul log, dovrai spedire i tuoi log a un sistema di registrazione centrale come EFK, SumoLogic, Datadog, ecc.
geerlingguy

1
C'è comunque da fare lo stesso usando il dashboard di Kubernetes.
mchawre

70

Ho creato un piccolo script bash chiamato kubetailche lo rende possibile. Ad esempio, per codificare tutti i log per i pod denominati "app1" puoi fare:

kubetail app1

Puoi trovare lo script qui .


Installato con: brew tap johanhaleby/kubetail && brew install kubetail --with-short-namesdocumentazione dettagliata: kt -hAwesome!
Khalil Gharbaoui

Eccezionale. Ho un paio di domande. `` 1. Possiamo tail log di più pod appartenenti a distribuzioni diverse? Qualcosa come "kt -l app = service1, app = service2" 2. Come scrivo tutto su un file? In questo modo "kt -l app = service1` >> filename.log" vi scrive solo i nomi dei pod. 3. Viene ritardato anche in caso di implementazioni a scalabilità automatica? ``
Vasudev

19

Puoi ottenere i registri da più contenitori utilizzando le etichette come suggerito da Adrian Ng:

kubectl logs --selector app=yourappname

Nel caso in cui tu abbia un pod con più contenitori, il comando precedente fallirà e dovrai specificare il nome del contenitore:

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

Nota: se desideri vedere quali etichette sono disponibili, il seguente comando le elencherà tutte:

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

... dove l'output avrà un aspetto simile

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

Tieni presente che alcune delle etichette potrebbero non essere condivise da altri pod: la scelta di "app" sembra la più semplice


13

Per costruire sulla risposta precedente, se aggiungi -f, puoi accodare i log.

kubectl logs -f deployment/app

10

Le soluzioni fornite in precedenza non sono ottimali. Il team di Kubernetes stesso ha fornito tempo fa una soluzione, chiamata stern.

stern app1

Fa anche corrispondere espressioni regolari e fa tail e -f (follow) per impostazione predefinita. Un bel vantaggio è che ti mostra anche il pod che ha generato il registro.

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

Prendi il go-binary per Linux o installa tramite brew per OSX.

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

https://github.com/wercker/stern


6

Uso questo semplice script per ottenere un registro dai pod di una distribuzione:

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

Sintesi della sceneggiatura

Utilizzo: log_deployment.sh "nome-distribuzione".

Lo script mostrerà quindi il registro di tutti i pod che iniziano con quel "nome-distribuzione".



4

Puoi ottenere aiuto da kubectl logs -he secondo le informazioni,

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

-cè il nome del contenitore e --tailmostrerà le ultime num righe , ma questo sceglierà un pod della distribuzione, non tutti i pod. Questo è qualcosa che devi tenere a mente.

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

Se vuoi mostrare i log di tutti i pod, puoi usare -le specificare un'etichetta, ma allo stesso tempo -fnon verrà usata.


3

Puoi farlo anche in base al nome del servizio.

Innanzitutto, prova a trovare il nome del servizio del rispettivo pod che corrisponde a più pod dello stesso servizio. kubectl get svc.

Quindi, esegui il seguente comando per visualizzare i log di ogni contenitore.

kubectl logs -f service/<service-name>

2

In questo esempio, è possibile sostituire <namespace>e <app-name>per ottenere i log quando sono presenti più contenitori definiti in un pod.

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

1

Se i baccelli hanno un nome significativo, si potrebbe usare un semplice 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

Spiegazione: ciclo tra i pod in esecuzione con il nome contenente "nodejs". Coda il registro per ciascuno di essi in parallelo (singola e commerciale viene eseguito in background) assicurandosi che se uno qualsiasi dei pod fallisce, l'intero comando esce (doppia e commerciale). Cat i flussi da ciascuno dei comandi della coda in un flusso unico. Eval è necessario per eseguire questo comando creato dinamicamente.


-1

Uso questo comando.

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

1
Ciao! Sebbene quel comando possa risolvere la domanda, inclusa una spiegazione di come e perché questo risolve il problema aiuterebbe davvero a migliorare la qualità del tuo post e probabilmente si tradurrebbe in più voti positivi. Ricorda che stai rispondendo alla domanda per i lettori in futuro, non solo alla persona che chiede ora. Si prega di modificare la risposta per aggiungere spiegazioni e dare un'indicazione di ciò si applicano le limitazioni e le assunzioni.
Brian il

-4

Non sono sicuro che questa sia una cosa nuova, ma con le distribuzioni è possibile farlo in questo modo:

kubectl logs deployment/app1

8
Quando si ottengono i log tramite la distribuzione, sceglie uno qualsiasi dei pod replicati (sceglie in modo casuale) ma non tutti.
Akhil Bojedla

Downvoting perché questo seleziona solo un pod
Maximilian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.