Журналы из 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