Monitorizarea și înregistrarea serviciilor externe în clusterul Kubernetes

Monitorizarea și înregistrarea serviciilor externe în clusterul Kubernetes

Bună ziua tuturor.

Nu am găsit un ghid general pe internet pentru logarea și colectarea metricilor din servicii externe în sisteme desfășurate în Kubernetes. Public acestă soluție. Acest articol presupune că aveți deja un Prometheus și alte servicii. Ca exemplu de sursă de date pentru un serviciu staționar extern, vom folosi o bază de date PostgreSQL în container Docker. Compania folosește un manager de pachete Helm, mai jos vor fi exemple pe acesta. Pentru întregul proiect pregătim un chart propriu, care include charts încrucișate pentru toate serviciile utilizate.

Logare

Multe companii folosesc o suită de tehnologii pentru colectarea, vizualizarea și centralizarea logurilor, cunoscută sub numele de Elasticsearch + Logstash + kibana, abreviat ELK. În cazul nostru, nu este necesar să indexăm conținutul și am aplicat o soluție mai ușoară. LokiAcesta este disponibil sub formă de pachet Helm, l-am adăugat ca subchart modificând valori pentru ingress și pv pentru sistemul nostru.

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"

Pentru a trimite loguri la instanța Loki folosim Loki Docker Logging Driver.

Este necesar să instalați acest add-on pe toate Docker hosturile de la care doriți să primiți loguri. Există mai multe moduri de a indica demonului cum să utilizeze add-on-ul. Eu aleg driverul în yaml Docker Compose, care este parte din Ansible playbook.

postgres.yaml

    - name: Rulează containere
      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 }}"
...

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

Metrici

Se colectează metricile din PostgreSQL folosind postgres_exporter pentru Prometheus. Continuarea fișierului menționat mai sus 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"
...

Pentru o mai bună claritate a numelui serviciilor externe stateful, le vom defini prin 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 }}

Configurarea Prometheus pentru a obține date de la postgres_exporter se face prin modificarea valorilor în subchart.

values.yaml

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

Pentru vizualizarea datelor obținute, instalați tablou corespunzător în
Grafana și configurați sursele de date. Acest lucru se poate face și prin valori în subchart Grafana.

Cum arată asta
Monitorizarea și înregistrarea serviciilor externe în clusterul Kubernetes

Sper că acest scurt articol v-a ajutat să înțelegeți conceptele de bază integrate în această soluție și va economisi timp în configurarea monitorizării și logării serviciilor externe pentru Loki/Prometheus în clusterul Kubernetes.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster