
Доброго всем.
Я не нашел в сети обобщенного руководства по логированию и сбору метрик со сторонних сервисов в системы развернутые в Kubernetes. Публикую свое решение. Данная статья подразумевает, что у вас уже имеется рабочий Prometheus и другие службы. В качестве примера источника данных внешнего stateful-сервиса будет использоваться СУБД PostgreSQL в контейнере Docker. В компании используется пакетный менеджер Helm, ниже по тексту будут примеры на нем. Для всего решения мы готовим собственный чарт, включающий в себя вложенные чарты всех используемых сервисов.
Логирование
Многие компании для сбора и просмотра и централизации логов используется стэк технологий Elasticsearch + Logstash + kibana, сокращённо ELK. В нашем случае нет необходимости индексировать контент и я применил более легковесный Loki. Он доступен в виде пакета Helm, мы добавили его как subchart изменив values для ingress и pv под нашу систему.
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.
- 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.
... 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.
apiVersion: v1kind: Endpointsmetadata: name: postgres-exportersubsets: - addresses: - ip: {{ .Values.service.postgres.ip }} ports: - port: {{ .Values.service.postgres.port }} protocol: TCP---apiVersion: v1kind: Servicemetadata: 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.
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.