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

от автора

image

Доброго всем.
Я не нашел в сети обобщенного руководства по логированию и сбору метрик со сторонних сервисов в системы развернутые в Kubernetes. Публикую свое решение. Данная статья подразумевает, что у вас уже имеется рабочий Prometheus и другие службы. В качестве примера источника данных внешнего stateful-сервиса будет использоваться СУБД PostgreSQL в контейнере Docker. В компании используется пакетный менеджер Helm, ниже по тексту будут примеры на нем. Для всего решения мы готовим собственный чарт, включающий в себя вложенные чарты всех используемых сервисов.

Логирование

Многие компании для сбора и просмотра и централизации логов используется стэк технологий Elasticsearch + Logstash + kibana, сокращённо ELK. В нашем случае нет необходимости индексировать контент и я применил более легковесный Loki. Он доступен в виде пакета 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 используем Loki Docker Logging Driver
Необходимо установить это дополнение на все Docker хосты, с которых желаете получать логи. Есть несколько способов указать демону, как использовать дополнение. Я выбор драйвера произвожу в yaml Docker Compose, который является частью Ansible playbook.

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 для Prometheus. Продолжение вышеуказанного файла Ansible playbook.

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.

Как это выглядит

Надеюсь, что эта краткая статья помогла вам понять основные идеи, заложенные в данном решении, и сохранит время при настройке мониторинга и логирования внешних сервисов для Loki/Prometheus в кластере Kubernetes.

ссылка на оригинал статьи https://habr.com/ru/post/505968/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *