Як моніторити кластери Kubernetes за допомогою оператора Prometheus

Усі статті, обговорення, новини про DevOps — в одному місці. Підписуйтеся на DOU | DevOps!

Kubernetes — один з найпопулярніших інструментів DevOps для розгортання та керування контейнерними програмами на одному або кількох серверах. Ці обчислювальні вузли також відомі як кластери, і їх продуктивність є вирішальною для успіху програми.

Якщо кластер Kubernetes не працює оптимально, доступність і продуктивність програми впадуть, що призведе до незадоволених користувачів і навіть до втрати прибутку. На щастя, кілька інструментів в екосистемі Kubernetes можуть допомогти вам ефективно моніторити кластер Kubernetes, зокрема Prometheus.

У цій статті ви дізнаєтеся про переваги використання операторів Kubernetes. Ви також дізнаєтеся, як розгортати та використовувати Prometheus Operator для налаштування та керування екземплярами Prometheus у вашому кластері Kubernetes. І, нарешті, ви дізнаєтеся, як розгорнути Grafana у своєму кластері Kubernetes, щоб допомогти аналізувати та візуалізувати працездатність ваших кластерів Kubernetes.

Навіщо контролювати кластери Kubernetes за допомогою Prometheus

Prometheus — це інструмент із відкритим вихідним кодом, який забезпечує моніторинг і алерти для рідних хмарних середовищ. Він збирає дані метрик із цих середовищ і зберігає їх як дані часових рядів, записуючи інформацію з міткою часу в пам’ять або на локальний диск.

Ви можете встановити та налаштувати Prometheus у своєму кластері Kubernetes за допомогою оператора Kubernetes, наприклад Prometheus Operator.

Що таке оператори Kubernetes

Оператори Kubernetes — це розширення програмного забезпечення, які розширюють функціональні можливості Kubernetes API для налаштування та керування іншими програмами Kubernetes. Вони використовують спеціальні ресурси для керування цими програмами та їхніми компонентами.

Контролери Kubernetes

У Kubernetes існують цикли керування, які називаються контролерами Kubernetes, які відстежують стан кластера Kubernetes, щоб переконатися, що він схожий або дорівнює бажаному стану. Наприклад, якщо ви хочете розгорнути нову контейнерну програму, ви створюєте об’єкт розгортання в кластері з необхідними деталями за допомогою клієнта kubectl або інформаційної панелі Kubernetes. Контролер Kubernetes отримує інформацію про цей новий об’єкт, а потім виконує необхідні дії для розгортання програми в кластері. Так само, коли ви редагуєте об’єкт, контролер отримує оновлення та виконує необхідні дії.

Оператори Kubernetes

Оператори Kubernetes використовують цей шаблон контролера Kubernetes дещо по-іншому. Вони залежать від програми, тобто різні програми можуть мати власні оператори (їх можна знайти на OperatorHub.io). Оператори відстежують додатки в кластері та виконують необхідні завдання, щоб забезпечити функції додатків у бажаному стані, який ви налаштовуєте у визначенні власного ресурсу (CRD).

Розгортання екземплярів Prometheus вручну без використання Prometheus Operator або діаграми Prometheus Helm може бути важким і трудомістким. Вам потрібно буде налаштувати певні об’єкти Kubernetes, наприклад ConfigMap, секрети, розгортання та сервіси, які оператор Prometheus абстрагує від вашого імені. Оператор Prometheus також допомагає вам керувати динамічними оновленнями ресурсів, таких як правила Prometheus з нульовим даунтаймом, серед інших переваг.

Переваги використання операторів Kubernetes

Оператори надають численні переваги екосистемі Kubernetes.

1. Пакування, розгортання та керування програмами. Оператори Kubernetes забезпечують більш плавне розгортання програм і керування ними. Наприклад, працювати з хмарними програмами зі складними процедурами інсталяції та етапами обслуговування буде легше, оскільки ви можете створювати спеціальні ресурси для автоматизації та спрощення складних процедур інсталяції. Оператори також покращують керування додатками з відстеженням стану, такими як бази даних, тому легше виконувати резервне копіювання бази даних і налаштовувати додатки бази даних. Використання операторів дає змогу автоматизувати ці та інші складні процеси.

2. Виконання основних операцій за допомогою kubectl. Оскільки оператори Kubernetes розширюють функціональні можливості сервера Kubernetes API, вони також дозволяють використовувати клієнт kubectl для виконання основних команд для користувальницьких ресурсів, таких як GET і LIST, дозволяючи вам керувати своїми користувальницькими ресурсами за допомогою команд, з якими ви вже знайомі, в терміналі.

3. Полегшення моніторингу ресурсів. Оскільки оператори Kubernetes виконують користувацькі завдання в програмі на основі CRD, вони постійно відстежують програму та кластер, щоб перевірити, чи немає чогось недоречного. Якщо в додатку є розбіжність, наприклад, якщо додаток не в очікуваному стані, оператори виправляють це автоматично. Це рятує адміністратора Kubernetes від проблем з виявленням і виправленням проблем у кластері.

Як розгорнути та налаштувати Prometheus Operator у Kubernetes

Як зазначалося раніше, Prometheus добре працює для моніторингу вашої програми та ресурсів у вашому кластері Kubernetes. Нижче ми покажемо вам, як використовувати оператор Prometheus для розгортання та налаштування екземпляра Prometheus у вашому кластері Kubernetes.

Для цього вам знадобиться наступне:

  • Запущений кластер Kubernetes. Ви можете використовувати minikube, який підтримує Linux, Mac і Windows, щоб налаштувати локальний кластер на вашому комп’ютері.
  • Клієнт kubectl, встановлений на вашому комп’ютері.

Розгортання Prometheus Operator

Ви збираєтеся розгорнути Prometheus Operator у своєму кластері, а потім налаштувати дозвіл для розгорнутого оператора «підтягнути» цілі у вашому кластері.

Ви можете розгорнути, застосувавши файл bundle.yaml зі сховища Prometheus Operator GitHub:

kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/main/bundle.yaml

Якщо ви зіткнулися з помилкою The CustomResourceDefinition "prometheuses.monitoring.coreos.com" is invalid: metadata.annotations: Too long: must have at most 262144 bytes, тоді виконайте таку команду: kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/main/bundle.yaml --force-conflicts=true --server-side=true

Ця команда дозволяє розгортати Prometheus Operator CRD, не змінюючи Kubernetes розгортання, якщо він стикається з будь-якими конфліктами під час встановлення оператора у вашому кластері. У цьому випадку ваш кластер скаржиться на довгу анотацію метаданих, яка перевищує обмеження, надані Kubernetes. Однак --force-conflicts=true дозволяє продовжити встановлення без попередження про зупинку. Крім того, --force-conflicts працює лише з --server-side. Для отримання додаткової інформації про –server-side та --force-conflicts натисніть тут.

Після того, як ви введете команду, ви повинні отримати результат, подібний до цього:

customresourcedefinition.apiextensions.k8s.io/alertmanagerconfigs.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/probes.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/thanosrulers.monitoring.coreos.com created
clusterrolebinding.rbac.authorization.k8s.io/prometheus-operator created
clusterrole.rbac.authorization.k8s.io/prometheus-operator created
deployment.apps/prometheus-operator created
serviceaccount/prometheus-operator created
service/prometheus-operator created

Коли ви запускаєте kubectl get deployments, ви бачите, що оператор Prometheus розгорнуто:

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
prometheus-operator   1/1     1            1           6m1s

Далі ви встановите дозволи керування доступом на основі ролей (RBAC), щоб дозволити серверу Prometheus отримувати доступ до API Kubernetes для сканування цілей і отримання доступу до кластера Alertmanager. Щоб досягти цього, ви розгорнете обліковий запис ServiceAccount. Створіть файл з назвою prometheus_rbac.yaml і вставте в нього такий вміст:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - nodes/metrics
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources:
  - configmaps
  verbs: ["get"]
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: default

Потім застосуйте файл до свого кластера:

kubectl apply -f prometheus_rbac.yaml

Ви повинні отримати таку відповідь:

serviceaccount/prometheus created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created

Розгортання Prometheus

Тепер, коли ви розгорнули Prometheus Operator у своєму кластері, ви збираєтеся створити екземпляр Prometheus за допомогою Prometheus CRD, визначеного у файлі YAML. Створіть файл з назвою prometheus_instance.yaml і вставте наступне:

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: prometheus
spec:
  serviceAccountName: prometheus
  serviceMonitorSelector: {}
  resources:
    requests:
      memory: 300Mi

Потім виконайте наступне:

kubectl apply -f prometheus_instance.yaml

У файлі YAML вище serviceAccountName посилається на ServiceAccount, який ви створили раніше для ClusterRoleBinding. serviceMonitorSelector вказує на ServiceMonitor, який дозволяє Prometheus контролювати певні служби у вашому кластері. Якщо ви хочете, щоб Prometheus вибрав усі наявні ServiceMonitors, ви повинні призначити {} ключу serviceMonitorSelector; якщо ви не хочете, щоб він вибирав будь-який ServiceMonitor, не включайте його в CRD Prometheus.

Щоб вибрати певний ServiceMonitor, використовуйте щось на зразок цього:

serviceMonitorSelector:
    matchLabels:
      app: frontend

Після застосування файлу prometheus_instance.yaml створюється prometheus-operated сервіс, який можна побачити, запустивши kubectl get svc.

Тепер отримайте доступ до сервера, перенаправивши локальний порт до служби Prometheus:

kubectl port-forward svc/prometheus-operated 9090:9090

Відкрийте URL-адресу localhost:9090 у своєму браузері, щоб побачити сторінку, схожу на зображення нижче:

Налаштування Prometheus для моніторингу служб і програм

У кластері з багатьма різними програмами, що працюють одночасно, ви можете не захотіти, щоб один екземпляр Prometheus збирав метрики з усіх них. Ймовірно, ви маєте на увазі певні програми, з яких ви хочете отримати метрики, і ви можете вказати їх за допомогою CRD ServiceMonitor.

CRD ServiceMonitor дає змогу налаштувати, як ви хочете, щоб Prometheus працював з точки зору сканування метрик. Ви можете налаштувати Prometheus на збирання показників із усіх сервісів, які відповідають мітці Frontend або Staging. Ви навіть можете налаштувати частоту інтервалів, з якою Prometheus знімає показники з набору сервісів. ServiceMonitor CRD дає вам величезні можливості над тим, як Prometheus відстежує служби у вашому кластері.

Створення CRD ServiceMonitor

Далі ви збираєтеся створити приклад CRD ServiceMonitor. Створіть файл під назвою service_monitor.yaml і вставте наступне:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    name: prometheus
  name: prometheus
spec:
  endpoints:
  - interval: 30s
    targetPort: 9090
    path: /metrics
  namespaceSelector:
    any: true
  selector:
    matchLabels:
      operated-prometheus: "true"

Код каже Prometheus кожні тридцять секунд очищувати служби з міткою operated-prometheus: "true", до якої можна отримати доступ у кінцевій точці /metrics. Крім того, це означає, що Prometheus збиратиме власні дані та стежитиме за власним станом. Важливо також зазначити, що вам слід змінити ключ-значення matchLabels, який є operated-prometheus: «true» на службові мітки, які ви хочете контролювати. Ключ-значення matchLabels є лише прикладом для цієї статті.

Застосуйте його до свого кластера Kubernetes, виконавши таку команду:

kubectl apply -f service_monitor.yaml

Налаштування Prometheus Operator за допомогою об’єктів CRD

Оператор Prometheus надає різні типи CRD, які можна застосувати в кластері Kubernetes для керування програмою Prometheus. Серед уже згаданих у цьому посібнику Prometheus CRD і ServiceMonitor CRD. Інші параметри включають PrometheusRules, Alertmanager і PodMonitor. Ви можете прочитати більше про інші об’єкти CRD у документації Github.

Розгортання Grafana у вашому кластері Kubernetes

Далі розглянемо, як розгорнути Grafana в Kubernetes. Grafana дозволяє запитувати, візуалізувати, попереджати та розуміти свої показники незалежно від того, де вони зберігаються.

У вашому терміналі виконайте таку команду:

kubectl create deployment grafana --image=docker.io/grafana/grafana:latest

Ви можете запустити kubectl get deployments, щоб підтвердити, що Grafana розгорнуто:

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
grafana               1/1     1            1           7m27s

Далі ви створите сервіс для розгортання Grafana:

kubectl expose deployment grafana --port 3000

Перенаправте порт 3000 до служби, виконавши команду нижче:

kubectl port-forward svc/grafana 3000:3000

Відкрийте localhost:3000 у своєму браузері, щоб отримати доступ до інформаційної панелі Grafana. Увійдіть з admin як ім’я користувача та пароль. Це перенаправить вас на сторінку, де вам буде запропоновано змінити пароль; після цього ви побачите домашню сторінку Grafana:

Клацніть «Data Sources», потім виберіть «Prometheus» і заповніть деталі конфігурації, наприклад URL-адресу сервера Prometheus, доступ, тип автентифікації та інтервали сканування.

Ви не можете використовувати http://localhost:9090 як URL-адресу HTTP, оскільки Grafana не матиме до нього доступу. Ви повинні виставити prometheus за допомогою NodePort або LoadBalancer.

Створіть файл з назвою expose_prometheus.yaml і вставте наступне:

apiVersion: v1
kind: Service
metadata:
  name: prometheus
spec:
  type: NodePort
  ports:
  - name: web
    nodePort: 30900
    port: 9090
    protocol: TCP
    targetPort: web
  selector:
    prometheus: prometheus

Запустіть kubectl apply -f expose_prometheus.yaml. Grafana зможе отримувати показники з http://<node_ip>:30900. Щоб переглянути <node_ip>, запустіть kubectl get nodes -o wide.

Введіть http://<node_ip>:30900 у полі URL-адреси, а потім натисніть «Save & Test».

Створення інформаційної панелі Grafana для моніторингу подій Kubernetes

Давайте створимо інформаційну панель, яка показуватиме графік загальної кількості подій Kubernetes, оброблених модулем Prometheus. Наведіть курсор на панель ліворуч на екрані та виберіть Dashboards — New dashboard, а потім виберіть Add a new panel.

Виберіть Prometheus як Data source, виберіть prometheus_sd_kubernetes_events_total для метрики та prometheus-prometheus-0 у вхідних мітках або ви можете вибрати будь-яку метрику та мітки, які хочете контролювати. Потім натисніть Run queries:

У правій частині конфігурації панелі приладів ви можете налаштувати такі деталі, як стилі графіка, положення легенд і заголовок графіка:

Завершивши, натисніть Apply. Ви будете перенаправлені на нову сторінку з вашою інформаційною панеллю. Ви можете додати більше панелей інструментів, натиснувши кнопку Add panel, або завершити створення панелі інструментів, натиснувши кнопку Save dashboard.

Натисніть кнопку Save, щоб зберегти інформаційну панель із власною назвою:

Тепер, коли вашу інформаційну панель налаштовано, ви можете додати скільки завгодно панелей для моніторингу різних показників, зібраних із вашого екземпляра Prometheus у вашому кластері:

Висновок

Адміністраторам і користувачам Kubernetes часто важко розгортати складні програми та керувати ними, але оператори Kubernetes допомагають. Спеціальні оператори програми спрощують процеси розгортання та керування від адміністратора Kubernetes до Kubernetes API. Зокрема, Prometheus Operator спрощує керування Prometheus завдяки своїм CRD, які дають змогу легше очищати показники кластера та програм для моніторингу.

Хоча ви можете розглядати оператор як ще один абстрактний рівень, який потрібно підтримувати в і без того складній системі, ефективність, яку він пропонує, не можна відкидати. Автоматизація конфігурації та операційних процесів звільняє час, який можна використати для кращого використання.

👍ПодобаєтьсяСподобалось2
До обраногоВ обраному3
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

дуже маленьке доповнення: набагато краще таке встановлювати як helm install.... kubectl apply мусить бути забороненим, хоча б на Проді. Для Графани краще теж обрати grafana-operator — то буде можливо дашборди деплоїти також хелм чартом (з Вашим кастомерським продуктом).

Підписатись на коментарі