Маніторынг і лагіраванне знешніх сэрвісаў у кластар Kubernetes

Маніторынг і лагіраванне знешніх сэрвісаў у кластар Kubernetes

Добрага ўсім.

Я не знайшоў у сетцы абагульненага кіраўніцтва па лагаванні і зборы метрык са іншых сэрвісаў у сістэмы разгорнутыя ў Kubernetes. Публікую сваё рашэнне. Дадзены артыкул мае на ўвазе, што ў вас ужо маецца працоўны Праметэй і іншыя службы. У якасці прыкладу крыніцы дадзеных вонкавага stateful-сэрвісу будзе выкарыстоўвацца СКБД PostgreSQL у кантэйнеры Докер. У кампаніі выкарыстоўваецца пакетны менеджэр шлем, ніжэй па тэксце будуць прыклады на ім. Для ўсяго рашэння мы рыхтуем уласны чарт, які ўключае ў сябе ўкладзеныя чарты ўсіх выкарыстоўваных сэрвісаў.

Лагіраванне

Многія кампаніі для збору і прагляду і цэнтралізацыі логаў выкарыстоўваецца стэк тэхналогій Elasticsearch + Logstash + кібана, скарочана ELK. У нашым выпадку няма неабходнасці індэксаваць кантэнт і я ўжыў больш легкаважны Локі. Ён даступны ў выглядзе пакета 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 Docker Logging Driver.

Неабходна ўсталяваць гэты дадатак на ўсё Докер хасты, з якіх жадаеце атрымліваць логі. Ёсць некалькі спосабаў паказаць дэману, як выкарыстоўваць дадатак. Я выбар драйвера раблю ў yaml Docker Compose, які з'яўляецца часткай анзибль кніга гульняў.

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 для Праметэй. Працяг вышэйпаказанага файла анзибль кніга гульняў.

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 у
Графана і наладзьце крыніцы дадзеных. Гэта так жа можна зрабіць праз values ​​у subchart Grafana.

Як гэта выглядае
Маніторынг і лагіраванне знешніх сэрвісаў у кластар Kubernetes

Спадзяюся, што гэты кароткі артыкул дапамог вам зразумець асноўныя ідэі, закладзеныя ў дадзеным рашэнні, і захавае час пры наладзе маніторынгу і лагаванні вонкавых сэрвісаў для Loki/Prometheus у кластары Kubernetes.

Крыніца: habr.com

Дадаць каментар