Arhn - архитектура программирования

Где находятся лог-файлы модулей Kubernetes?

Когда я бегу

$ kubectl logs <container>

Я получаю журналы своих модулей.

Но где файлы для этих журналов?

В некоторых источниках указано /var/log/containers/, в других указано /var/lib/docker/containers/, но я не смог найти настоящий журнал приложения или модуля.


Ответы:


1

Имя файла на диске происходит от

docker inspect $pod_name_or_sha | jq -r '.[0].LogPath'

предполагая, что конфигурация демона docker является {"log-driver": "json-file"} по умолчанию, что почти гарантированно будет правдой, если kubectl logs ведет себя правильно.

Это также может быть само собой разумеющимся, но вы должны находиться на узле, на котором Pod был запланирован либо на docker inspect, либо обнюхивать наличие файлов журнала на диске, чтобы сделать что-то полезное. kubectl describe pod $pod_name будет отображать имя узла, или, как вы можете предположить, оно будет в kubectl get -o json pod $pod_name, если вы хотите получить его программно.

21.12.2017
  • Привет, Мэтью. Большое спасибо за ответ! Но, по моему мнению, LogPath пусто. Вы знаете, если я пропускаю какой-то конфиг? Как я могу правильно установить LogPath? 21.12.2017
  • Это супер странно; Вы можете увидеть, что такое конфигурация ведения журнала для этого контейнера? docker inspect pod-or-sha | jq '.[0].HostConfig.LogConfig'; отдельно, может быть даже интересно узнать, отличается ли он от остальных, так что: docker inspect $(docker ps -aq) | jq '.[].HostConfig.LogConfig' 22.12.2017
  • .[0].HostConfig.LogConfig устанавливается на {"Type": "journald","Config": {}} 22.12.2017
  • А, так пойдет. Интересно, я понятия не имел, что kubelet достаточно умен, чтобы получать журналы откуда угодно, кроме как с диска. В любом случае, в этом случае ответ на ваш вопрос заключается в том, что файлы (вероятно) находятся в /var/log/journal/$(cat /etc/machine-id), но это просто педантичный ответ, поскольку эти файлы являются двоичными; содержимое журнала доступно через journalctl -u ${container_unit}, но у меня нет опыта, чтобы узнать, что такое ${container_unit}. systemctl list-units должен предоставить имена единиц контейнера. 22.12.2017
  • Привет Мэтью. Мне удалось заставить его работать, изменив драйвер журнала докера с журнала на json. Теперь я могу видеть файлы журнала приложений. Большое спасибо за вашу помощь! 22.12.2017

  • 2

    Короткий ответ:

    Если вы используете Docker, stdout из каждого контейнера хранятся в /var/lib/docker/containers. Но Kubernetes также создает структуру каталогов, чтобы помочь вам найти журналы на основе модулей, поэтому вы можете найти журналы контейнеров для каждого модуля, работающего на узле в /var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/.


    Подробный ответ:

    Docker перехватывает журналы stdout из каждого контейнера и сохраняет их в /var/lib/docker/containers на хосте. Если Kubernetes использует Docker в качестве среды выполнения контейнера, Docker также будет хранить журналы контейнеров в этом месте на узле Kubernetes. Но поскольку мы не запускаем контейнеры непосредственно в Kubernetes (мы запускаем поды), Kubernetes также создает каталоги /var/log/pods/ и /var/log/containers, чтобы помочь нам лучше организовать файлы журналов на основе подов.

    В каждом каталоге внутри /var/log/pods/ хранятся журналы для одного пода, и каждый из них назван с использованием структуры <namespace>_<pod_name>_<pod_id>.

    Вы можете получить идентификатор пода, запустив kubectl get pod -n core gloo-76dffbd956-rmvdz -o jsonpath='{.metadata.uid}'. Если вы привыкли использовать yq, вам может показаться, что использовать kubectl get pod <pod_name> -o yaml | yq r - metadata.uid проще.

    В каждом каталоге /var/log/pods/<namespace>_<pod_name>_<pod_id>/ есть несколько каталогов, каждый из которых представляет собой контейнер в поде. Имя этих каталогов равно имени контейнера. Наконец, когда мы заглянем внутрь каталога /var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/, мы найдем символические ссылки на файлы журналов, хранящиеся Docker внутри /var/lib/docker/containers.

    Точно так же внутри каталога /var/log/containers/ есть символические ссылки на каталог /var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/. Эти символические ссылки именуются с использованием структуры <pod_name>_<namespace>_<container_id>.

    18.11.2019

    3

    Вы видите что-нибудь в этих каталогах?

    В моих кластерах журналы stdout/stderr из каждого модуля находятся в /var/log/containers, однако есть некоторые ссылки/перенаправления:

    /var/log/containers/<pod-name>_<namespace>_<container-name-container-id>.log -> /var/log/pods/<some-uuid>/<container-name>_0.log
    

    И этот журнал на самом деле связан с /var/lib/docker:

    <container-name>_0.log -> /var/lib/docker/containers/<container-id>/<container-id>-json.log
    
    21.12.2017
  • Привет @erk, файлы журнала моего приложения находятся не в указанном вами каталоге. :( 21.12.2017

  • 4

    Это зависит от версии k8s:

    • до 1.14: /var/log/pods/<pod_id>/<name>/<num>.log
    • 1.14 или более поздняя версия: /var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/<num>.log (см. этот PR)

    файлы над обоими символами ссылаются на файлы докеров, например. /var/lib/docker/containers/<container-id>/<container-id>-json.log.

    Например:

    введите здесь описание изображения

    14.05.2020
  • @philraj да, я загружаю другую картинку ~~ 24.06.2020

  • 5

    Журналы управляются kubelet на каждом узле. Когда вы запускаете kubectl logs <pod>, он передает запрос kubelet на узле, где работает ваш модуль, и считывает связанный файл журнала.

    Архитектуру можно посмотреть здесь

    19.09.2019
  • Ни ваш ответ, ни ваша ссылка ничего не говорят о путях к файлам или их именах файлов. 25.06.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..