Назад | Перейти на главную страницу

systemd процесс с необычной загрузкой ЦП в кластере Kubernetes

Я запускаю кластер Kubernetes с одним главным / узлом на виртуальной машине CentOS 7, и я понял, что systemd процесс (как PID 1) постоянно использует CPU.

[root@ip-10-0-0-66 ~]# ps aux | head -n2
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  7.7  0.0 129088  7720 ?        Ss   Jun21 639:41 /usr/lib/systemd/systemd --switched-root --system --deserialize 22

Более того, systemd генерирует миллионы таких строк журнала:

[root@ip-10-0-0-66 ~]# tail -n 10 /var/log/messages
Jun 27 12:49:14 ip-10-0-0-66 systemd: Created slice libcontainer_6148_systemd_test_default.slice.
Jun 27 12:49:14 ip-10-0-0-66 systemd: Removed slice libcontainer_6148_systemd_test_default.slice.
Jun 27 12:49:15 ip-10-0-0-66 systemd: Created slice libcontainer_6155_systemd_test_default.slice.
Jun 27 12:49:15 ip-10-0-0-66 systemd: Removed slice libcontainer_6155_systemd_test_default.slice.
Jun 27 12:49:15 ip-10-0-0-66 systemd: Created slice libcontainer_6155_systemd_test_default.slice.
Jun 27 12:49:15 ip-10-0-0-66 systemd: Removed slice libcontainer_6155_systemd_test_default.slice.
Jun 27 12:49:15 ip-10-0-0-66 systemd: Created slice libcontainer_6162_systemd_test_default.slice.
Jun 27 12:49:15 ip-10-0-0-66 systemd: Removed slice libcontainer_6162_systemd_test_default.slice.
Jun 27 12:49:15 ip-10-0-0-66 systemd: Created slice libcontainer_6162_systemd_test_default.slice.
Jun 27 12:49:15 ip-10-0-0-66 systemd: Removed slice libcontainer_6162_systemd_test_default.slice.

В секунду регистрируется почти 50 строк журнала, которые переполняют /var/logs/messages файл:

[root@ip-10-0-0-66 ~]# sudo wc -l /var/log/messages
5992826 /var/log/messages
[root@ip-10-0-0-66 ~]# sudo cat /var/log/messages | grep 'systemd_test_default' | wc -l
5987033

В конце концов, kubelet процесс также регистрирует такие ошибки:

Jun 27 12:53:37 ip-10-0-0-66 systemd: Removed slice libcontainer_29206_systemd_test_default.slice.
Jun 27 12:53:37 ip-10-0-0-66 systemd: Created slice libcontainer_29206_systemd_test_default.slice.
Jun 27 12:53:37 ip-10-0-0-66 systemd: Removed slice libcontainer_29206_systemd_test_default.slice.
Jun 27 12:53:37 ip-10-0-0-66 kubelet: W0627 12:53:37.447052    5352 watcher.go:87] Error while processing event ("/sys/fs/cgroup/memory/libcontainer_29206_systemd_test_default.slice": 0x40000100 == IN_CREATE|IN_ISDIR): readdirent: no such file or directory
Jun 27 12:53:37 ip-10-0-0-66 kubelet: W0627 12:53:37.447117    5352 watcher.go:87] Error while processing event ("/sys/fs/cgroup/devices/libcontainer_29206_systemd_test_default.slice": 0x40000100 == IN_CREATE|IN_ISDIR): open /sys/fs/cgroup/devices/libcontainer_29206_systemd_test_default.slice: no such file or directory
Jun 27 12:53:37 ip-10-0-0-66 systemd: Created slice libcontainer_29225_systemd_test_default.slice.
Jun 27 12:53:37 ip-10-0-0-66 systemd: Removed slice libcontainer_29225_systemd_test_default.slice.
Jun 27 12:53:37 ip-10-0-0-66 systemd: Created slice libcontainer_29232_systemd_test_default.slice.
Jun 27 12:53:37 ip-10-0-0-66 systemd: Removed slice libcontainer_29232_systemd_test_default.slice.

Как я могу понять, что вызывает это systemd Использование ЦП и сообщения журнала?


Дополнительная информация

Версии:

Конфигурация драйвера Cgroup:

$ docker info | grep -i cgroup
Cgroup Driver: systemd

$ cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd"

Это известная ошибка в kubernetes. kubelet процесс и не ограничивается только системами на базе CentOS, но любой Linux (включая Ubuntu), где вы используете systemd как cgroup-драйвер для kubelet. Кажется, что он начал появляться в дикой природе после версии 1.14, но, возможно, просто не было такой распространенной проблемой до 1.14, как тогда, когда официальная рекомендация из документации kubernetes рекомендует используя systemd в качестве драйвера cgroup) по следующей причине:

Когда systemd выбран в качестве системы инициализации для дистрибутива Linux, процесс инициализации генерирует и использует корневую группу управления (cgroup) и действует как менеджер cgroup. Systemd имеет тесную интеграцию с контрольными группами и выделяет контрольные группы для каждого процесса. Можно настроить среду выполнения контейнера и кубелет для использования cgroupfs. Использование cgroupfs вместе с systemd означает, что тогда будет два разных менеджера cgroup.

Группы управления используются для ограничения ресурсов, выделяемых процессам. Единый менеджер cgroup упростит представление о том, какие ресурсы распределяются, и по умолчанию будет иметь более согласованное представление о доступных и используемых ресурсах. Когда у нас есть два менеджера, мы получаем два представления этих ресурсов. Мы видели случаи, когда узлы, настроенные на использование cgroupfs для kubelet и Docker, а systemd для остальных процессов, запущенных на узле, становились нестабильными из-за нехватки ресурсов.

Изменение настроек таким образом, чтобы ваша среда выполнения контейнера и kubelet использовали systemd в качестве драйвера cgroup, что стабилизировало систему. Обратите внимание на параметр native.cgroupdriver = systemd в настройке Docker ниже.

источник: https://kubernetes.io/docs/setup/cri/

До этого другой cgroup-драйвер cgroupfs похоже, был принятый подход / подход по умолчанию. Фактически, я переключился только потому, что эта рекомендация начала появляться во время kubeadm init'ing нового кластера 1.14.x несколько месяцев назад, что привело меня к эта проблема с github именно в этой ситуации.

По сути, это кажется ненадежным взаимодействием между обработкой kubelet systemd и зондированием cAdvisor, поэтому, возможно, код еще не совсем готов для прайм-тайма. Полное техническое объяснение доступно на этот комментарий:

«Отсутствующий» фрагмент созданный кодом runc systemd. Вот почему ошибка видна только тогда, когда systemd настроен как cgroup manager.

Ошибка исходит из когда cadvisor начинает попытки собирать и обрабатывать события из только что созданного «фрагмента / контейнера».

Предположительно, здесь присутствует состояние гонки, при котором cadvisor не знает, что «фрагмент / контейнер», для которого он пытается запустить средство отслеживания событий, был удален runc.

Вопрос открыт с апреля без особых признаков того, что его решают (поскольку он кажется низким).

Последний коммит, коснувшийся этого кода, - вот этот, однако, похоже, что в основном изменилось название файла / структура каталогов и макет кода, а также был введен код cadvisor задолго до.

Наконец, хотя переключение на использование cgroupfs - это вариант (как прокомментировал @hanx), он может приводит к ХУДШИМ проблемам (нестабильность под нагрузкой) и опять же НЕ рекомендуется официальными документами. Некоторые люди все еще выбирают этот маршрут, просто чтобы избавиться от (в основном добрый) Сообщения об ошибках.