Статьи

Откройте для себя приложения, работающие в Kubernetes с Prometheus

Прометей поддерживает удаление нескольких экземпляров приложения. Приложения, которые работают в оркестрированных средах, должны обнаруживаться динамически, так как их IP-адреса будут меняться. Прометей может быть настроен на использование API Kubernetes для динамического обнаружения изменений в списке запущенных экземпляров.

Ниже приведен минималистичный пример использования Prometheus инструментов для нескольких приложений.

Конфигурация Прометея

Мы настраиваем Prometheus для обнаружения модулей нашего config-example .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
global:
  scrape_interval:     15s
 
  external_labels:
    monitor: 'example-monitor'
 
scrape_configs:
- job_name: 'example-metric'
  scrape_interval: 5s
 
  metrics_path: /metrics/
  scheme: https
  basic_auth:
    username: admin
    password: adminadmin
  tls_config:
    insecure_skip_verify: true
 
 
  kubernetes_sd_configs:
  - role: endpoints
    namespaces:
      names:
      - default
 
  relabel_configs:
  - source_labels: [__meta_kubernetes_service_label_app]
    separator: ;
    regex: config-example
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_endpoint_port_name]
    separator: ;
    regex: https
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_namespace]
    separator: ;
    regex: (.*)
    target_label: namespace
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_pod_name]
    separator: ;
    regex: (.*)
    target_label: pod
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_service_name]
    separator: ;
    regex: (.*)
    target_label: service
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_service_name]
    separator: ;
    regex: (.*)
    target_label: job
    replacement: ${1}
    action: replace
  - separator: ;
    regex: (.*)
    target_label: endpoint
    replacement: https
    action: replace

Нам нужно настроить метку app (здесь config-example ) и имя порта ( https ), под которым доступна конечная точка мониторинга.

Инструментированное приложение

В этом примере используется конечная точка MicroProfile Metrics, которая работает поверх Open Liberty. Приложение предоставляет метрики в формате Prometheus через порт 9443 и путь /metrics/ .

Здесь вы можете увидеть пример службы и развертывания:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
kind: Service
apiVersion: v1
metadata:
  name: config-example
  labels:
    app: config-example
spec:
  selector:
    app: config-example
  ports:
  - port: 9443
    name: https
  - port: 9080
    name: http
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
kind: Deployment
apiVersion: apps/v1beta1
metadata:
  name: config-example
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: config-example
    spec:
      containers:
      - name: config-example
        image: sdaschner/config-example:1
    # ...

Вы можете найти полный пример, включая работающее приложение на GitHub.

Установка Прометея и RBAC

Чтобы пример работал для настройки RBAC Kubernetes, учетная запись службы Prometheus должна иметь правильные разрешения. Поэтому мы создаем учетную запись службы и соответствующие роли кластера, как указано в определениях YAML. Точно так же мы указываем учетную запись службы при создании развертывания Prometheus.

Мы создаем развертывание и сервис для нашего экземпляра Prometheus.

01
02
03
04
05
06
07
08
09
10
11
12
kind: Service
apiVersion: v1
metadata:
  name: prometheus
  labels:
    app: prometheus
spec:
  selector:
    app: prometheus
  ports:
  - port: 9090
    name: http
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
kind: Deployment
apiVersion: apps/v1beta1
metadata:
  name: prometheus
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: prometheus
        version: v1
    spec:
      serviceAccountName: prometheus
      containers:
      - name: prometheus
        image: prom/prometheus:v2.7.1
        ports:
        - containerPort: 9090
        volumeMounts:
        - name: prometheus-config-volume
          mountPath: /etc/prometheus/prometheus.yml
          subPath: prometheus.yml
      volumes:
      - name: prometheus-config-volume
        configMap:
          name: prometheus-config
      restartPolicy: Always

Ранее указанная конфигурация может быть введена в экземпляр из карты конфигурации.

1
2
3
4
5
6
7
8
9
kind: ConfigMap
apiVersion: v1
metadata:
  name: prometheus-config
data:
  prometheus.yml: |
    global:
      scrape_interval:     15s
      # content as shown earlier ...

Для полного объяснения конфигурации Prometheus, посмотрите документацию .

Доступ к целям

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

1
gt; kubectl get pods NAME READY STATUS RESTARTS AGE config-example-69974cbc96-dqd96 1/1 Running 0 4m config-example-69974cbc96-zstg7 1/1 Running 0 4m grafana-8694db9d4f-nvn5s 1/1 Running 0 3m prometheus-594dd9cdb8-95ftz 1/1 Running 0 3m

Мы можем видеть фактические цели, включая их IP-адрес в конфигурации Prometheus.

Кубернетес с Прометеем

Посмотрите полный пример на GitHub . Вы также можете увидеть следующее видео о том, как реализовать бизнес-метрики в приложениях Java EE с помощью MicroProfile.

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

Удачного мониторинга!

Опубликовано на Java Code Geeks с разрешения Себастьяна Дашнера, партнера нашей программы JCG. Посмотрите оригинальную статью здесь: Откройте для себя приложения, работающие в Kubernetes с Prometheus

Мнения, высказанные участниками Java Code Geeks, являются их собственными.