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?

Torsten Bronger
fonte
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
Adrian Ng
fonte
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 .

João
fonte
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

Jean Spector
fonte
13

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

kubectl logs -f deployment/app
Ruben
fonte
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

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

Martlark
fonte
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.

Zimmer
fonte
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>
Merda
fonte
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
Gokul Gunasekaran
fonte
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.

Nestor Urquiza
fonte
-1

Eu uso este comando.

kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
Muhammad Naeem
fonte
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
Rasmus Rømer
fonte
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