Top.Mail.Ru
поддержка 24/7
поддержка 24/7

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

Наш эксперт Михаил Сергеев подготовил подробный материал (в двух форматах: статья и видеоурок), из которого вы узнаете:

  • Что такое Prometheus, Grafana и Trickster;
  • Как установить эти компоненты в кластер Kubernetes;
  • Как ускорить работу и снизить нагрузку с помощью кэширующего прокси Trickster;
  • Как получить метрики всех нод нашего кластера;
  • Как настроить различные дашборды в Grafana для отображения собранных метрик.


Что такое Prometheus, Grafana и Trickster

Prometheus — это система мониторинга с открытым исходным кодом, которая широко используется для мониторинга Kubernetes-кластеров и других распределенных систем. Она позволяет операторам Kubernetes-кластеров отслеживать метрики, связанные с использованием ресурсов и способностью приложений и событий в кластере.

Prometheus позволяет собирать метрики из различных источников, включая сам Kubernetes, приложения и другие компоненты инфраструктуры. Он использует язык запросов PromQL для извлечения и агрегации метрик, что позволяет операторам получать ценную информацию о статусе кластера и приложений.

Prometheus поставляется с множеством инструментов для визуализации и анализа метрик, включая интерфейс веб-приложения, графики и предупреждения. Он также может интегрироваться с различными инструментами мониторинга и алертинга, такими как Grafana и Alertmanager, чтобы операторы могли получать уведомления о проблемах в реальном времени и принимать соответствующие меры.

Использование Prometheus и Kubernetes может помочь операторам эффективно управлять кластером, обеспечивает масштабируемость, надёжность приложений, а также быстро реагировать на проблемы. Он может помочь выявлять проблемы до того, как они начнут влиять на пользователей и предупреждать о возможных проблемах в режиме реального времени.

Grafana — это инструмент визуализации и анализа данных, который используется для мониторинга системы, приложений и инфраструктуры. В контексте Kubernetes и Prometheus, Grafana является компонентом, который используется для визуализации данных, собранных с помощью Prometheus.

Grafana может быть использован для создания красивых информационных дашбордов (Dashboard), которые представляют метрики, собранные Prometheus. Дашборды могут быть настроены для отображения графиков, таблиц, гистограмм и других типов данных. В зависимости от того, какие метрики необходимы для мониторинга. Вместе с Prometheus, Grafana образует мощную комбинацию для мониторинга и отладки Kubernetes приложений и инфраструктуры. Он предоставляет администраторам и разработчикам удобный интерфейс для просмотра и анализа метрик. А также помогает быстро обнаруживать проблемы в приложениях и инфраструктуре Kubernetes.   

Trickster — это кэширующий прокси-сервер, который может использоваться в связке с Prometheus и Grafana для улучшения производительности и снижения нагрузки на сервер Prometheus. Он представляет собой отдельный сервер, который может располагаться между клиентскими приложениями и сервером Prometheus.

Trickster кэширует ответы от сервера Prometheus, что позволяет сократить количество запросов, отправляемых на сервер, и уменьшить нагрузку на него. Он также может обрабатывать запросы на агрегированные данные, что позволяет снизить нагрузку на сервер Prometheus и ускорить обработку запросов.

Trickster поддерживает протокол HTTP, поэтому его можно использовать в любом окружении, которое поддерживает этот протокол. Он также предоставляет API для управления кэшем, которое может быть использовано для контроля размера кэша и времени хранения данных в нем.

Для использования Trickster с Prometheus и Grafana в Kubernetes необходимо настроить соответствующую интеграцию. Для этого нужно создать конфигурационный файл Trickster, который определяет настройки прокси-сервера. Затем нужно настроить Grafana на использование Trickster в качестве источника данных, а Prometheus - на отправку запросов через Trickster.

В целом использование кэширующего прокси Trickster позволяет увеличить производительность и снизить нагрузку на сервер Prometheus, что делает его более эффективным в работе с Kubernetes.

Принцип работы кэширующего прокси-сервера Trickster основан на кэшировании ответов от сервера Prometheus. Когда клиентское приложение отправляет запрос на сервер Prometheus, Trickster перехватывает этот запрос и проверяет, есть ли соответствующий ответ в его кэше. Если ответ есть в кэше, то Trickster возвращает его клиентскому приложению без обращения к серверу Prometheus. Если ответа нет в кэше, то Trickster отправляет запрос на сервер Prometheus, получает ответ и сохраняет его в кэше для дальнейшего использования.

Одним из ключевых элементов работы Trickster является его способность к агрегации данных. Trickster может обрабатывать запросы на агрегированные данные, такие как суммы, средние значения, максимальные и минимальные значения и т.д., что позволяет снизить количество запросов, отправляемых на сервер Prometheus, и ускорить обработку запросов.

Trickster также имеет возможность управления кэшем. Он может контролировать размер кэша и время хранения данных в нем, что позволяет сбалансировать производительность и потребление памяти.

Принцип работы Trickster можно описать следующим образом:

  1. 1. Клиентское приложение отправляет запрос на Trickster.
  2. 2. Trickster проверяет, есть ли ответ в кэше.
  3. 3. Если ответ есть в кэше, Trickster возвращает его клиентскому приложению.
  4. 4. Если ответа нет в кэше, Trickster отправляет запрос на сервер Prometheus.
  5. Trickster получает ответ от сервера Prometheus и сохраняет его в кэше.
  6. Trickster возвращает ответ клиентскому приложению.

При необходимости Trickster может обрабатывать запросы на агрегированные данные, контролировать размер кэша и время хранения данных в нем.

Установка компонентов в Kubernetes-кластер

Итак, с теорией разобрались, теперь переходим к практике.

#Используемые в уроке команды:
#### Kubernetes алиасы
echo "alias k='kubectl'" >> ~/.bashrc
echo "alias kg='kubectl get'" >> ~/.bashrc
echo "alias kgp='kubectl get po'" >> ~/.bashrc
echo "alias kd='kubectl delete -f'" >> ~/.bashrc
echo "alias ka='kubectl apply -f'" >> ~/.bashrc
echo "alias ke='kubectl exec -it'" >> ~/.bashrc
echo "alias k1='kubectl describe'" >> ~/.bashrc
echo "alias kl='kubectl logs'" >> ~/.bashrc
echo "alias kgs='kubectl get svc -A'" >> ~/.bashrc
echo "alias kr='kubectl rollout restart deployment'" >> ~/.bashrc
echo "alias krs='kubectl rollout restart sts'" >> ~/.bashrc
echo "alias kpa='kubectl get po -A'" >> ~/.bashrc
source ~/.bashrc

Посмотрим, что у нас есть, вот наш Kubernetes-кластер, 3 ceph ноды, сетевое хранилище, 3 мастер ноды (mnode), и одна вокер нода (wnode).

У нас имеются уже подготовленные команды для установки Prometheus.

# Установка Prometheus
cd /helms
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm pull prometheus-community/prometheus
tar zxf prometheus-19.7.2.tgz
rm prometheus-19.7.2.tgz -f
cp prometheus/values.yaml prometheus-values.yaml
vi prometheus-values.yaml
 
helm upgrade --install --create-namespace --values prometheus-values.yaml prometheus -n monitoring prometheus-community/prometheus
Рис.1 Установка Prometheus. Рис.1 Установка Prometheus.

Релиз Prometheus не найден. Если посмотреть список подов, у нас немспейс мониторинг.

Рис.2 Продолжение установки Prometheus.Рис.2 Продолжение установки Prometheus.

Давайте посмотрим сервисы. Вот сюда нам нужно обращаться будет, но мы будем обращаться не сюда, а к Trickster. Чуть позже это покажем. Мы указали 100 Гб размер для persistent volume claim (pvc). Он сделал запрос и создал нам pv на 100 Гб. С Prometheus в принципе всё, проверим, установлен ли он. Все поды запущены, статус running.

У нас имеются уже подготовленные команды для установки Grafana.

#### GRAFANA
 
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm pull grafana/grafana
tar zxf grafana-6.52.1.tgz
rm grafana-6.52.1.tgz -f
cp grafana/values.yaml grafana-values.yaml
vi grafana-values.yaml
persistence необходимо поставить в положение true иначе после смерти пода все настройки сбросятся
persistence:
  type: pvc
  enabled: true
helm upgrade --install --create-namespace --values grafana-values.yaml grafana -n monitoring grafana/grafana
admin
TstCEZG7H1RRDGFoAhWSeXhyE0EZJsBUBpmIMjRH
Рис.3 Установка Grafana.Рис.3 Установка Grafana.

Получаем пароль TstCEZG7H1RRDGFoAhWSeXhyE0EZJsBUBpmIMjRH

Ускорение работы и снижение нагрузки с помощью кэширующего прокси Trickster

Затем устанавливаем Trickster, для него все команды также заранее подготовлены.

# Установка Trickster
helm repo add tricksterproxy https://helm.tricksterproxy.io
helm repo update
helm pull tricksterproxy/trickster
tar zxf trickster-1.5.4.tgz
rm trickster-1.5.4.tgz -f
cp trickster/values.yaml trickster-values.yaml
vi trickster-values.yaml
helm upgrade --install --create-namespace --values trickster-values.yaml trickster -n monitoring tricksterproxy/trickster

Рис.4 Установка Trickster.Рис.4 Установка Trickster.

Проверяем созданные поды и какие сервисы добавились.

#Добавляем ингресс для внешнего доступа:
cat << \EOF > grafana-ingress.yaml
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 95.217.236.3/32,192.248.191.109/32,94.143.44.29/32
	cert-manager.io/issuer: gitlab-issuer
	kubernetes.io/ingress.class: nginx
#	kubernetes.io/tls-acme: "true"
  name: grafana
  namespace: monitoring
spec:
  rules:
  - host: monitoring.195-208-185-64.sslip.io
	http:
  	paths:
  	- backend:
      	service:
        	name: grafana
        	port:
          	number: 80
    	path: /
    	pathType: Prefix
  tls:
  - hosts:
	- monitoring.195-208-185-64.sslip.io
	secretName: grafanassl
...
EOF
ka grafana-ingress.yaml
 
#Получить пароль админа от графаны:
kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
Рис.5 Добавляем ингресс для внешнего доступа.Рис.5 Добавляем ингресс для внешнего доступа.

Тут важной частью является White-лист в нем прописаны IP-адреса с которых можно подключаться к системе. Поскольку Grafana будет доступна на внешнем адресе, любой желающий не должен иметь возможность подключиться к ней. Подключение должно происходить исключительно с определённых IP-адресов. У нас это VPN. Для подключения к Grafana включаем VPN, получаем нужный адрес из белого списка. Также сотруднику вы сможете выдавать VPN сертификат для получения нужного IP-адреса.

При увольнении сотрудника у него забирается VPN, после чего он теряет доступ к системе. Это очень удобно, поскольку позволяет не менять пароли.

Копируем текст, и теперь Grafana создан, можно к нему удалённо подключаться.

Получение метрик всех нод нашего кластера

Теперь, имея пароль, перейдём к Grafana и попытаемся настроить источник Prometheus через txt. И ещё один важный момент — нам нужен сервис. Для него нужно заполнить название и задать порт.

Открываем браузер, вводим наш адрес сервиса monitoring.195-208-185-64.sslip.io, при этом создаётся SSL-сертификат (цифровой сертификат, удостоверяющий подлинность веб-сайта и позволяющий использовать зашифрованное соединение). Вводим наши логин и пароль. Успешно зашли, тут ещё пока ничего не настроено. Теперь нам нужно подключить источник. Заходим в настройки и выбираем необходимый  источник. Тут можно с разных источников получать данные, но у нас используется Prometheus. Затем вводим адрес нашего прокси, оставляем название источника по умолчанию. Аутентификации там нет. Сохраняем изменения настроек и запускаем их тест. Нажимаем сохранить и после этого источник добавлен.

Настройка различных дашбордов в Grafana для отображения собранных метрик

Теперь нам необходимо создать дашборд, который будет нам показывать метрики. Есть уже готовые дашборды и мы переходим на сайт, где можно их посмотреть. Открываем https://grafana.com/grafana/dashboards/

Нам нужен Prometheus, мы заранее подготовили ID номера наиболее интересных дашбордов.

Grafana dashboards:
1860 (stat)
9614 (nginx)
2842 (ceph)
315

Дашборд устанавливается двумя способами, либо через установку сон файла, либо через указание ID номера. Выбираем папку, название и наш источник ID номера. Нажимаем импорт и всё готово.

Рис.6 Пример дашборда.Рис.6 Пример дашборда.

Если одна нода вылетит, то система продолжит свою работу, но её статус уже изменится. Можно посмотреть длину очереди и собирать все метрики с вашего кластера. Также можно настроить уведомления о различных происшествиях аллерты (программируемые оповещения о каком-либо событии).

Kubernetes в облаке Corpsoft24

Загрузка ...