Як отримати журнали з усіх стручків контролера реплікації Kubernetes?


123

Біг kubectl logsпоказує мені stderr / stdout одного контейнера Kubernetes.

Як я можу отримати сукупний stderr / stdout набору стручків, бажано тих, створених певним контролером реплікації?


майте на увазі, що при встановленні хвостового аргументу при використанні селектора за замовчуванням кожен журнал стручка не
перевищує

Відповіді:


175

Можна використовувати етикетки

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

Ви можете знайти сценарій тут .


Встановлено це за допомогою: 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. Це також хвостик у разі автоматичного масштабування розгортань? `` `
Vasudev

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}}'

... де результат буде виглядати щось подібне

map [додаток: yourappname controller-revision-hash: 598302898 генерація pod-template: 1]

Зауважте, що деякі етикетки можуть не надаватися іншими стручками - вибір "програми" видається найпростішим


13

На основі попередньої відповіді, якщо ви додасте, -fви можете описувати журнали.

kubectl logs -f deployment/app

10

Раніше запропоновані рішення не такі оптимальні. Сама команда кубернетів давно запропонувала рішення, яке називалося суворим.

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/

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 "ім'я розгортання".

Потім сценарій покаже журнал усіх стручків, які починаються з цього "імені розгортання".


5

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


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не буде використовуватися.


3

Ви також можете це зробити за назвою служби.

По-перше, спробуйте знайти назву служби відповідного стручка, яка відповідає декільком стручкам однієї служби. kubectl get svc.

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

kubectl logs -f service/<service-name>

2

У цьому прикладі ви можете замінити <namespace>і <app-name>отримати журнали, коли в Pod поділено декілька контейнерів.

kubectl -n <namespace> logs -f deployment/<app-name>
--all-containers=true --since=10m

1

Якщо стручки названі змістовно, можна використати простий звичайний баш:

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.


-1

Я використовую цю команду.

kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m

1
Привіт! Хоча ця команда може вирішити питання, включаючи пояснення, як і чому це вирішує проблему, справді допоможе покращити якість вашої публікації і, ймовірно, призведе до збільшення кількості голосів. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, а не лише про людину, яка зараз задає питання. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються.
Брайан

-4

Не впевнений, чи це нова річ, але при розгортанні це можна зробити так:

kubectl logs deployment/app1

8
Коли ви отримуєте журнали шляхом розгортання, він вибирає будь-який із реплікуваних стручків (вибирає випадковим чином), але не всі з них.
Ахіл Боедла

Відхилення, оскільки це вибирає лише один
Максиміліан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.