La ejecución kubectl logs
me 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?
La ejecución kubectl logs
me 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?
Respuestas:
Puedes usar etiquetas
kubectl logs -l app=elasticsearch
--all-namespaces
.
-f
ahora (a partir de Kubernetes 1.12+ / kubectl
1.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.
He creado un pequeño script de bash llamado kubetail
que 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í .
brew tap johanhaleby/kubetail && brew install kubetail --with-short-names
documentación detallada: kt -h
¡Impresionante!
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
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/
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
Uso: log_deployment.sh "nombre-despliegue".
Luego, el script mostrará el registro de todos los pods que comienzan con ese "nombre de implementación".
Una opción es configurar el registro del clúster a través de Fluentd / ElasticSearch como se describe en https://kubernetes.io/docs/user-guide/logging/elasticsearch/ . Una vez que los registros están en ES, es fácil aplicar filtros en Kibana para ver los registros de ciertos contenedores.
Puede obtener ayuda de kubectl logs -h
y de acuerdo con la información,
kubectl logs -f deployment/myapp -c myapp --tail 100
-c
es el nombre del contenedor y --tail
mostrará 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 -l
y especificar una etiqueta, pero al mismo tiempo -f
no se usará.
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>
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
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.
Yo uso este comando.
kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
No estoy seguro de si esto es algo nuevo, pero con las implementaciones es posible hacerlo así:
kubectl logs deployment/app1