Как мы сократили потребление памяти мониторингом на 75%, мигрируя с Prometheus на VictoriaMetrics Agent в OKD-кластерах
Расскажу про то, как устроен мониторинг в OKD-кластерах, какие у него есть минусы и как мы их побороли, мигрируя основную функциональность на VictoriaMetrics Agent.
Ссылка на статью на хабре – https://habr.com/ru/articles/929226/
Про кластерный мониторинг в OKD
В OKD всё управляется встроенными операторами, и, соответственно, кластерный мониторинг — не исключение. У вас есть openshift-monitoring оператор, который разворачивает всё, что касается мониторинга: prometheus-operator, kube-state-metrics, openshift-state-metrics, node-exporter и так далее. А так как он всё это разворачивает, то он же и обновляет, и вносит изменения в конфигурацию всех компонентов. По обновлению, я думаю, всё понятно — обновляется версия кластера = обновляется версия оператора = обновляются компоненты, которыми оператор управляет. Это в принципе очень удобно. Теперь про конфигурацию: все изменения в компоненты вносятся исключительно через оператор, вы не можете в обход него пойти и что-то там подправить в прометеусе — ваши изменения просто перезатрёт. На словах это очень круто и логично звучит, но реализация... Ниже в разделе "Почему решили переезжать на VMAgent" я подробнее опишу минусы этого.
Основную нагрузку в этой схеме у нас принимает Prometheus, так как именно на него и сваливаются все метрики кластера. В OKD есть два типа инсталляций Prometheus: openshift-monitoring (далее по тексту "кластерный прометей") и openshift-user-workload-monitoring (далее по тексту "клиентский прометей"). Первый отвечает за снятие метрик самого кластера, то есть это метрики cAdvisor, node-exporter, kube-state-metrics и так далее. Второй отвечает за снятие метрик с приложений. Это разделение нужно для того, чтобы, например, толстые метрики какого-нибудь пользовательского приложения, убив прометей, не лишили при этом администраторов кластера доступа к "служебным" метрикам.
Развёртка этих двух прометеев в самом кластере — это деплой двух StatefulSet'ов в разных namespace'ах. Количество реплик этих SS не регулируется и в 99% случаев равно двум, подробнее про то, почему количество реплик нельзя регулировать, будет написано ниже в разделе "Почему решили переезжать на VMAgent". При этом сами эти реплики — это идентичные прометеи, которые скрепают в рамках SS одни и те же таргеты. То есть обе реплики кластерного прометея собирают ВСЕ кластерные метрики, а обе реплики клиентского прометея собирают ВСЕ пользовательские метрики :). То есть это не шарды, которые поделили между собой таргеты, и каждый собирает свои.
Как был настроен у нас
Долгое время у нас была реализована следующая схема: есть "коммунальные" кластера VictoriaMetrics, и кластера OKD. В OKD кластерах были развёрнуты кластерный и клиентские инсталляции прометея. Обе эти инсталляции взаимодействовали с кластером VictoriaMetrics через компонент VMAuth, передавая свои метрики. Также у нас в каждом кластере была и есть OKD Console (веб-консоль кластера), которая ходит в прометей за кластерными метриками для отображения загруженности подов, метрик нод и так далее.
То есть у нас кластерные прометеусы выполняли две функции: все собранные метрики отправляли в VictoriaMetrics (основная функция) и также накапливали метрики для показа их в OKD Web Console (это касается только openshift-monitoring инсталляции Prometheus).
На картинке выше описанная схема представлена чуть более подробнее. На ней видны четыре основных компонента кластера VictoriaMetrics, давайте по каждому вкратце.
- VMAuth: выше я сказал, что в качестве хоста для remoteWrite в прометеусах указывался VMAuth – это компонент кластера VictoriaMetrics, отвечающий за добавление слоя авторизации для нижележащих компонентов. При успешной авторизации он проксирует запрос далее на нужный сервис (VMInsert или VMSelect).
- VMStorage: я думаю, по названию понятно, что это такое :). Это слой хранения, база данных для всех метрик кластера. Это может одна ВМка или несколько, репликация данных может быть включена, а может и нет, и так далее, возможностей для конфигурации много.
- VMInsert и VMSelect — это, соответственно, пишущий и читающий компоненты. У каждого есть свои специфичные функции, например, у VMSelect'а есть дополнительный кеш для запросов, чтобы лишний раз не ходить в хранилище.
Из представленной схемы кластера VictoriaMetrics, я думаю, уже понятен основной её плюс – гибкая микросервисная архитектура. Это позволяет быстро масштабировать кластер, а также добиваться максимальной отказоустойчивости. Например, "stateless" компоненты (VMAuth, VMInsert, VMSelect) вы можете увезти в Kubernetes, а VMStorage оставить на виртуальных машинах; вы можете отдельно скейлить «write» и «read» части кластера; вы можете выделить отдельные VMSelect для часто "читающего" сервиса, чтобы он не "зааффектил" остальных и так далее.
Что такое VMAgent
VMAgent по сути тот же самый Prometheus за одним исключением — вы не можете запрашивать метрики у VMAgent, потому что он на это не рассчитан. Он накапливает небольшое количество собранных им метрик и сразу отправляет в хранилище, которое поддерживает "Prometheus remote write" или "VictoriaMetrics remote write" протоколы.
VictorieMetrics remote write протокол использует намного меньше сетевого трафика, чем аналогичный протокол от команды Prometheus (подробнее можно прочитать тут). VMAgent автоматически определяет, поддерживает ли хранилище протокол от VictoriaMetrics, и использует его для передачи данных.
Почему решили переезжать на VMAgent
Поговорим наконец, почему мы решили "съезжать" с Прометеуса в наших OKD-кластерах. На самом деле, мигрировали мы не полностью. Как я выше писал:
То есть у нас кластерные прометеусы выполняли две функции: все собранные метрики отправляли в VictoriaMetrics (основная функция) и также накапливали метрики для показа их в OKD Web Console (это касается только openshift-monitoring инсталляции Prometheus).
И вот если основную функцию мы ещё можем забрать у преметея и унести на VMAgent, то отображение метрик в web-консоли OKD мы реализовать через VictoriaMetrics, к сожалению, не можем. В консоли всё, что касается метрик, сильно "захардкожено", и работать оно может только с прометеем, находящимся внутри кластера. Но тем не менее функцию отправки кластерных метрик в VictoriaMetrics можно реализовать через VMAgent, и это очень хорошо.
Теперь давайте перейдем к причинам миграции:
-
Урезанные возможности конфигурирования кластерного прометея в OKD. Список возможных настроек кластерных прометеев.
- Вы не можете точечно управлять списком таргетов, которые скрепает прометей, всё, что у вас есть, это поле
collectionProfile
, у которого есть два значения, "full" и "minimal", то есть "скрепай вообще всё что можно" и "скрепай только минимально необходимое". Причем эта настройка доступна только с версии 4.19 (самая последняя на момент написания статьи). - Вы не можете изменять количество реплик стейтфулсетов прометеусов. Если у вас кластер в HA-режиме (3 и более мастеров, подробнее тут), то количество реплик в стейтфулсетах кластерного и клиентского прометеев будет равно двум (в ином случае одной), и вы ничего не сможете с этим сделать. У вас просто будут дублироваться прометеи, и в случае, если у вас не маленький кластер (несколько тысяч подов), то одна реплика кластерного прометея может спокойно потреблять 15–20 ГБ оперативной памяти. Это при условии, что прометей отправляет метрики в удаленное хранилище и ещё накапливает их для OKD Web Console.
- Вы не можете вносить изменения в конфигурацию kube-state-metrics, ограничивая количество и список ресурсов, который он выводит в метрики. Если у вас есть ресурс, который, например, очень часто пересоздаётся/обновляется, то это будет генерировать значительное количество метрик, которое вам, может быть, и не нужно. И вы также не можете поднять свою инсталляцию kube-state-metrics, сконфигурировать её как вам нужно и перенаправить прометеусы на неё.
- Вы не можете точечно управлять списком таргетов, которые скрепает прометей, всё, что у вас есть, это поле
-
Высокое потребление ресурсов (в частности, RAM). В предыдущем пункте затронул эту тему.
-
Стабильность. Этот пункт тоже касается ресурсов :). У всех прометеев обязательно стояли лимиты на потребление RAM, но им его вечно не хватало, особенно если кластер резко рос по числу подов или в случае проведения тех работ. Из-за этого прометеи могли в цикле умирать по ООМу и, соответственно, ослеплять мониторинг. Чтобы это "полечить", нужно было тупо повышать им лимит на потребление оперативной памяти, так как давать ему безлимит на потребление RAM (или просто сильно завышать этот лимит) не очень хотелось. Мало ли что у него может заглючить и он съест всю оперативку на ноде.