¿Cómo obtengo registros de todos los pods de un controlador de replicación de Kubernetes?

123

La ejecución kubectl logsme muestra el stderr / stdout de un contenedor de Kubernetes.

¿Cómo puedo obtener el stderr / stdout agregado de un conjunto de pods, preferiblemente los creados por un determinado controlador de replicación?

Torsten Bronger
fuente
tenga en cuenta que si no se establece el argumento de cola cuando se usa un selector, cada registro de pod tendrá una longitud predeterminada de 10 líneas
chachan

Respuestas:

175

Puedes usar etiquetas

kubectl logs -l app=elasticsearch
Adrian Ng
fuente
21
Buena solución y lo más probable es que responda a la pregunta original, pero no termina: "error: solo se permite uno de los siguientes (-f) o selector (-l)".
Nestor Urquiza
3
Además, no --all-namespaces.
Eric Walker
¿Cuál será el orden de esos registros? Quiero decir, si hay varios pods y cada pod tendrá sus propios registros. Entonces, si se muestran los registros de todos, ¿en qué orden se mostrarán y cómo identifico un pod de origen de una línea de registro particular?
Shubham
6
Parece que esto funciona -fahora (a partir de Kubernetes 1.12+ / kubectl1.12+). También @Shubham: muestra los mensajes en el orden en que se recibieron, no hay etiquetas ni nada en las líneas de registro. Esto es solo para una depuración rápida. Si necesita más detalles del registro, deberá enviar sus registros a un sistema de registro central como EFK, SumoLogic, Datadog, etc.
geerlingguy
1
¿Hay alguna forma de hacer lo mismo usando el panel de Kubernetes?
mchawre
70

He creado un pequeño script de bash llamado kubetailque lo hace posible. Por ejemplo, para seguir todos los registros de los pods denominados "app1", puede hacer lo siguiente:

kubetail app1

Puedes encontrar el guion aquí .

Johan
fuente
Lo instalé con: brew tap johanhaleby/kubetail && brew install kubetail --with-short-namesdocumentación detallada: kt -h¡Impresionante!
Khalil Gharbaoui
Increíble. Tengo un par de preguntas. `` `1. ¿Podemos hacer un seguimiento de los registros de varios pods que pertenecen a diferentes implementaciones? Algo como "kt -l app = service1, app = service2" 2. ¿Cómo los escribo todos en un archivo? Al hacer esto, "kt -l app = service1` >> filename.log" escribe solo nombres de pod en él. 3. ¿También se adapta en caso de implementaciones de autoescalado? ``
Vasudev
19

Puede obtener los registros de varios contenedores utilizando etiquetas como sugirió Adrian Ng:

kubectl logs --selector app=yourappname

En caso de que tenga un pod con varios contenedores, el comando anterior fallará y deberá especificar el nombre del contenedor:

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

Nota: Si desea ver qué etiquetas están disponibles para usted, el siguiente comando las enumerará todas:

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

... donde la salida se verá algo así como

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

Tenga en cuenta que es posible que otros grupos de anuncios no compartan algunas de las etiquetas; elegir "aplicación" parece lo más fácil

Jean Spector
fuente
13

Para construir sobre la respuesta anterior, si agrega -f, puede seguir los registros.

kubectl logs -f deployment/app
Ruben
fuente
10

Las soluciones proporcionadas anteriormente no son tan óptimas. El propio equipo de kubernetes ha proporcionado una solución hace un tiempo, llamada stern.

stern app1

También coincide con expresiones regulares y hace cola y -f (seguir) de forma predeterminada. Un buen beneficio es que también le muestra el pod que generó el registro.

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

Tome el go-binary para Linux o instálelo a través de brew para OSX.

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

https://github.com/wercker/stern

viena
fuente
6

Utilizo este sencillo script para obtener un registro de los pods de una implementación:

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

Esencia del guión

Uso: log_deployment.sh "nombre-despliegue".

Luego, el script mostrará el registro de todos los pods que comienzan con ese "nombre de implementación".

Martlark
fuente
4

Puede obtener ayuda de kubectl logs -hy de acuerdo con la información,

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

-ces el nombre del contenedor y --tailmostrará las últimas líneas numéricas, pero esto elegirá un pod de la implementación, no todos los pods. Esto es algo que debes tener en cuenta.

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

Si desea mostrar registros de todos los pods, puede usar -ly especificar una etiqueta, pero al mismo tiempo -fno se usará.

zimmer
fuente
3

También puede hacer esto por nombre de servicio.

Primero, intente encontrar el nombre del servicio del pod respectivo que corresponda a varios pods del mismo servicio. kubectl get svc.

A continuación, ejecute el siguiente comando para mostrar los registros de cada contenedor.

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

En este ejemplo, puede reemplazar <namespace>y <app-name>para obtener los registros cuando hay varios contenedores definidos en un pod.

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

Si las vainas tienen un nombre significativo, se podría usar un simple 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

Explicación: Recorra pods en ejecución cuyo nombre contenga "nodejs". Haga cola en el registro de cada uno de ellos en paralelo (un único signo comercial se ejecuta en segundo plano) asegurándose de que si alguno de los módulos falla, todo el comando salga (doble signo comercial). Transfiera las transmisiones de cada uno de los comandos de cola a una transmisión única. Se necesita Eval para ejecutar este comando construido dinámicamente.

Néstor Urquiza
fuente
-1

Yo uso este comando.

kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
Muhammad Naeem
fuente
1
¡Hola! Si bien ese comando puede resolver la pregunta, incluir una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación y probablemente resultaría en más votos a favor. Recuerde que está respondiendo la pregunta a los lectores en el futuro, no solo a la persona que pregunta ahora. Por favor, editar su respuesta para agregar explicaciones y dar una indicación de lo que se aplican limitaciones y supuestos.
Brian
-4

No estoy seguro de si esto es algo nuevo, pero con las implementaciones es posible hacerlo así:

kubectl logs deployment/app1
Rasmus Rømer
fuente
8
Cuando obtiene los registros por implementación, elige cualquiera de los pods replicados (elige al azar) pero no todos.
Akhil Bojedla
Votación en contra porque esto solo selecciona un grupo
Maximilian