ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืื•ืŸ ืœืึธื’ื™ื ื’ ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ื‘ืึทื“ื™ื ื•ื ื’ืก ืฆื• ื“ื™ Kubernetes ืงื ื•ื™ืœ

ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืื•ืŸ ืœืึธื’ื™ื ื’ ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ื‘ืึทื“ื™ื ื•ื ื’ืก ืฆื• ื“ื™ Kubernetes ืงื ื•ื™ืœ

ื’ื•ื˜ ื’ืœื™ืง ืฆื• ืึทืœืขืžืขืŸ.

ืื™ืš ื”ืื‘ ื ื™ืฉื˜ ื’ืขืคึฟื•ื ืขืŸ ืึท ื’ืขื ืขืจืึทืœื™ื–ืขื“ ืคื™ืจืขืจ ืึธื ืœื™ื™ืŸ ืคึฟืึทืจ ืœืึธื’ื™ื ื’ ืื•ืŸ ืงืึทืœืขืงื˜ื™ื ื’ ืžืขื˜ืจื™ืงืก ืคื•ืŸ ื“ืจื™ื˜-ืคึผืึทืจื˜ื™ื™ ื‘ืึทื“ื™ื ื•ื ื’ืก ืื™ืŸ ืกื™ืกื˜ืขืžืขืŸ ื“ื™ืคึผืœื•ื™ื“ ืื™ืŸ Kubernetes. ืื™ืš ื‘ื™ืŸ ืคึผืึธืกื˜ื™ื ื’ ืžื™ื™ืŸ ืœื™ื™ื–ื•ื ื’. ื“ืขืจ ืึทืจื˜ื™ืงืœ ืึทืกื•ืžื– ืึทื– ืื™ืจ ืฉื•ื™ืŸ ื”ืึธื‘ืŸ ืึท ืึทืจื‘ืขื˜ ืคึผืจืึธืžืขื˜ื”ืขื•ืก ืื•ืŸ ืื ื“ืขืจืข ืกืขืจื•ื•ื™ืกืขืก. ื•ื•ื™ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืึท ื“ืึทื˜ืŸ ืžืงื•ืจ ืคึฟืึทืจ ืึท ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ืกื˜ื™ื™ื˜ืคื•ืœ ื“ื™ื ืกื˜, ืึท DBMS ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืคึผืึธืกื˜ื’ืจืขืกืงืœ ืื™ืŸ ืึท ืงืึทื ื˜ื™ื™ื ืขืจ ื“ืึธืงืงืขืจ. ื“ื™ ืคื™ืจืžืข ื ื™ืฆื˜ ืึท ืคึผืขืงืœ ืคืึทืจื•ื•ืึทืœื˜ืขืจ ืจื•ื“ืขืจ, ืื•ื ื˜ืŸ ืื™ืŸ ื“ืขื ื˜ืขืงืกื˜ ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื‘ื™ื™ืฉืคื™ืœืŸ ืื•ื™ืฃ ืขืก. ืคึฟืึทืจ ื“ื™ ื’ืื ืฆืข ืœื™ื™ื–ื•ื ื’, ืžื™ืจ ื–ืขื ืขืŸ ืคึผืจื™ืคึผืขืจื™ื ื’ ืื•ื ื“ื–ืขืจ ืื™ื™ื’ืขื ืข ื˜ืฉืึทืจื˜, ื•ื•ืึธืก ื›ื•ืœืœ ื ืขืกื˜ืขื“ ื˜ืฉืึทืจืฅ ืคื•ืŸ ืึทืœืข ื“ื™ ืกืขืจื•ื•ื™ืกืขืก ื’ืขื ื™ืฆื˜.

ืœืึธื’ื™ื ื’

ืคื™ืœืข ืงืึธืžืคึผืึทื ื™ืขืก ื ื•ืฆืŸ ืึท ืึธื ืœื™ื™ื’ืŸ ืคื•ืŸ ื˜ืขืงื ืึทืœืึทื“ื–ืฉื™ื– ืฆื• ื–ืึทืžืœืขืŸ, ืงื•ืง ืื•ืŸ ืกืขื ื˜ืจืึทืœื™ื™ื– ืœืึธื’ืก ืขืœืึทืกื˜ื™ืงืกืึทืจื˜ืฉ + ืœืึธื’ืกื˜ืึทืฉ + kibana, ืึทื‘ืจื™ื•ื•ื™ื™ื™ื˜ื™ื“ ื•ื•ื™ ELK. ืื™ืŸ ืื•ื ื“ื–ืขืจ ืคืึทืœ, ืขืก ืื™ื– ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ืื™ื ื“ืขืงืก ื“ื™ ืื™ื ื”ืึทืœื˜ ืื•ืŸ ืื™ืš ื’ืขื•ื•ื™ื™ื ื˜ ืึท ืžืขืจ ืœื™ื™ื˜ื•ื•ื™ื™ื˜ ืœืึธืงื™. ืขืก ืื™ื– ื‘ืืจืขื›ื˜ื™ื’ื˜ ื•ื•ื™ ืึท ื”ืขืœื ืคึผืขืงืœ, ืžื™ืจ ืฆื•ื’ืขื’ืขื‘ืŸ ืขืก ื•ื•ื™ ืึท ืกื•ื‘ื˜ืฉืึทืจื˜ ื“ื•ืจืš ื˜ืฉืึทื ื’ื™ื ื’ ื“ื™ ื•ื•ืึทืœื•ืขืก ืคึฟืึทืจ ื™ื ื’ืจืขืกืก ืื•ืŸ ืคึผื•ื• ืฆื• ืคึผืึทืกืŸ ืื•ื ื“ื–ืขืจ ืกื™ืกื˜ืขื.

