Monitoraggio e registrazione dei servizi esterni nel cluster Kubernetes

Monitoraggio e registrazione dei servizi esterni nel cluster Kubernetes

Buongiorno a tutti.

Non ho trovato in rete una guida generale sulla registrazione e la raccolta di metriche dai servizi esterni nei sistemi distribuiti in Kubernetes. Pubblico la mia soluzione. Questo articolo presuppone che abbiate già un Prometheus e altri servizi. Come esempio di origine dei dati per un servizio stateful esterno utilizzeremo un DBMS PostgreSQL in un contenitore Docker. In azienda utilizziamo un gestore di pacchetti Helm, di seguito ci saranno esempi su di esso. Per tutta la soluzione prepariamo il nostro chart, comprendente chart nidificati di tutti i servizi utilizzati.

Registrazione

Molte aziende utilizzano un stack tecnologico per la raccolta e la visualizzazione e centralizzazione dei log Elasticsearch + Logstash + kibana, abbreviato in ELK. Nel nostro caso non c'è necessità di indicizzare il contenuto e ho applicato una soluzione più leggera Loki. È disponibile come pacchetto Helm, lo abbiamo aggiunto come subchart modificando values per ingress e pv per il nostro sistema.

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"

Per inviare i log all'istanza Loki usiamo Loki Docker Logging Driver.

È necessario installare questo plugin su tutti Docker i nodi da cui si desidera ricevere i log. Ci sono diversi modi per indicare al demone come utilizzare il plugin. Seleziono il driver nel file yaml Docker Compose, che fa parte del Ansible playbook.

postgres.yaml

    - name: Esegui contenitori
      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 }}"
...

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

Metriche

Le metriche vengono raccolte da PostgreSQL utilizzando postgres_exporter per Prometheus. Continuazione del file sopra menzionato 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"
...

Per una maggiore chiarezza dei nomi dei servizi stateful esterni, li definiremo tramite 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 }}

La configurazione di Prometheus per ottenere dati da postgres_exporter avviene modificando i valori nel subchart.

values.yaml

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

Per visualizzare i dati ottenuti, installa il Dashboard corrispondente in
Grafana e configura le fonti di dati. Questo può essere fatto anche tramite i valori nel subchart di Grafana.

Come appare
Monitoraggio e registrazione dei servizi esterni nel cluster Kubernetes

Spero che questo breve articolo ti abbia aiutato a comprendere le idee principali alla base di questa soluzione e ti farà risparmiare tempo nella configurazione del monitoraggio e della registrazione dei servizi esterni per Loki/Prometheus nel cluster Kubernetes.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS - ProHoster