"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?Come posso ottenere i log da tutti i pod di un controller di replica di Kubernetes?
risposta
È possibile utilizzare le etichette
kubectl logs -l app=elasticsearch
Buona soluzione e molto probabilmente sufficiente per rispondere alla domanda originale ma non coda: "errore: solo uno di seguito (- f) o il selettore (-l) è permesso ". –
Inoltre, no '--all-namespace". –
Un'opzione è impostare la registrazione del cluster tramite Fluentd/ElasticSearch come descritto in https://kubernetes.io/docs/user-guide/logging/elasticsearch/. Una volta che i registri sono in ES, è facile applicare i filtri in Kibana per visualizzare i registri da determinati contenitori.
Ho creato un piccolo script di bash chiamato kubetail
che lo rende possibile. Per esempio alla coda tutti i registri per cialde chiamato "app1" Si può fare:
kubetail app1
È possibile trovare lo script here.
Io uso questo script semplice per ottenere un log dai baccelli 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
Usage: log_deployment.sh "distribuzione-name".
Script mostrerà il registro di tutti i pod che iniziano con quel "nome di distribuzione".
Se i baccelli vengono chiamati per significato si potrebbe utilizzare semplici 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: Loop attraverso l'esecuzione di baccelli con il nome contenente "nodejs". Coda il log per ognuno di essi in parallelo (la singola e commerciale viene eseguita in background) assicurando che se uno dei pod non dovesse riuscire, l'intero comando verrà chiuso (doppia e commerciale). Cat i flussi da ciascuno dei comandi di coda in un flusso unico. Eval è necessario per eseguire questo comando costruito dinamicamente.
Vorrei anche sapere se è possibile. docker-compose ha questa caratteristica ed è molto utile. – hamx0r