ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π½Π΅ΡˆΠ½ΠΈΡ… сСрвисов Π² кластСр Kubernetes

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π½Π΅ΡˆΠ½ΠΈΡ… сСрвисов Π² кластСр Kubernetes

Π”ΠΎΠ±Ρ€ΠΎΠ³ΠΎ всСм.

Π― Π½Π΅ нашСл Π² сСти ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ руководства ΠΏΠΎ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΈ сбору ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ со сторонних сСрвисов Π² систСмы Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹Π΅ Π² Kubernetes. ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΡŽ своС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Данная ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρƒ вас ΡƒΠΆΠ΅ имССтся Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ Prometheus ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ слуТбы. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° источника Π΄Π°Π½Π½Ρ‹Ρ… внСшнСго stateful-сСрвиса Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π‘Π£Π‘Π” PostgreSQL Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Docker. Π’ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Helm, Π½ΠΈΠΆΠ΅ ΠΏΠΎ тСксту Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π½Π° Π½Π΅ΠΌ. Для всСго Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²ΠΈΠΌ собствСнный Ρ‡Π°Ρ€Ρ‚, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ Π² сСбя Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ‡Π°Ρ€Ρ‚Ρ‹ всСх ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… сСрвисов.

Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

МногиС ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ для сбора ΠΈ просмотра ΠΈ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π»ΠΎΠ³ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ стэк Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ Elasticsearch + Logstash + kibana, сокращённо ELK. Π’ нашСм случаС Π½Π΅Ρ‚ нСобходимости ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΈ я ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ» Π±ΠΎΠ»Π΅Π΅ лСгковСсный Loki. Он доступСн Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Helm, ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΠΊΠ°ΠΊ subchart ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² values для ingress ΠΈ pv ΠΏΠΎΠ΄ Π½Π°ΡˆΡƒ систСму.

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"

Для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π»ΠΎΠ³ΠΎΠ² Π½Π° инстанс Loki ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Loki Docker Logging Driver.

НСобходимо ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ это Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° всС Docker хосты, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΆΠ΅Π»Π°Π΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ. Π•ΡΡ‚ΡŒ нСсколько способов ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄Π΅ΠΌΠΎΠ½Ρƒ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Π― Π²Ρ‹Π±ΠΎΡ€ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠΆΡƒ Π² yaml Docker Compose, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ Ansible playbook.

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

Π³Π΄Π΅ loki_url: kube-loki.example.domain/loki/api/v1/push

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ

Π‘ΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ с PostgreSQL с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ postgres_exporter для Prometheus. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° 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"
...

Для большСй наглядности ΠΈΠΌΠ΅Π½ Π²Π½Π΅ΡˆΠ½ΠΈΡ… stateful-сСрвисов ΠΏΡ€ΠΎΠΏΠΈΡˆΠ΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· 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 }}

Настройка Prometheus для получСния Π΄Π°Π½Π½Ρ‹Ρ… postgres_exporter производится ΠΏΡ€Π°Π²ΠΊΠΎΠΉ values Π² subchart.

values.yaml

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

Для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… установитС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Dashboard Π²
Grafana ΠΈ настройтС источники Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· values Π² subchart Grafana.

Как это выглядит
ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π½Π΅ΡˆΠ½ΠΈΡ… сСрвисов Π² кластСр Kubernetes

НадСюсь, Ρ‡Ρ‚ΠΎ эта краткая ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠΌΠΎΠ³Π»Π° Π²Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ основныС ΠΈΠ΄Π΅ΠΈ, Π·Π°Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ, ΠΈ сохранит врСмя ΠΏΡ€ΠΈ настройкС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΈ логирования Π²Π½Π΅ΡˆΠ½ΠΈΡ… сСрвисов для Loki/Prometheus Π² кластСрС Kubernetes.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