L'esecuzione kubectl logs
mi 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?
L'esecuzione kubectl logs
mi 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?
Risposte:
Puoi usare le etichette
kubectl logs -l app=elasticsearch
--all-namespaces
.
-f
funzioni con ora (a partire da Kubernetes 1.12+ / kubectl
1.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.
Ho creato un piccolo script bash chiamato kubetail
che lo rende possibile. Ad esempio, per codificare tutti i log per i pod denominati "app1" puoi fare:
kubetail app1
Puoi trovare lo script qui .
brew tap johanhaleby/kubetail && brew install kubetail --with-short-names
documentazione dettagliata: kt -h
Awesome!
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
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/
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
Utilizzo: log_deployment.sh "nome-distribuzione".
Lo script mostrerà quindi il registro di tutti i pod che iniziano con quel "nome-distribuzione".
Un'opzione è configurare la registrazione del cluster tramite Fluentd / ElasticSearch come descritto su https://kubernetes.io/docs/user-guide/logging/elasticsearch/ . Una volta che i log sono in ES, è facile applicare filtri in Kibana per visualizzare i log da determinati contenitori.
Puoi ottenere aiuto da kubectl logs -h
e secondo le informazioni,
kubectl logs -f deployment/myapp -c myapp --tail 100
-c
è il nome del contenitore e --tail
mostrerà 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 -l
e specificare un'etichetta, ma allo stesso tempo -f
non verrà usata.
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>
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
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.
Uso questo comando.
kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
Non sono sicuro che questa sia una cosa nuova, ma con le distribuzioni è possibile farlo in questo modo:
kubectl logs deployment/app1