Övervakning och loggning av externa tjänster i Kubernetes-kluster

Övervakning och loggning av externa tjänster i Kubernetes-kluster

God dag allihopa.

Jag har inte kunnat hitta en generell guide för loggning och insamling av metrik från externa tjänster i system som är deployerade i Kubernetes. Jag publicerar min lösning. Denna artikel förutsätter att du redan har en fungerande Prometheus och andra tjänster. Som exempel på en datakälla från en extern stateful-tjänst kommer en databas att användas PostgreSQL i en container Docker. Företaget använder en paketchef Helm, nedan kommer det att finnas exempel på denna. För hela lösningen förbereder vi en egen chart som inkluderar inbäddade charts för alla använda tjänster.

Loggning

Många företag använder en teknikstack för insamling och centralisering av loggar Elasticsearch + Logstash + kibana, förkortat ELK. I vårt fall finns det inget behov av att indexera innehållet, och jag använde en lättare Loki. Den är tillgänglig som en Helm-paket, vi har lagt till den som en subchart och ändrat värden för ingress och pv för vårt 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"

För att skicka loggar till instansen Loki VPS KVM. Loki Docker Logging Driver.

Måste detta tillägg installeras på alla Docker värdar där du vill ta emot loggar. Det finns flera sätt att ange för demon hur man använder tillägget. Jag väljer drivrutinen i yaml Docker Compose, som är en del av Ansible playbooken.

postgres.yaml

    - name: Kör containrar
      docker_compose:
        project_name: main-postgres
        definition:
          version: '3.7'
          services:
            p:
              image: "{{ postgres_version }}"
              container_name: postgresql
              restart: alltid
              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 }}"
...

där loki_url: kube-loki.example.domain/loki/api/v1/push

Mätvärden

Metrik samlas in från PostgreSQL med hjälp av postgres_exporter för Prometheus. Fortsättning av ovanstående fil Ansible playbooken.

postgres.yaml

...
            pexp:
              image: "wrouesnel/postgres_exporter"
              container_name: pexporter
              restart: om-inte-stoppad
              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"
...

För att göra namnen på externa stateful-tjänster mer tydliga skriver vi dem via 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 }}

Konfiguration av Prometheus för att hämta data från postgres_exporter görs genom att redigera values i subchart.

values.yaml

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

För att visualisera de erhållna data, installera den lämpliga Dashboarden i
Grafana och konfigurera datakällorna. Detta kan också göras via values i subchart Grafana.

Hur det ser ut
Övervakning och loggning av externa tjänster i Kubernetes-kluster

Jag hoppas att den här korta artikeln har hjälpt dig att förstå de grundläggande idéerna bakom denna lösning och sparar tid när du konfigurerar övervakning och loggning av externa tjänster för Loki/Prometheus i Kubernetes-klustret.

Källa: habr.com

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster