Überwachung und Protokollierung von externen Diensten im Kubernetes-Cluster

Überwachung und Protokollierung von externen Diensten im Kubernetes-Cluster

Guten Tag zusammen.

Ich habe im Internet keine allgemeine Anleitung zum Logging und zur Sammlung von Metriken von Drittanbieterdiensten in Systeme gefunden, die in Kubernetesbereitgestellt sind. Ich veröffentliche meine Lösung. Dieser Artikel setzt voraus, dass Sie bereits einen funktionierenden Prometheus und andere Dienste haben. Als Beispiel für die Datenquelle eines externen Stateful-Services verwenden wir die Datenbank PostgreSQL in einem Container Docker. Im Unternehmen wird der Paketmanager Helmverwendet. Im Folgenden finden Sie Beispiele dafür. Für die gesamte Lösung bereiten wir unser eigenes Chart vor, das verschachtelte Charts aller verwendeten Dienste umfasst.

Protokollierung

Viele Unternehmen verwenden zur Sammlung, Ansicht und Zentralisierung von Logs den Technologie-Stack Elasticsearch + Logstash + kibana, kurz ELK. In unserem Fall ist es nicht erforderlich, den Inhalt zu indexieren, und ich habe eine leichtere Lösung angewendet, Loki. Es ist als Helm-Paket verfügbar, wir haben es als Subchart hinzugefügt und die Werte für Ingress und PV an unser System angepasst.

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"

Um Logs an eine Instanz Loki verwenden wir Loki Docker Logging Driver.

zu senden, müssen Sie dieses Add-on auf allen Docker Hosts installieren, von denen Sie Logs erhalten möchten. Es gibt mehrere Möglichkeiten, dem Daemon anzugeben, wie das Add-on verwendet werden soll. Ich wähle den Treiber im YAML aus, Docker Compose, der Teil von Ansible Playbook ist.

postgres.yaml

    - name: Container ausführen
      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

Die Metriken werden mithilfe von postgres_exporter für Prometheusgesammelt. Fortsetzung der oben genannten Datei Ansible Playbook ist.

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

Um die Namen externer Stateful-Services anschaulicher zu machen, definieren wir sie über 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 }}

Die Konfiguration von Prometheus zur Erfassung von Daten vom postgres_exporter erfolgt durch Anpassungen der values im Subchart.

values.yaml

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

Zur Visualisierung der gesammelten Daten installieren Sie das entsprechende Dashboard in
Grafana und konfigurieren Sie die Datenquellen. Das kann auch über die values im Subchart Grafana erfolgen.

Wie es aussieht
Überwachung und Protokollierung von externen Diensten im Kubernetes-Cluster

Ich hoffe, dass dieser kurze Artikel Ihnen geholfen hat, die grundlegenden Ideen hinter dieser Lösung zu verstehen und Zeit bei der Einrichtung der Überwachung und Protokollierung externer Dienste für Loki/Prometheus im Kubernetes-Cluster zu sparen.

Quelle: habr.com

60GB SSD 8Gb DDR4