Ответ 1
Вы можете использовать метки
kubectl logs -l app=elasticsearch
Запуск kubectl logs
показывает мне stderr/stdout одного контейнера Kubernetes.
Как я могу получить агрегированный stderr/stdout из набора модулей, предпочтительно тех, которые созданы определенным контроллером репликации?
Вы можете использовать метки
kubectl logs -l app=elasticsearch
Я создал небольшой bash script, называемый kubetail
, который делает это возможным. Например, чтобы выровнять все журналы для контейнеров с именем "app1", вы можете сделать:
kubetail app1
Здесь вы можете найти script .
Вы можете получить журналы из нескольких контейнеров, используя метки, как предложил Адриан Нг:
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]
Обратите внимание, что некоторые ярлыки могут не использоваться другими модулями - выбор "приложения" кажется самым простым
Для построения предыдущего ответа, если вы добавите -f
вы можете -f
журналы.
kubectl logs -f deployment/app
Один из вариантов - настроить ведение журнала кластера через Fluentd/ElasticSearch, как описано в https://kubernetes.io/docs/user-guide/logging/elasticsearch/. Когда журналы находятся в ES, легко применять фильтры в Kibana для просмотра журналов из определенных контейнеров.
Я использую этот простой 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
Использование: log_deployment.sh "имя-развертывания".
Script затем покажет журнал всех модулей, которые начинаются с этого "имени развертывания".
Ранее предоставленные решения не настолько оптимальны. Сама команда 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/
Если стручки называются осмысленно, можно использовать простой Обычный Обычный 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 необходим для запуска этой динамически построенной команды.
Вы можете получить помощь от 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
не будет использоваться.
Не уверен, что это новая вещь, но с развертываниями это можно сделать так:
kubectl logs deployment/app1