A execução kubectl logs
me mostra o stderr / stdout de um contêiner Kubernetes.
Como posso obter o stderr / stdout agregado de um conjunto de pods, de preferência aqueles criados por um determinado controlador de replicação?
A execução kubectl logs
me mostra o stderr / stdout de um contêiner Kubernetes.
Como posso obter o stderr / stdout agregado de um conjunto de pods, de preferência aqueles criados por um determinado controlador de replicação?
Respostas:
Você pode usar rótulos
kubectl logs -l app=elasticsearch
--all-namespaces
.
-f
agora (a partir do Kubernetes 1.12+ / kubectl
1.12+). Também @Shubham - exibe as mensagens na ordem de recebimento, não há tags ou nada nas linhas de log. Isso é apenas para depuração rápida. Se você precisar de mais detalhes de registro, você precisará enviar seus registros para um sistema de registro central como EFK, SumoLogic, Datadog, etc.
Eu criei um pequeno script bash chamado kubetail
que torna isso possível. Por exemplo, para limitar todos os registros de pods chamados "app1", você pode fazer:
kubetail app1
Você pode encontrar o script aqui .
brew tap johanhaleby/kubetail && brew install kubetail --with-short-names
documentação detalhada: kt -h
Incrível!
Você pode obter os registros de vários contêineres usando rótulos, conforme sugeriu Adrian Ng:
kubectl logs --selector app=yourappname
Caso você tenha um pod com vários contêineres, o comando acima falhará e você precisará especificar o nome do contêiner:
kubectl logs --selector app=yourappname --container yourcontainername
Nota: Se quiser ver quais rótulos estão disponíveis para você, o seguinte comando listará todos eles:
kubectl get pod <one of your pods> -o template --template='{{.metadata.labels}}'
... onde a saída será semelhante a
map [app: nome do aplicativo controlador-revisão-hash: 598302898 pod-template-generation: 1]
Observe que alguns dos rótulos podem não ser compartilhados por outros pods - escolher "app" parece ser o mais fácil
As soluções fornecidas anteriormente não são tão ideais. A própria equipe do kubernetes forneceu uma solução há algum tempo, chamada stern.
stern app1
Também está combinando expressões regulares e segue e -f (segue) por padrão. Um bom benefício é que ele mostra o pod que gerou o log também.
app1-12381266dad-3233c foobar log
app1-99348234asd-959cc foobar log2
Pegue o binário go para linux ou instale via brew para OSX.
https://kubernetes.io/blog/2016/10/tail-kubernetes-with-stern/
Eu uso este script simples para obter um registro dos pods de uma implantação:
#!/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 "nome da implantação".
O script mostrará o log de todos os pods que começam com esse "nome de implantação".
Uma opção é configurar o registro de cluster via Fluentd / ElasticSearch conforme descrito em https://kubernetes.io/docs/user-guide/logging/elasticsearch/ . Uma vez que os logs estão no ES, é fácil aplicar filtros no Kibana para visualizar os logs de certos contêineres.
Você pode obter ajuda kubectl logs -h
e de acordo com as informações,
kubectl logs -f deployment/myapp -c myapp --tail 100
-c
é o nome do contêiner e --tail
mostrará as linhas numéricas mais recentes, mas isso escolherá um pod da implantação, não todos os pods. Isso é algo que você deve ter em mente.
kubectl logs -l app=myapp -c myapp --tail 100
Se você quiser mostrar os registros de todos os pods, pode usar -l
e especificar uma etiqueta, mas ao mesmo tempo -f
não será usada.
Você também pode fazer isso pelo nome do serviço.
Primeiro, tente encontrar o nome do serviço do respectivo pod que corresponde a vários pods do mesmo serviço. kubectl get svc
.
Em seguida, execute o seguinte comando para exibir os logs de cada contêiner.
kubectl logs -f service/<service-name>
Neste exemplo, você pode substituir o <namespace>
e <app-name>
para obter os logs quando houver vários contêineres definidos em um pod.
kubectl -n <namespace> logs -f deployment/<app-name>
--all-containers=true --since=10m
Se os pods forem nomeados de forma significativa, pode-se usar o simples 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
Explicação: Faça um loop pelos pods em execução com o nome que contém "nodejs". Acompanhe o log de cada um deles em paralelo (e comercial único executado em segundo plano), garantindo que, se algum dos pods falhar, todo o comando será encerrado (e comercial duplo). Catar os fluxos de cada um dos comandos da cauda em um único fluxo. Eval é necessário para executar este comando construído dinamicamente.
Eu uso este comando.
kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
Não tenho certeza se isso é uma coisa nova, mas com implantações é possível fazer assim:
kubectl logs deployment/app1