etcd не успевает писать на диск, кластер Kubernetes тормозит
Ошибки «etcdserver: request timed out» и «apply request took too long» в Kubernetes под Directum RX: etcd не успевает записывать на диск. Падают поды, не применяются изменения. Как проверить диск etcd и кто его нагружает.
Что это значит
etcd хранит всё состояние кластера Kubernetes и пишет каждое изменение на диск с синхронизацией. Если диск медленный или занят чем-то ещё, запись не укладывается в таймаут, API-сервер отвечает ошибками, контроллеры не успевают обновлять состояние. Снаружи это выглядит как зависшие выкладки, поды в CrashLoop без понятной причины и смены лидера etcd.
Частая история: на тех же дисках, что и etcd, запустили что-то тяжёлое по вводу-выводу, например сканер образов или бэкап, и etcd начал задыхаться.
Как проверить
- Журнал etcd:
slow fdatasync,apply request took too long, смены лидера. - Метрики etcd, если они собираются:
etcd_disk_wal_fsync_duration_seconds(99-й перцентиль должен быть меньше 10 мс) иetcd_disk_backend_commit_duration_seconds. - Нагрузка на диск узлов управления:
iostat -x 5, кто читает и пишет:iotop -o. - В облаке: не упирается ли диск в лимит операций ввода-вывода для своего типа и размера.
Что сделать
- Убрать с дисков etcd посторонние тяжёлые задачи или перенести их на другие узлы.
- Держать etcd на SSD, в облаке на дисках с гарантированной производительностью.
- Поставить алерты на время fsync и на смены лидера etcd: они срабатывают раньше, чем начинают падать поды.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать