Мониторинг Kubernetes кластера с помощью Prometheus

За основу был взят стек мониторинга Prometehus с помощью Prometheus operator отсюда
https://github.com/helm/charts/tree/master/stable/prometheus-operator
https://coreos.com/operators/prometheus/docs/latest/user-guides/getting-started.html

Все параметры, которые необходимо было переопределить указаны в файле custom-values.yaml

Мониторинг стек запускается с помощью Helm-чарта

Обновление стека выполняется командой

 

Установка Helm клиента
https://docs.helm.sh/using_helm/#installing-helm
https://docs.helm.sh/using_helm/

Последняя версия доступная здесь
https://github.com/helm/helm/releases

Проверка текущего контекста,куда будет установлен tiller

Инициализация Helm
Инициализация helm-клиента и установка helm tiller(серверной части)

После чего в namespace kube-system должен появиться tiller pod

т.е. tiller server запускается как Pod в namespace kube-system

Предоставление Tiller-у необходимых привилегий для создания/изменения/удаления ресурсов в кластере

Создаем serviceaccount, привязываем к нему роль cluster-admin, патчим созданный deployment tiller-deploy
https://github.com/fnproject/fn-helm/issues/21

Роль cluster-admin создается по умолчанию в Kubernetes-кластере, поэтому отдельное ее описание не требуется

Проверяем налииче созданного serviceaccount-а

Проверяем наличие привязанной/прикрепленной роли

Пропатченного deployment-а tiller-deploy

Альтернативным вариантом может быть выполнение инициализации helm с указанием serviceaccount
https://helm.sh/docs/using_helm/#tiller-and-role-based-access-control

Например, создаем serviceaccount,role binding

Выполненние инициализации Helm с созданным предыдущей командой serviceaccount-ом

 

Prometheus custom rules

По умолчанию одно из правил Prometheus (CPUThrottlingHigh)имеет низкое пороговое значение параметра, которое отвечает за срабатывание правила(25%), в результате чего, например, дефолтные служебные поды в namespace kube-system, а также некоторые поды из мониторинг стека превышают значение этого параметра(25%) и срабатывает оповещение

В связи с этим я отключаю оповещение для этого правила в AlertManager(через WEB-интерфейс AlertManager-а на вкладке Silence) и создаю отдельное правило, которые имеет более высокий порог срабатывания(50%)
В этом правиле важно иметь метки с такими именами/значениями

Имя релиза – это имя указанное в параметре —name при запуске мониторинг стека(в данном случае monitoring-stack)

Создаем кастомное правила для Prometheus

Альтернативной возможностью по добавлению своих правил для Prometheus является добавление их в параметр additionalPrometheusRules в файл custom-values.yaml
В данном примере эти строки я закомментировал.

Файл с пользовательскими настройками/значениями имеет вид

 

В зависимости от того, какое DNS-решение используется в кластере CoreDNS или KubeDNS
необходимо включить/отключить соотвествующий экспортер
В данном случае

 

Настройка AlertManager
Изменяем конфигурцию AlertManager-a, настраивая отправку оповещений в Slack

2.Настраиваем AlertManager на использование кастомных шаблонов для отправки уведомлений

Создаем отдельный файл с шаблоном template_alert.tmpl, в котором описаны вышеуказанные шаблоны

Создаем Persistent Volume Claim для хранения Alertmanager-ом своих данных(каталога /alertmanager( в нем хранятся, например, настройки silence, сделанные через WEB-интерфейс AlertManager)

 

Настройка Prometheus
Переопределям следующе параметры
— время хранения данных(параметр retention)
— ресурсы, выделяемые для пода
— cоздаем Persistent Volume Claim для хранения Prometheus-ом своих данных(каталога /prometheus)

 

Настройка Grafana
Переопределям следующе параметры
— тип сервиса с дефолтного ClusterIP на Loadbalancer
— указываем статический IP-адрес(полученный у облачного провайдера), на котором будет слушать запросы Loadabalancer
На этот IP-адрес необходимо также настроить DNS-имя, которое используется для доступа к Grafanе (например, grafana.mydomain.com)

Определяем том для хранения Grafan-ой своих данных(каталога /var/lib/grafana, в котором хранятся база данных Grafana и плагины)

Для доступа к и Prometheus и AlertManager (оба сервиса по умолчанию не имеют авторизации, поэтому нежелательно выставлять их наружу)используем port-forward
Prometheus

Доступ к Prometheus

AlertManager

Доступ к AlertManager

Просмотр метрик с Kube-state-metrics и Node-exporter
Kube-state-metrics

Доступ к Kube-state-metrics

Node-exporter

Доступ к Node-exporter

Grafana имеет встроенную авторизацию через логин/пароль. Поэтому выставим ее наружу через Service c типом LoadBalancer
Также для того, чтобы после рестарта LoadBalancera IP-адрес его не изменялся, зарезервируем у провайдера и будем использовать фиксированный IP-адрес

Например, получим у Google Cloud-провайдера фиксированный IP-адрес
https://cloud.google.com/kubernetes-engine/docs/tutorials/configuring-domain-name-static-ip


Настройка service для Grafana имеет вид:

Google Cloud создает TCP/UDP LoadBalancer, который также умеет работать с HTTP запросами, но не умееет работать с HTTPS-трафиком.Если необходимо настраивать Grafana на использование HTTPS, тогда необходимо создавать Ingress ресурс, а тип сервиса устанавливать в NodePort( этот вариант рассмотрен в конце статьи)

https://cloud.google.com/load-balancing/docs/network/
https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer#background

Проверяем service для Grafana

Grafana запускается как Deplyment, а Prometheus и AlertManager – как StatefulSet

 

Описание назначения контейнеров, которые запускаются внутри одного пода для AlertManager, Prometheus, Grafana

В Pod-е c AlertManager-ом запускается два контейнера

Аналогично с Prometheus
В поде с Prometheus запущено 3 контейнера

Например, логи контйнера rules-configmap-reloader

В поде с Grafana запущено 3 контейнера

 

Проверка того, как поды AlertManager, Prometheus, Grafana используют Persistent Volume

 

Grafana

 

AlertManager

 

Prometheus

 

Увеличение размера/расширение Persistent Volume для Prometheus(используемого для хранения своих данных time-series database)

Для расширения тома, используемого подом необходимо
1.Изменить размер тома,указанного в PVC, который связан с PV, монтируемым/используемым подом
2.Расширить файловую систему(выполняется автоматически средствами Kubernetes при удалении пода вручную и его автоматическом перезапуске реплика контроллером)

Например, увеличим размер тома с 10Gb до 50Gb

 

1.Изменение размера тома,указанного в PVC
Расширяем размер тома с 10 до 50 Gb в ресурсе PVC
Для этого изменим значение параметра

С 10 на 50

После этого необходимо проверить наличие записи в ресурсе PVC,

означающей ожидание расширения файловой системы

 

2.Перезапускаем Pod для автоматического расширения файловой системы(альтернативным вариантом перезапуску пода является scaling down и scaling up)

Удаляем Pod,который испоьзует расширяемый том

После перезапуска Poda проверяем размер PVC, PV

 

Настройка Grafana на поддержку SSL

Для предоставления снаружи доступа к приложению, развернутого на Google Kubernetes Engine можно воспользоваться одним из следующих способов:
— Используя Service, которая создает TCP Network Load Balancer, работающий с региональными IP-адресами(что было реализовано выше). В таком случае необходимо создавать региональный IP-адрес. Глобальные IP-адреса работают только с типом ресурса Ingress
— Используя Ingress, который создает HTTP(S) Load Balancer и поддерживает глобальные IP-адреса.
Чтобы узнать о достоинствах и недостатках каждого метода, обратитесь к руководству по HTTP Load Balancing tutorial

При создании ресурса типа Ingress GKE ingress контроллер создает и настраивает балансировщик нагрузки HTTP(S) в соответствии с информацией в Ingress и связанных service-ов(service name и service port выступают в качестве backend-ов, на которые перенаправляются входящие на Ingress запросы). Кроме того, балансировщик нагрузки получает внешний IP-адрес, который можно связать с доменным именем.

Алгоритм действий состоит из следущих шагов
1.Создание ресурса Secret с типом tls в том же namespace, где запущен и сам Pod
2.Получение у облачного провайдера глобального статического внешнего IP-адреса, который будет использоваться Ingress-ом
3.Настройка Service и Ingress для Grafana

 

1.Создание вручную Secret с типом tls в том же namespace, где запущен и сам Pod с Grafana(в даном случае в namespace defaut)

Просмотр секрета

 

2.Получение у облачного провайдера глобального статического внешнего IP-адреса, который будет использоваться Ingress-ом

Создание статического ГЛОБАЛЬНОГО IP-адреса для Ingress

 

3.Настройка Service и Ingress для Grafana
— Тип Service необходимо изменить на NodePort
— включить и настроить Ingress

Обновление мониторинг стека и проверка доступности Grafana по HTTPS-протоколу

В DNS настраиваем соответствие доменного имени, на котором доступна Grafana, и IP-адреса, на котором настроен Ingress
Либо для тесторования через правку локального hosts-файла
В данном случае

После чего в браузере проверяем доступность Grafana через HTTPS

Удаление стека

Удаление custom resource definition(CRD)

 

Источник:
https://github.com/helm/charts/tree/master/stable/prometheus-operator
https://coreos.com/operators/prometheus/docs/latest/user-guides/getting-started.html
https://blog.lwolf.org/post/going-open-source-in-monitoring-part-i-deploying-prometheus-and-grafana-to-kubernetes/
https://akomljen.com/get-kubernetes-cluster-metrics-with-prometheus-in-5-minutes/
https://kubernetes.io/blog/2018/07/12/resizing-persistent-volumes-using-kubernetes/

Комментирование и размещение ссылок запрещено.

Комментарии закрыты.

Яндекс.Метрика