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

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

Добър ден на всички.

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

Логиране

Много компании използват технологичен стек Elasticsearch + Logstash + kibana, съкратено ELK, за събиране, преглед и централизация на логовете. В нашия случай няма нужда да се индексира съдържание и приложих по-лека Loki. Тя е налична под формата на Helm пакет, добавихме я като subchart, променяйки стойностите за 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 VPS KVM 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 услуги, ще ги опишем чрез точки за достъп.

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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster