Pagsubaybay at pag-log ng mga panlabas na serbisyo sa Kubernetes cluster

Pagsubaybay at pag-log ng mga panlabas na serbisyo sa Kubernetes cluster

Good luck sa lahat.

Wala akong nakitang pangkalahatang gabay sa Internet sa pag-log at pagkolekta ng mga sukatan mula sa mga serbisyo ng third-party sa mga system na naka-deploy sa Kubernetes. Nagpo-post ako ng aking solusyon. Ipinapalagay ng artikulong ito na mayroon ka nang trabaho Promiteyus at iba pang serbisyo. Bilang isang halimbawa ng isang data source para sa isang panlabas na stateful na serbisyo, isang DBMS ang gagamitin PostgreSQL sa isang lalagyan Manggagawa sa pantalan. Gumagamit ang kumpanya ng package manager timon, sa ibaba sa teksto ay magkakaroon ng mga halimbawa nito. Para sa buong solusyon, naghahanda kami ng sarili naming chart, na kinabibilangan ng mga nested chart ng lahat ng serbisyong ginamit.

Pagtotroso

Maraming mga kumpanya ang gumagamit ng isang stack ng mga teknolohiya upang mangolekta, tingnan at isentro ang mga log Elasticsearch + Logstash + kibana, dinaglat bilang ELK. Sa aming kaso, hindi na kailangang i-index ang nilalaman at gumamit ako ng mas magaan Loki. Ito ay magagamit bilang isang pakete ng Helm, idinagdag namin ito bilang isang subchart sa pamamagitan ng pagbabago ng mga halaga para sa pagpasok at pv upang umangkop sa aming system.

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"

Upang magpadala ng mga log sa isang instance Loki gamitin Driver ng Loki Docker Logging.

Dapat mong i-install ang add-on na ito sa lahat Manggagawa sa pantalan mga host kung saan mo gustong makatanggap ng mga log. Mayroong ilang mga paraan upang sabihin sa daemon kung paano gamitin ang padding. Pinipili ko ang driver sa yaml Docker Bumuo, na bahagi 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 }}"
...

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

Mga sukatan

Ang mga sukatan ay kinokolekta mula sa PostgreSQL gamit postgres_exporter para sa Promiteyus. Pagpapatuloy ng file sa itaas 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"
...

Para sa higit na kalinawan, isusulat namin ang mga pangalan ng panlabas na stateful na serbisyo gamit ang 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 }}

Ang pag-configure ng Prometheus upang makatanggap ng data ng postgres_exporter ay ginagawa sa pamamagitan ng pag-edit ng mga halaga sa subchart.

values.yaml

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

Upang mailarawan ang natanggap na data, i-install ang naaangkop na Dashboard sa
grafana at i-configure ang mga mapagkukunan ng data. Magagawa rin ito sa pamamagitan ng mga halaga sa subchart ng Grafana.

Ano ang hitsura nito
Pagsubaybay at pag-log ng mga panlabas na serbisyo sa Kubernetes cluster

Umaasa akong nakatulong sa iyo ang maikling artikulong ito na maunawaan ang mga pangunahing ideya sa likod ng solusyong ito at nakatipid ka ng oras kapag nagse-set up ng pagsubaybay at pag-log ng mga panlabas na serbisyo para sa Loki/Prometheus sa isang Kubernetes cluster.

Pinagmulan: www.habr.com

Magdagdag ng komento