Откуда конкретно бревна бобов kubernetes (на уровне контейнера)? - PullRequest
1 голос
/ 05 ноября 2019

Я хочу перенаправить некоторые журналы из команды, запущенной с kubectl exec, в журналы этого модуля, чтобы их можно было прочитать с помощью kubectl logs <pod-name> (или на самом деле /var/log/containers/<pod-name>.log). При запуске команды я вижу журналы, которые мне нужны, и они хранятся в отдельном каталоге журналов внутри работающего контейнера.

Перенаправление вывода (т. Е. >> logfile.log) в файл, который, как я думал, зеркально отображал содержимое kubectl logs <pod-name>, не обновляет журналы этого контейнера и не перенаправляет на стандартный вывод.

Когдазвоня kubectl logs <pod-name>, я понимаю, что kubelet получает их из своего внутреннего каталога /var/log/containers/. Но что определяет, какие журналы хранятся там? Это тот же процесс, что и способ хранения журналов внутри любого другого контейнера-докера?

Есть ли способ проверить / отследить процесс ведения журнала или определить, откуда поступают эти журналы?

1 Ответ

4 голосов
/ 05 ноября 2019

Журналы из STDOUT и STDERR контейнеров в модуле собираются и хранятся в файлах в / var / log / container. Это то, что отображается при запуске kubectl log.

Чтобы понять, почему вывод команд, запускаемых kubectl exec, не отображается при запуске kubectl log, давайте посмотрим, как все это работает на примере:

Сначала запустите модуль под управлением Ubuntu, который спит вечно:

$> kubectl run test --image=ubuntu --restart=Never -- sleep infinity

Exec в него

$> kubectl exec -it test bash

При взгляде из контейнера это STDOUTи STDERR PID 1, которые были захвачены. Когда вы делаете kubectl exec в контейнере, создается новый процесс, работающий рядом с PID 1:

root@test:/# ps -auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         7  0.0  0.0  18504  3400 pts/0    Ss   20:04   0:00 bash
root        19  0.0  0.0  34396  2908 pts/0    R+   20:07   0:00  \_ ps -auxf
root         1  0.0  0.0   4528   836 ?        Ss   20:03   0:00 sleep infinity

Перенаправление на STDOUT не работает, потому что /dev/stdout является символической ссылкой на процесс, который обращается к нему (/proc/self/fd/1 вместо /proc/1/fd/1).

root@test:/# ls -lrt /dev/stdout
lrwxrwxrwx 1 root root 15 Nov  5 20:03 /dev/stdout -> /proc/self/fd/1

Для просмотра журналов команд, запущенных с kubectl exec журналы должны быть перенаправлены в потоки, захваченные кублетом (STDOUT и STDERR пид 1). Это можно сделать, перенаправив вывод в /proc/1/fd/1.

root@test:/# echo "Hello" > /proc/1/fd/1

. Выход из интерактивной оболочки и проверка журналов с использованием kubectl logs теперь должны показать вывод

$> kubectl logs test
Hello
...