Как получить журналы из всех модулей контроллера репликации Kubernetes?

Запуск kubectl logs показывает мне stderr/stdout одного контейнера Kubernetes.

Как я могу получить агрегированный stderr/stdout из набора модулей, предпочтительно тех, которые созданы определенным контроллером репликации?

Ответы

Ответ 1

Вы можете использовать метки

kubectl logs -l app=elasticsearch

Ответ 2

Я создал небольшой bash script, называемый kubetail, который делает это возможным. Например, чтобы выровнять все журналы для контейнеров с именем "app1", вы можете сделать:

kubetail app1

Здесь вы можете найти script .

Ответ 3

Вы можете получить журналы из нескольких контейнеров, используя метки, как предложил Адриан Нг:

kubectl logs --selector app=yourappname

Если у вас есть модуль с несколькими контейнерами, приведенная выше команда не будет выполнена, и вам нужно будет указать имя контейнера:

kubectl logs --selector app=yourappname --container yourcontainername

Примечание. Если вы хотите увидеть, какие ярлыки вам доступны, следующая команда перечислит их все:

kubectl get pod <one of your pods> -o template --template='{{.metadata.labels}}'

... где результат будет выглядеть примерно так

map [app: yourappname controller-revision-hash: 598302898 pod-template-generation: 1]

Обратите внимание, что некоторые ярлыки могут не использоваться другими модулями - выбор "приложения" кажется самым простым

Ответ 4

Для построения предыдущего ответа, если вы добавите -f вы можете -f журналы.

kubectl logs -f deployment/app

Ответ 5

Один из вариантов - настроить ведение журнала кластера через Fluentd/ElasticSearch, как описано в https://kubernetes.io/docs/user-guide/logging/elasticsearch/. Когда журналы находятся в ES, легко применять фильтры в Kibana для просмотра журналов из определенных контейнеров.

Ответ 6

Я использую этот простой script, чтобы получить журнал из контейнеров развертывания:

#!/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

Суть script

Использование: log_deployment.sh "имя-развертывания".

Script затем покажет журнал всех модулей, которые начинаются с этого "имени развертывания".

Ответ 7

Ранее предоставленные решения не настолько оптимальны. Сама команда kubernetes некоторое время назад предоставила решение под названием stern.

stern app1

Он также соответствует регулярным выражениям и делает tail и -f (follow) по умолчанию. Хорошим преимуществом является то, что он показывает вам модуль, который также создал журнал.

app1-12381266dad-3233c foobar log
app1-99348234asd-959cc foobar log2

Возьмите go-binary для linux или установите через brew для OSX.

https://kubernetes.io/blog/2016/10/tail-kubernetes-with-stern/

https://github.com/wercker/stern

Ответ 8

Если стручки называются осмысленно, можно использовать простой Обычный Обычный 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

Объяснение: Петля через запущенные контейнеры с именем, содержащим "nodejs". Хвост журнала для каждого из них параллельно (одиночный амперсанд работает в фоновом режиме), гарантирующий, что если какой-либо из пакетов выйдет из строя, вся команда выйдет (двойной амперсанд). Катите потоки из каждой команды хвоста в уникальный поток. Eval необходим для запуска этой динамически построенной команды.

Ответ 9

Вы можете получить помощь от kubectl logs -h и, согласно информации,

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

-c - это имя контейнера, а --tail покажет последние num строки ,, но при этом будет выбран один модуль развертывания, а не все. Это то, что вы должны иметь в виду.

kubectl logs -l app=myapp -c myapp --tail 100

Если вы хотите показать журналы всех модулей, вы можете использовать -l и указать метку, но в то же время -f не будет использоваться.

Ответ 10

Не уверен, что это новая вещь, но с развертываниями это можно сделать так:

kubectl logs deployment/app1