Prometheus Operator использует CRD (Custom Resource Definitions) для генерирования конфигурационных файлов и определения ресурсов Prometheus
- alertmanagers — определяет инсталяцию для Alertmanager
- podmonitors — определяюет какие поды как нужно мониторить
- prometheuses — определяет инсталяцию для Prometheus
- prometheusrules — определяет правила для alertmanager
- servicemonitors — определяюет какие сервисы как нужно мониторить
Оператор следит за ресурсами Prometheus и генерирует StatefullSet (Prometheus и Alertmanager) и файлы конфигурации (prometheus.yaml, alertmanager.yaml)
Так же оператор следит за ресурсами из ServiceMonitors, PodMonitors и ConfigMaps, генерируя на их основании prometheus.yaml
Prometheus Pod
в поде Prometheus запущенны 3 контейнера:
- Prometheus
- prometheus-config-reloader — надстройка к prometheus которая следит за изменениями в prometheus.yaml и HTTP-запросом делает reload конфигурации prometheus
- rules-configmap-reloader — следит за изменениями в файле alerts и так же перезагружает prometheus
Принцип обработки Service Monitors:
- Prometheus Operator следит за добавлением, удалением и изменением Service Monitor
- На основании ServiceMonitors prometheus operator генерирует часть конфигурационного файла и сохраняет в kubernetes secret
- Из kubernetes secret конфиг попадает в под
- Изменения видит prometheus-config-reloader и перезагружает prometheus
- Prometheus перезагружаясь перечитывает конфигурацию и далее собирает новые метрики по своей логике
Alertmanager Pod
Так же как и в поде с prometheus запущенны 2 контейнера:
- alertmanager
- config-reloader — надстрока к alertmanager которя следит за измениями и HTTP-запросом делает reload конфигурации alermanager
Grafana Pod
- Grafana
- Grafana-sc-dashboard — надстрока к grafana которая сделит за ConfigMaps и гененрирует на их основе json dashboards для Grafana
Установка и настройка Prometheus Operator
Установка Prometheus осуществляется с помощью helm.
Клонируем репозиторий и обновляем завистимости:
1 2 |
cd charts/stable/prometheus-operator helm dependency update |
Теперь устанавливаем prometheus:
1 |
helm install --name prometheus --namespace monitoring prometheus-operator |
Должны увидеть:
1 |
kubectl get pod |
1 2 3 4 5 6 |
NAME READY STATUS RESTARTS AGE alertmanager-prometheus-prometheus-oper-alertmanager-0 2/2 Running 0 1m prometheus-grafana-656769c888-445wm 2/2 Running 0 1m prometheus-kube-state-metrics-57f9c94c59-sg5bn 1/1 Running 0 1m prometheus-prometheus-oper-operator-6844ff8f64-rzwlf 2/2 Running 0 1m prometheus-prometheus-prometheus-oper-prometheus-0 3/3 Running 1 1m |
После того все поды запустились можем глянуть на web UI Prometheus:
1 |
kubectl port-forward prometheus-prometheus-prometheus-oper-prometheus-0 9090:9090 |
Открываем в браузере http://localhost:9090, в service discovery должны увидеть сервисы которое были заданы по дефолту:
Что б посмотреть какие метрики собираются нужно выполнить команду:
1 |
kubectl get servicemonitors.monitoring.coreos.com |
Вывод:
1 2 3 4 5 6 7 8 9 10 11 12 |
prometheus-prometheus-oper-alertmanager 19d prometheus-prometheus-oper-apiserver 19d prometheus-prometheus-oper-coredns 19d prometheus-prometheus-oper-grafana 19d prometheus-prometheus-oper-kube-controller-manager 19d prometheus-prometheus-oper-kube-etcd 19d prometheus-prometheus-oper-kube-proxy 19d prometheus-prometheus-oper-kube-scheduler 19d prometheus-prometheus-oper-kube-state-metrics 19d prometheus-prometheus-oper-kubelet 19d prometheus-prometheus-oper-operator 19d prometheus-prometheus-oper-prometheus 19d |
Тоже самое мы видели в web UI
Теперь добавим наши собственные метрики в Prometheus. Для примера будем использовать traefik. Создадим файл traefik-deployment.yaml и задеплоим его в kubernetes
1 |
vi traefik-deployment.yaml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
kind: Deployment apiVersion: extensions/v1beta1 metadata: name: traefik namespace: ingress labels: app: traefik spec: replicas: 1 selector: matchLabels: app: traefik template: metadata: labels: app: traefik spec: containers: - image: traefik:v1.7.11-alpine name: traefik-ingress-lb args: - --api - --api.statistics - --kubernetes - --logLevel=INFO - --configfile=/config/traefik.toml ports: - containerPort: 8080 name: metrics |
1 |
kubectl apply -f traefik-deployment.yaml |
Проверяем есть ли метрики:
1 |
kubectl port-forward traefik-hjbjk 8080:8080 |
Открываем в браузере http://localhost:8080/metrics. Должны увидеть:
Теперь создаем файл сервиса traefik-metrics-service.yaml для метрик:
1 |
vi traefik-metrics-service.yaml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
apiVersion: v1 kind: Service metadata: name: traefik-metrics namespace: ingress labels: app: traefik-metrics release: monitoring spec: selector: app: traefik ports: - name: metrics port: 8080 targetPort: 8080 type: ClusterIP |
Деплоим его в наш Kubernetes:
1 |
kubectl apply -f traefik-metrics-service.yaml |
Проверяем наш сервис:
1 |
kubectl port-forward svc/traefik-metrics 8080:8080 |
По адресу http://localhost:8080/metrics должны увидеть те же метрики что и port-forward описаный выше
Теперь приступим к деплою ServiceMonitors. Prometheus следит за ServiceMonitors по label. Нужно знать по какому label он ищет ServiceMonitors. Для этого делаем:
1 |
kubectl get prometheuses.monitoring.coreos.com -oyaml |
Ищем блок serviceMonitorSelector:
1 2 3 4 |
serviceMonitorNamespaceSelector: {} serviceMonitorSelector: matchLabels: release: monitoring |
В нашем солучае это release: monitoring. Зная label создаем файл traefik-servicemonitor.yaml
1 |
vi traefik-servicemonitor.yaml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: traefik labels: release: monitoring app: traefik-metrics spec: endpoints: - port: metrics path: '/metrics' namespaceSelector: any: true selector: matchLabels: app: traefik-metrics release: monitoring |
В нашем Prometheus должен появиться новый target, проверяем:
1 |
kubectl port-forward prometheus-prometheus-prometheus-oper-prometheus-0 9090:9090 |
Открываем в браузере http://localhost:9090:
Метрики успешно Prometheus забирает, можно переходить к созданию дашборда для Grafana.
Скачиваем нужный нам дашборд здесь. И переделываем его на ConfigMap:
1 |
vi traefik-dashboard.yaml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{{- if and .Values.grafana.enabled .Values.grafana.defaultDashboardsEnabled .Values.kubeEtcd.enabled }} apiVersion: v1 kind: ConfigMap metadata: name: {{ printf "%s-%s" (include "prometheus-operator.fullname" $) "traefik" | trunc 63 | trimSuffix "-" }} labels: {{- if $.Values.grafana.sidecar.dashboards.label }} {{ $.Values.grafana.sidecar.dashboards.label }}: "1" {{- end }} app: {{ template "prometheus-operator.name" $ }}-grafana {{ include "prometheus-operator.labels" $ | indent 4 }} data: traefik.json: |- JSON Dashboard starts ...... JSON Dashboard ends {{- end }} |
C отступами вставляем json нашего дашборда вметсо JSON Dashboard starts …… JSON Dashboard ends. В самом json важно экранировать выражения типа {{instance}} в {{{{instance}}
}}.
И переносим наш файл в prometheus-operator/templates/grafana/dashboards, примеяем:
1 |
helm upgrade prometheus ./ |
Теперь Dashboard должен появится в нашей Grafana.
Так мы рассмотрели основные принципы работы Prometheus Operator