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

123

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

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

Торстен Бронгер
источник
имейте в виду, что если не задавать аргумент хвоста при использовании селектора, по умолчанию для каждого модуля журнала будет 10 строк
chachan

Ответы:

176

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

kubectl logs -l app=elasticsearch
Адриан Нг
источник
21
Хорошее решение и, скорее всего, достаточно, чтобы ответить на исходный вопрос, но оно не заканчивается: «ошибка: разрешен только один из следующих (-f) или селектор (-l)».
Нестор Уркиса
3
Также нет --all-namespaces.
Эрик Уокер
Каков будет порядок этих журналов? Я имею в виду, если есть несколько модулей, и у каждого модуля будут свои журналы. Итак, если отображаются журналы от всех, то в каком порядке они будут отображаться и как определить исходный модуль конкретной строки журнала?
Shubham
6
Похоже, что это работает -fсейчас (начиная с Kubernetes 1.12+ / kubectl1.12+). Также @Shubham - он отображает сообщения в порядке получения, в строках журнала нет тегов или чего-либо еще. Это просто для быстрой отладки. Если вам нужны более подробные сведения о журнале, вам необходимо отправить свои журналы в центральную систему журналов, такую ​​как EFK, SumoLogic, Datadog и т. Д.
geerlingguy
1
Есть ли способ сделать то же самое с помощью панели управления kubernetes.
mchawre
70

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

kubetail app1

Вы можете найти сценарий здесь .

Johan
источник
Установил с помощью: brew tap johanhaleby/kubetail && brew install kubetail --with-short-namesподробной документации: kt -hОтлично!
Халил Гарбауи
Потрясающие. У меня есть пара вопросов. `` 1. Можем ли мы отслеживать журналы нескольких модулей, принадлежащих разным развертываниям? Что-то вроде "kt -l app = service1, app = service2" 2. Как мне записать их все в файл? Выполнение этого "kt -l app = service1` >> filename.log" записывает в него только имена модулей. 3. Остается ли он в хвосте в случае развертывания с автоматическим масштабированием? ``
Васудев
19

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

kubectl logs --selector app=yourappname

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

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

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

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

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

карта [app: yourappname controller-revision-hash: 598302898 pod-template-generation: 1]

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

Жан Спектор
источник
13

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

kubectl logs -f deployment/app
Ruben
источник
10

Предоставленные ранее решения не так оптимальны. Сама команда 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

вена
источник
6

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

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

Суть сценария

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

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

Martlark
источник
5

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

Тхук Нгуен
источник
4

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

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

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

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

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

Zimmer
источник
3

Вы также можете сделать это по имени службы.

Сначала попробуйте найти имя службы соответствующего модуля, которое соответствует нескольким модулям одной службы. kubectl get svc,

Затем выполните следующую команду, чтобы отобразить журналы из каждого контейнера.

kubectl logs -f service/<service-name>
Harshit
источник
2

В этом примере вы можете заменить <namespace>и, <app-name>чтобы получить журналы, когда в Pod определено несколько контейнеров.

kubectl -n <namespace> logs -f deployment/<app-name>
--all-containers=true --since=10m
Гокул Гунасекаран
источник
1

Если поды названы осмысленно, можно использовать простой 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

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

Нестор Уркиса
источник
-1

Я использую эту команду.

kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
Мухаммад Наим
источник
1
Здравствуйте! Хотя эта команда может решить вопрос, в том числе объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов за. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас. Пожалуйста , измените свой ответ , чтобы добавить объяснения и дать указание о том , что применять ограничения и допущения.
Брайан
-4

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

kubectl logs deployment/app1
Расмус Рёмер
источник
8
Когда вы получаете журналы путем развертывания, он выбирает любой из реплицированных модулей (выбирается случайным образом), но не все из них.
Ахил Боджедла
Голосование против, потому что это выбирает только одну капсулу
Максимилиан