logging - logs - kubectl scale
¿Cómo obtengo registros de todos los pods de un controlador de replicación Kubernetes? (10)
He creado un pequeño script de bash llamado
kubetail
que lo hace posible.
Por ejemplo, para seguir todos los registros de pods llamados "app1" puede hacer:
kubetail app1
Puedes encontrar el guión here .
Ejecutar
kubectl logs
me muestra el stderr / stdout de un contenedor Kubernetes.
¿Cómo puedo obtener el stderr / stdout agregado de un conjunto de pods, preferiblemente aquellos creados por un determinado controlador de replicación?
Las soluciones proporcionadas anteriormente no son tan óptimas. El equipo de Kubernetes ha proporcionado una solución hace un tiempo, llamada popa.
stern app1
También coincide con expresiones regulares y hace cola y -f (seguir) por defecto. Una buena ventaja es que también te 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/
No estoy seguro de si esto es algo nuevo, pero con las implementaciones es posible hacerlo así:
kubectl logs deployment/app1
Para construir sobre la respuesta anterior si agrega
-f
puede seguir los registros.
#!/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
Puede obtener ayuda de
kubectl logs -h
y según 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
--tail
, 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á.
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í
map [aplicación: yourappname controller-revision-hash: 598302898 pod-template-generation: 1]
Tenga en cuenta que algunas de las etiquetas pueden no ser compartidas por otros pods: elegir "aplicación" parece ser la más fácil
Puedes usar etiquetas
kubectl logs -l app=elasticsearch
Si las vainas se nombran significativamente, se podría usar Plain Old Bash simple:
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 los pods en ejecución con un nombre que contenga "nodejs". Siga el registro de cada uno de ellos en paralelo (ampersand único se ejecuta en segundo plano) asegurándose de que si alguno de los pods falla, todo el comando sale (doble ampersand) Cat las secuencias de cada uno de los comandos de cola en una secuencia única. Eval es necesario para ejecutar este comando creado dinámicamente.
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.
Utilizo este script simple para obtener un registro de los pods de una implementación:
kubectl logs -f deployment/app
Uso: log_deployment.sh "nombre-implementación".
La secuencia de comandos mostrará el registro de todos los pods que comienzan con ese "nombre de implementación".