Como obtenho registros de todos os pods de um controlador de replicação Kubernetes?


123

A execução kubectl logsme 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?


tenha em mente que não definir o argumento tail ao usar um seletor irá padronizar cada pod log para 10 linhas de comprimento
chachan

Respostas:


175

Você pode usar rótulos

kubectl logs -l app=elasticsearch

21
Boa solução e provavelmente o suficiente para responder à pergunta original, mas não vai falhar: "erro: apenas um de follow (-f) ou seletor (-l) é permitido".
Nestor Urquiza,

3
Além disso, não --all-namespaces.
Eric Walker

Qual será a ordem desses logs? Quero dizer, se houver vários pods e cada pod terá seus próprios logs. Portanto, se os logs de todos forem exibidos, em que ordem eles serão exibidos e como identifico um pod de origem de uma linha de log específica?
Shubham de

6
Parece que isso funciona -fagora (a partir do Kubernetes 1.12+ / kubectl1.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.
geerlingguy

1
Existe alguma maneira de fazer o mesmo usando o painel do kubernetes.
mchawre

70

Eu criei um pequeno script bash chamado kubetailque 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 .


Instalado com: brew tap johanhaleby/kubetail && brew install kubetail --with-short-namesdocumentação detalhada: kt -hIncrível!
Khalil Gharbaoui de

Impressionante. Eu tenho algumas perguntas. `` `1. Podemos rastrear logs de vários pods pertencentes a diferentes implantações? Algo como "kt -l app = service1, app = service2" 2. Como escrevo todos em um arquivo? Ao fazer isso, "kt -l app = service1` >> filename.log" grava apenas nomes de pod nele. 3. Também diminui no caso de implantações de escalonamento automático? `` `
Vasudev

19

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


13

Para desenvolver a resposta anterior, se você adicionar, -fpode limitar os registros.

kubectl logs -f deployment/app

10

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/

https://github.com/wercker/stern


6

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

Síntese do roteiro

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".



4

Você pode obter ajuda kubectl logs -he de acordo com as informações,

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

-cé o nome do contêiner e --tailmostrará 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 -le especificar uma etiqueta, mas ao mesmo tempo -fnão será usada.


3

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>

2

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

1

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.


-1

Eu uso este comando.

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

1
Olá! Embora esse comando possa resolver a questão, incluir uma explicação de como e por que isso resolve o problema realmente ajudaria a melhorar a qualidade de sua postagem e provavelmente resultaria em mais votos positivos. Lembre-se de que você está respondendo à pergunta para os leitores no futuro, não apenas para a pessoa que está perguntando agora. Por favor edite sua resposta para adicionar explicações e dar uma indicação do que limitações e premissas se aplicam.
Brian

-4

Não tenho certeza se isso é uma coisa nova, mas com implantações é possível fazer assim:

kubectl logs deployment/app1

8
Quando você obtém os registros por implantação, ele escolhe qualquer um dos pods replicados (escolhe aleatoriamente), mas não todos.
Akhil Bojedla

Downvoting porque só seleciona um pod
Maximilian
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.