Monitoraggio e registrazione dei servizi esterni nel cluster Kubernetes

Monitoraggio e registrazione dei servizi esterni nel cluster Kubernetes

Salve a tutti.

Non ho trovato online una guida generale su come eseguire il logging e raccogliere metriche da servizi esterni nei sistemi distribuiti in Kubernetes. Pubblico la mia soluzione. Questo articolo presume che abbiate già un Prometheus e altri servizi. Come esempio di fonte di dati, verrà utilizzato un database PostgreSQL in un container Docker. In azienda utilizziamo un gestore di pacchetti Helm, di seguito ci saranno esempi su di esso. Per l'intera soluzione stiamo preparando il nostro chart, che include chart annidati di tutti i servizi utilizzati.

Log

Molte aziende utilizzano una stack tecnologico per la raccolta, visualizzazione e centralizzazione dei log Elasticsearch + Logstash + kibana, abbreviato in ELK. Nel nostro caso non è necessario indicizzare il contenuto e ho applicato una soluzione più leggera Loki. È disponibile come pacchetto Helm, lo abbiamo aggiunto come subchart modificando i valori per l'ingress e il 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 utilizziamo Loki Docker Logging Driver.

È necessario installare questo complemento su tutti Docker i server da cui desideri ricevere i log. Ci sono diversi modi per specificare al demone come utilizzare il complemento. Eseguo la scelta del driver nel file yaml Docker Compose, che fa parte di Ansible playbook.

postgres.yaml

    - name: Esegui i container
      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

Metriche raccolte da PostgreSQL tramite 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 migliore chiarezza, specificheremo i nomi dei servizi esterni stateful 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 l'acquisizione dei 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 acquisiti, installa il Dashboard appropriato in
Grafana e configura le sorgenti dati. Questo può anche essere fatto 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 i concetti fondamentali alla base di questa soluzione e ti faccia 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, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster