Overvågning og logning af eksterne tjenester i Kubernetes-klynger

Overvågning og logning af eksterne tjenester i Kubernetes-klynger

Goddag alle.

Jeg har ikke fundet en generel vejledning til logning og indsamling af målinger fra tredjepartstjenester til systemer, der er implementeret i Kubernetes. Jeg publicerer min løsning. Denne artikel forudsætter, at du allerede har et fungerende Prometheus og andre tjenester. Som eksempel på en datakilde fra en ekstern stateful-tjeneste vil vi bruge en database PostgreSQL i en container Docker. I virksomheden bruges en pakkehåndtering Helm, nedenfor vil der være eksempler på det. Til hele løsningen forbereder vi et eget chart, der inkluderer indlejrede charts for alle de anvendte tjenester.

Logføring

Mange virksomheder bruger en stak teknologier til at indsamle, se og centralisere logs, Elasticsearch + Logstash + kibana, kort sagt ELK. I vores tilfælde er der ikke behov for at indeksere indhold, så jeg anvendte en lettere Loki. Den er tilgængelig som en Helm-pakke, vi har tilføjet den som subchart ved at ændre værdierne for ingress og pv til vores system.

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"

For at sende logs til instansen Loki bruger vi Loki Docker Logging Driver.

Det er nødvendigt at installere denne tilføjelse på alle Docker værter, hvorfra du ønsker at modtage logs. Der er flere måder at angive for dæmonen, hvordan den skal bruge tilføjelsen. Jeg vælger driveren i yaml Docker Compose, som er en del af Ansible playbook.

postgres.yaml

    - name: Kør 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 }}"
...

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

Målinger

Målinger indsamles fra PostgreSQL ved hjælp af postgres_exporter for Prometheus. Fortsættelse af ovenstående fil 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"
...

For better visibility of external stateful services, we will define them through 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 }}

Configuring Prometheus to retrieve data from postgres_exporter is done by editing values in the subchart.

values.yaml

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

To visualize the obtained data, install the corresponding Dashboard from
Grafana and set up the data sources. This can also be done through values in the Grafana subchart.

How it looks
Overvågning og logning af eksterne tjenester i Kubernetes-klynger

I hope this brief article helped you understand the key concepts laid out in this solution and save time when configuring monitoring and logging for external services with Loki/Prometheus in a Kubernetes cluster.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster