Як моніторити кластери 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, які дають змогу легше очищати показники кластера та програм для моніторингу.
Хоча ви можете розглядати оператор як ще один абстрактний рівень, який потрібно підтримувати в і без того складній системі, ефективність, яку він пропонує, не можна відкидати. Автоматизація конфігурації та операційних процесів звільняє час, який можна використати для кращого використання.
1 коментар
Додати коментар Підписатись на коментаріВідписатись від коментарів