Моніторинг та логування зовнішніх сервісів у кластері Kubernetes

Моніторинг та логування зовнішніх сервісів у кластері Kubernetes

Доброго всім.

Я не знайшов у мережі узагальненого посібника з логування та збору метрик зі сторонніх сервісів у системи розгорнуті в Кубернетес. Публікую своє рішення. Ця стаття має на увазі, що у вас вже є робітник Прометей та інші служби. Як приклад джерела даних зовнішнього stateful-сервісу використовуватиметься СУБД PostgreSQL у контейнері Docker. У компанії використовується пакетний менеджер Кермонижче за текстом будуть приклади на ньому. Для всього рішення ми готуємо власний чарт, що включає вкладені чарти всіх використовуваних сервісів.

Логування

Багато компаній для збору та перегляду та централізації логів використовується стек технологій Elasticsearch + Логсташ + кібана, скорочено ELK. У нашому випадку немає необхідності індексувати контент і я застосував більш легкий Локі. Він доступний у вигляді пакету Helm, ми додали його як subchart змінивши values ​​для ingress та pv під нашу систему.

values.yaml

ingress:
  enabled: true
  annotations:
     kubernetes.io/ingress.class: nginx
  hosts:
    - host: kube-loki.example.domain
      paths: 
        - /
  tls: []

....

persistence:
  type: pvc
  enabled: true
  accessModes:
    - ReadWriteOnce
  size: 100Gi
  finalizers:
    - kubernetes.io/pvc-protection
  existingClaim: "pv-loki"

Для відправки логів на інстанс Локі використовуємо Loki Docker Logging Driver.

Необхідно встановити цей додаток на все Docker хости, з яких бажаєте отримувати логи. Є кілька способів вказати демону, як використовувати додаток. Я вибір драйвера проводжу в yaml Docker Compose, який є частиною Неможливо зошит.

postgres.yaml

    - name: Run containers
      docker_compose:
        project_name: main-postgres
        definition:
          version: '3.7'
          services:
            p:
              image: "{{ postgres_version }}"
              container_name: postgresql
              restart: always
              volumes:
                - "{{ postgres_dir }}/data:/var/lib/postgresql/data"
                - "{{ postgres_dir }}/postgres_init_scripts:/docker-entrypoint-initdb.d"
              environment:
                POSTGRES_PASSWORD: {{ postgres_pass }}
                POSTGRES_USER: {{ postgres_user }}
              ports:
                - "{{ postgres_ip }}:{{ postgres_port }}:5432"
              logging:
                driver: "loki"
                options:
                  loki-url: "{{ loki_url }}"
                  loki-batch-size: "{{ loki_batch_size }}"
                  loki-retries: "{{ loki_retries }}"
...

де loki_url: kube-loki.example.domain/loki/api/v1/push

Метрики

Збираються метрики з PostgreSQL за допомогою postgres_exporter для Прометей. Продовження вищезгаданого файлу Неможливо зошит.

postgres.yaml

...
            pexp:
              image: "wrouesnel/postgres_exporter"
              container_name: pexporter
              restart: unless-stopped
              environment:
                DATA_SOURCE_NAME: "postgresql://{{ postgres_user }}:{{ postgres_pass }}@p:5432/postgres?sslmode=disable"
              ports:
                - "{{ postgres_ip }}:{{ postgres_exporter_port }}:9187"
              logging:
                driver: "json-file"
                options:
                  max-size: "5m"
...

Для більшої наочності імен зовнішніх stateful-сервісів пропишемо через Endpoints.

postgres-service.yaml

apiVersion: v1
kind: Endpoints
metadata:
  name: postgres-exporter
subsets:
  - addresses:
      - ip: {{ .Values.service.postgres.ip }}
    ports:
      - port: {{ .Values.service.postgres.port }}
        protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: postgres-exporter
  labels:
    chart:  "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
spec:
  ports:
    - protocol: TCP
      port: {{ .Values.service.postgres.port }}
      targetPort: {{ .Values.service.postgres.port }}

Налаштування Prometheus для отримання даних postgres_exporter здійснюється правкою values ​​в subchart.

values.yaml

scrape_configs:
...
  - job_name: postgres-exporter
    static_configs:
      - targets: 
         - postgres-exporter.applicationnamespace.svc.cluster.local:9187
        labels:
          alias: postgres
...

Для візуалізації отриманих даних встановіть відповідний Dashboard у
Grafana та налаштуйте джерела даних. Це так само можна зробити через values ​​у subchart Grafana.

Як це виглядає
Моніторинг та логування зовнішніх сервісів у кластері Kubernetes

Сподіваюся, що ця коротка стаття допомогла вам зрозуміти основні ідеї, закладені в цьому рішенні, і збереже час при налаштуванні моніторингу та логування зовнішніх сервісів для Loki/Prometheus у кластері Kubernetes.

Джерело: habr.com

Додати коментар або відгук