Monitoring en logging van externe services in een Kubernetes-cluster

Monitoring en logging van externe services in een Kubernetes-cluster

Een goede dag voor iedereen.

Ik kon online geen algemeen overzicht vinden van het loggen en het verzamelen van metrics van externe services in systemen die zijn uitgerold in Kubernetes. Ik publiceer mijn oplossing. Dit artikel gaat ervan uit dat je al een werkende Prometheus en andere diensten hebt. Als voorbeeld van een gegevensbron van een externe stateful-service zal een database gebruikt worden PostgreSQL de container Docker. In het bedrijf wordt de pakketbeheerder gebruikt Helm, hieronder staan voorbeelden ervan. Voor de hele oplossing bereiden we onze eigen chart voor, inclusief geneste charts van alle gebruikte diensten.

Logging

Veel bedrijven gebruiken voor het verzamelen, bekijken en centraliseren van logs een technologie-stack Elasticsearch + Logstash + kibana, in het kort ELK. In ons geval is er geen behoefte om de inhoud te indexeren en heb ik een lichtere versie toegepast, Loki. Het is beschikbaar als een Helm-pakket en we hebben het als subchart toegevoegd door de waarden voor ingress en pv aan te passen aan ons systeem.

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"

Om logs naar de instance te verzenden Loki gebruik van Loki Docker Logging Driver.

Moet deze plug-in op alle Docker hosts worden geĆÆnstalleerd waarvan je logs wilt ontvangen. Er zijn verschillende manieren om de daemon aan te geven hoe de plug-in gebruikt moet worden. Ik geef de keuze van de driver aan in yaml Docker Compose, dat onderdeel is van Ansible playbook.

postgres.yaml

    - name: Container draaien
      docker_compose:
        project_name: main-postgres
        definition:
          version: '3.7'
          services:
            p:
              image: "{{ postgres_version }}"
              container_name: postgresql
              restart: altijd
              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 }}"
...

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

Statistieken

Metrics worden verzameld van PostgreSQL met behulp van postgres_exporter voor Prometheus. Voortzetting van het bovenstaande bestand 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"
...

Voor een beter inzicht in de namen van externe stateful-services, zullen we ze via Endpoints definiƫren.

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

De configuratie van Prometheus voor het ophalen van gegevens van de postgres_exporter wordt gemaakt door de waarden in de subchart aan te passen.

values.yaml

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

Om de verkregen gegevens te visualiseren, installeert u het bijbehorende Dashboard in
Grafana en configureert u de gegevensbronnen. Dit kan ook gedaan worden via de waarden in de subchart Grafana.

Hoe het eruit ziet
Monitoring en logging van externe services in een Kubernetes-cluster

Ik hoop dat dit korte artikel u heeft geholpen de basisideeƫn achter deze oplossing te begrijpen en dat het tijd zal besparen bij het instellen van monitoring en logging van externe services voor Loki/Prometheus in een Kubernetes-cluster.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster