Біг 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}}'
... де результат буде виглядати щось подібне
map [додаток: yourappname controller-revision-hash: 598302898 генерація pod-template: 1]
Зауважте, що деякі етикетки можуть не надаватися іншими стручками - вибір "програми" видається найпростішим
Раніше запропоновані рішення не такі оптимальні. Сама команда кубернетів давно запропонувала рішення, яке називалося суворим.
stern app1
Він також відповідає регулярним виразам і робить за замовчуванням хвіст і -f (слідувати). Приємною перевагою є те, що він показує вам стручок, який також створив журнал.
app1-12381266dad-3233c foobar log
app1-99348234asd-959cc foobar log2
Візьміть го-бінарний файл для 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, застосувати фільтри в Кібані легко, щоб переглянути журнали з певних контейнерів.
Ви можете отримати допомогу 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
Якщо стручки названі змістовно, можна використати простий звичайний баш:
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 -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
Не впевнений, чи це нова річ, але при розгортанні це можна зробити так:
kubectl logs deployment/app1