Проблема

После перезапуска kubelet одна из Kubernetes-нод начала работать нестабильно.

Симптомы выглядели нетипично и не указывали на очевидную причину.

Симптомы

Наблюдалось следующее:

  • часть kubectl операций перестала работать;
  • начали неожиданно падать системные поды;
  • kubelet работал нестабильно;
  • логи не содержали явных ошибок, указывающих на первопричину.

Диагностика

В первую очередь были проверены наиболее вероятные причины:

  • сетевые проблемы;
  • нехватка дискового пространства;
  • исчерпание CPU;
  • исчерпание памяти;
  • общее состояние узла.

Ни одна из гипотез не подтвердилась.

Причина

Причиной оказалось исчерпание лимита inotify watchers на узле.

inotify — механизм Linux для отслеживания изменений файлов и каталогов.

На него опираются многие компоненты инфраструктуры:

  • Kubernetes;
  • контейнерные рантаймы;
  • системы мониторинга;
  • сборщики логов;
  • различные агенты.

Когда лимит исчерпывается, могут возникать труднообъяснимые симптомы:

  • приложения перестают получать уведомления об изменениях файлов;
  • отдельные компоненты начинают работать нестабильно;
  • ошибки выглядят несвязанными с реальной причиной проблемы.

Подобные проблемы сложно диагностировать, потому что они долго остаются незаметными.

Обычно команды отслеживают:

  • CPU;
  • память;
  • диски;
  • сеть.

Потребление inotify watchers при этом редко попадает в список наблюдаемых метрик.

Выводы

Не каждая проблема в Kubernetes возникает внутри самого Kubernetes.

Иногда причина находится на несколько уровней ниже.

Обычный системный лимит Linux способен доставить больше проблем, чем нехватка вычислительных ресурсов.

Если инфраструктура активно растёт, системные лимиты Linux стоит периодически пересматривать наряду с ресурсами кластера.

После этого инцидента потребление inotify watchers было добавлено в список метрик для проактивного мониторинга.