Запуск 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+ / kubectl1.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