ื•ื•ืึทืœื•ืขืก.ื™ืึทืžืœ

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 ืœืึธื’ื™ื ื’ ื“ืจื™ื™ื•ื•ืขืจ.

ืื™ืจ ืžื•ื–ืŸ ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ืขื ืึทื“ื™ืฉืึทืŸ ืื•ื™ืฃ ืึทืœืฅ ื“ืึธืงืงืขืจ ืžื—ื ื•ืช ืคื•ืŸ ื•ื•ืึธืก ืื™ืจ ื•ื•ื™ืœืŸ ืฆื• ื‘ืึทืงื•ืžืขืŸ ืœืึธื’ืก. ืขืก ื–ืขื ืขืŸ ืขื˜ืœืขื›ืข ื•ื•ืขื’ืŸ ืฆื• ื–ืึธื’ืŸ ื“ื™ ื“ื™ื™ืžืึทืŸ ื•ื•ื™ ืฆื• ื ื•ืฆืŸ ื“ื™ ื•ื•ืึทื˜ืŸ. ืื™ืš ืกืขืœืขืงื˜ื™ืจืŸ ื“ืขื ืฉืึธืคืขืจ ืื™ืŸ ื™ืึทืžืœ ื“ืึธืงื˜ืขืจ ืงืึทืžืคึผืึธื•ื–, ื•ื•ืึธืก ืื™ื– ื˜ื™ื™ืœ Ansible ืคึผืœื™ื™ึทื‘ืึธืึธืง.

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 ืคืึทืจ ืคึผืจืึธืžืขื˜ื”ืขื•ืก. ืงืึทื ื˜ื™ื ื™ื•ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืื•ื™ื‘ืŸ ื˜ืขืงืข Ansible ืคึผืœื™ื™ึทื‘ืึธืึธืง.

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

ืคึฟืึทืจ ืžืขืจ ืงืœืขืจื™ื˜ื™, ืžื™ืจ ื•ื•ืขืœืŸ ืฉืจื™ื™ึทื‘ืŸ ื“ื™ ื ืขืžืขืŸ ืคื•ืŸ ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ืกื˜ื™ื™ื˜ืคื•ืœ ื‘ืึทื“ื™ื ื•ื ื’ืก ื ื™ืฆืŸ ืขื ื“ืคึผืึธื™ื ืฅ.

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

ืงืึทื ืคื™ื’ื™ืขืจ ืคึผืจืึธืžืขื˜ื”ืขื•ืก ืฆื• ื‘ืึทืงื•ืžืขืŸ ืคึผืึธืกื˜ื’ืจืขืก_ืขืงืกืคึผืึธืจื˜ืขืจ ื“ืึทื˜ืŸ ืื™ื– ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ื“ื•ืจืš ืขื“ื™ื˜ื™ื ื’ ื•ื•ืึทืœื•ืขืก ืื™ืŸ ื“ื™ ืกื•ื‘ื˜ืฉืึทืจื˜.

ื•ื•ืึทืœื•ืขืก.ื™ืึทืžืœ

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

ืฆื• ื•ื•ื™ื–ืฉื•ื•ืึทืœื™ื™ื– ื“ื™ ื‘ืืงื•ืžืขืŸ ื“ืึทื˜ืŸ, ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื™ ืฆื•ื ืขืžืขืŸ ื“ืึทืฉื‘ืึธืจื“ ืื™ืŸ
ื’ืจืืคืื ื ืื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจ ื“ืึทื˜ืŸ ืงื•ื•ืืœืŸ. ื“ืึธืก ืงืขืŸ ืื•ื™ืš ื–ื™ื™ืŸ ื’ืขื˜ืืŸ ื“ื•ืจืš ื•ื•ืึทืœื•ืขืก ืื™ืŸ ื“ื™ Grafana ืกื•ื‘ื˜ืฉืึทืจื˜.

ื•ื•ืึธืก ืขืก ืงื•ืงื˜ ื•ื•ื™
ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืื•ืŸ ืœืึธื’ื™ื ื’ ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ื‘ืึทื“ื™ื ื•ื ื’ืก ืฆื• ื“ื™ Kubernetes ืงื ื•ื™ืœ

ืื™ืš ื”ืึธืคึฟืŸ ื“ืขื ืงื•ืจืฅ ืึทืจื˜ื™ืงืœ ื’ืขื”ืึธืœืคึฟืŸ ืื™ืจ ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื“ื™ ื”ื•ื™ืคึผื˜ ื’ืขื“ืื ืงืขืŸ ื”ื™ื ื˜ืขืจ ื“ืขื ืœื™ื™ื–ื•ื ื’ ืื•ืŸ ื’ืขืจืื˜ืขื•ื•ืขื˜ ืื™ืจ ืฆื™ื™ื˜ ื•ื•ืขืŸ ืื™ืจ ืฉื˜ืขืœืŸ ืึทืจื•ื™ืฃ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืื•ืŸ ืœืึธื’ื™ื ื’ ืคื•ืŸ ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ื‘ืึทื“ื™ื ื•ื ื’ืก ืคึฟืึทืจ Loki / Prometheus ืื™ืŸ ืึท Kubernetes ืงื ื•ื™ืœ.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’