Русский
Русский
English
Статистика
Реклама

Мониторинг и логирование внешних сервисов в кластер 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: 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.

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.
Источник: habr.com
К списку статей
Опубликовано: 19.06.2020 18:10:12
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Devops

Kubernetes

Prometheus

Grafana

Loki

Мониторинг

Логирование

Категории

Последние комментарии

© 2006-2020, personeltest.ru