Запуск kubectl logs
показывает мне stderr / stdout одного контейнера Kubernetes.
Как я могу получить агрегированный stderr / stdout набора модулей, предпочтительно созданных определенным контроллером репликации?
Запуск kubectl logs
показывает мне stderr / stdout одного контейнера Kubernetes.
Как я могу получить агрегированный stderr / stdout набора модулей, предпочтительно созданных определенным контроллером репликации?
Ответы:
Вы можете использовать ярлыки
kubectl logs -l app=elasticsearch
--all-namespaces
.
-f
сейчас (начиная с Kubernetes 1.12+ / kubectl
1.12+). Также @Shubham - он отображает сообщения в порядке получения, в строках журнала нет тегов или чего-либо еще. Это просто для быстрой отладки. Если вам нужны более подробные сведения о журнале, вам необходимо отправить свои журналы в центральную систему журналов, такую как EFK, SumoLogic, Datadog и т. Д.
Я создал небольшой сценарий bash, kubetail
который делает это возможным. Например, чтобы отслеживать все журналы для модулей с именем «app1», вы можете:
kubetail app1
Вы можете найти сценарий здесь .
brew tap johanhaleby/kubetail && brew install kubetail --with-short-names
подробной документации: kt -h
Отлично!
Вы можете получить журналы из нескольких контейнеров, используя метки, как предложил Адриан Нг:
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]
Обратите внимание, что некоторые ярлыки могут не использоваться другими модулями - выбор «приложение» кажется самым простым.
Предоставленные ранее решения не так оптимальны. Сама команда 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/
Я использую этот простой сценарий, чтобы получить журнал из модулей развертывания:
#!/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 «имя-развертывания».
Затем скрипт покажет журнал всех модулей, которые начинаются с этого «имя-развертывания».
Один из вариантов - настроить ведение журнала кластера через Fluentd / ElasticSearch, как описано на https://kubernetes.io/docs/user-guide/logging/elasticsearch/ . Как только журналы находятся в ES, в Kibana легко применять фильтры для просмотра журналов из определенных контейнеров.
Вы можете получить помощь от 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
она не будет использоваться.
Вы также можете сделать это по имени службы.
Сначала попробуйте найти имя службы соответствующего модуля, которое соответствует нескольким модулям одной службы. kubectl get svc
,
Затем выполните следующую команду, чтобы отобразить журналы из каждого контейнера.
kubectl logs -f service/<service-name>
В этом примере вы можете заменить <namespace>
и, <app-name>
чтобы получить журналы, когда в Pod определено несколько контейнеров.
kubectl -n <namespace> logs -f deployment/<app-name>
--all-containers=true --since=10m
Если поды названы осмысленно, можно использовать простой 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 необходим для запуска этой динамически созданной команды.
Я использую эту команду.
kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
Не уверен, что это что-то новое, но с развертыванием можно сделать это так:
kubectl logs deployment/app1