Surveillance et journalisation des services externes dans un cluster Kubernetes

Surveillance et journalisation des services externes dans un cluster Kubernetes

Bonjour à tous.

Je n'ai pas trouvé de guide général sur la journalisation et la collecte de métriques depuis des services tiers dans des systèmes déployés à Kubernetes. Je publie ma solution. Cet article suppose que vous disposez déjà d'un Prometheus et d'autres services. Comme exemple de source de données d'un service stateful externe, nous utiliserons une base de données PostgreSQL le conteneur Docker. Dans l'entreprise, nous utilisons un gestionnaire de paquets Helm, ci-dessous, nous donnerons des exemples avec celui-ci. Pour toute la solution, nous préparons notre propre chart, comprenant des charts imbriqués de tous les services utilisés.

Journalisation

De nombreuses entreprises utilisent une pile technologique pour la collecte, la visualisation et la centralisation des journaux Elasticsearch + Logstash + kibana, abrégé ELK. Dans notre cas, il n'est pas nécessaire d'indexer le contenu et j'ai appliqué une solution plus légère Loki. Il est disponible sous forme de package Helm, nous l'avons ajouté comme subchart, en modifiant les valeurs pour ingress et pv selon notre système.

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"

Pour envoyer des journaux vers l'instance Loki nous utilisons Loki Docker Logging Driver.

Il est nécessaire d'installer ce plugin sur tous les Docker hôtes à partir desquels vous souhaitez recevoir des journaux. Il existe plusieurs façons d'indiquer au démon comment utiliser le plugin. Je fais le choix du driver dans le yaml Docker Compose, qui fait partie de Ansible playbook.

postgres.yaml

    - name: Exécuter des conteneurs
      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 }}"
...

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

Métriques

Les métriques sont collectées à partir de PostgreSQL grâce à postgres_exporter pour Prometheus. Suite du fichier mentionné ci-dessus 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"
...

Pour une meilleure visualisation des noms des services stateful externes, nous les définirons via des 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 }}

La configuration de Prometheus pour obtenir les données de postgres_exporter se fait en modifiant les valeurs dans le sous-chart.

values.yaml

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

Pour visualiser les données obtenues, installez le Dashboard adéquat dans
Grafana et configurez les sources de données. Cela peut également être fait via les valeurs dans le sous-chart Grafana.

À quoi cela ressemble
Surveillance et journalisation des services externes dans un cluster Kubernetes

J'espère que cet article succinct vous a aidé à comprendre les concepts clés sous-jacents à cette solution et vous fera gagner du temps lors de la configuration de la surveillance et de la journalisation des services externes pour Loki/Prometheus dans le cluster Kubernetes.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster