Überwachen und Protokollieren externer Dienste im Kubernetes-Cluster

Überwachen und Protokollieren externer Dienste im Kubernetes-Cluster

Viel Glück an alle.

Ich habe online keine allgemeine Anleitung zum Protokollieren und Sammeln von Metriken von Drittanbieterdiensten in bereitgestellten Systemen gefunden Kubernetes. Ich poste meine Lösung. In diesem Artikel wird davon ausgegangen, dass Sie bereits über ein funktionierendes Konto verfügen Prometheus und andere Dienstleistungen. Als Beispiel für eine Datenquelle für einen externen Stateful-Dienst wird ein DBMS verwendet PostgreSQL in einem Behälter Docker. Das Unternehmen nutzt einen Paketmanager Helm, unten im Text finden Sie Beispiele dazu. Für die Gesamtlösung erstellen wir ein eigenes Diagramm, das verschachtelte Diagramme aller genutzten Dienste enthält.

Protokollierung

Viele Unternehmen nutzen eine Reihe von Technologien, um Protokolle zu sammeln, anzuzeigen und zu zentralisieren Elasticsearch + Logstasch + Kibana, abgekürzt als ELK. In unserem Fall besteht keine Notwendigkeit, den Inhalt zu indizieren, und ich habe eine einfachere Methode verwendet Loki. Es ist als Helm-Paket verfügbar. Wir haben es als Unterdiagramm hinzugefügt, indem wir die Werte für Ingress und PV an unser System angepasst haben.

werte.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"

Um Protokolle an eine Instanz zu senden Loki Verwendung Loki Docker-Protokollierungstreiber.

Sie müssen dieses Add-on auf allem installieren Docker Hosts, von denen Sie Protokolle empfangen möchten. Es gibt mehrere Möglichkeiten, dem Daemon mitzuteilen, wie er die Auffüllung verwenden soll. Ich wähle den Treiber in Yaml aus Docker komponieren, das Teil von ist Ansible Spielbuch.

postgres.yaml

    - name: Run containers
      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 }}"
...

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

Metriken

Metriken werden mithilfe von PostgreSQL erfasst postgres_exporter für Prometheus. Fortsetzung der obigen Datei Ansible Spielbuch.

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"
...

Zur besseren Übersicht schreiben wir die Namen externer zustandsbehafteter Dienste, die Endpunkte verwenden.

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 }}

Die Konfiguration von Prometheus für den Empfang von postgres_exporter-Daten erfolgt durch Bearbeiten der Werte im Unterdiagramm.

werte.yaml

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

Um die empfangenen Daten zu visualisieren, installieren Sie das entsprechende Dashboard
Grafana und Datenquellen konfigurieren. Dies kann auch über Werte im Grafana-Subchart erfolgen.

Wie es aussieht
Überwachen und Protokollieren externer Dienste im Kubernetes-Cluster

Ich hoffe, dieser kurze Artikel hat Ihnen geholfen, die Hauptideen hinter dieser Lösung zu verstehen und Ihnen Zeit beim Einrichten der Überwachung und Protokollierung externer Dienste für Loki/Prometheus in einem Kubernetes-Cluster zu sparen.

Source: habr.com

Kommentar hinzufügen