แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™ แž“แžทแž„แž€แžแŸ‹แžแŸ’แžšแžถแžŸแŸแžœแžถแž€แž˜แŸ’แž˜แžแžถแž„แž€แŸ’แžšแŸ…แž‘แŸ…แž€แžถแž“แŸ‹แž…แž„แŸ’แž€แŸ„แž˜ Kubernetes

แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™ แž“แžทแž„แž€แžแŸ‹แžแŸ’แžšแžถแžŸแŸแžœแžถแž€แž˜แŸ’แž˜แžแžถแž„แž€แŸ’แžšแŸ…แž‘แŸ…แž€แžถแž“แŸ‹แž…แž„แŸ’แž€แŸ„แž˜ Kubernetes

แžŸแžผแž˜แžŸแŸ†แžŽแžถแž„แž›แŸ’แžขแž‘แžถแŸ†แž„แžขแžŸแŸ‹แž‚แŸ’แž“แžถแŸ”

แžแŸ’แž‰แžปแŸ†โ€‹แž˜แžทแž“โ€‹แž”แžถแž“โ€‹แžšแž€โ€‹แžƒแžพแž‰โ€‹แž˜แž‚แŸ’แž‚แžปแž‘แŸ’แž‘แŸแžŸแž€แŸโ€‹แž‘แžผแž‘แŸ…โ€‹แž›แžพโ€‹แžขแŸŠแžธแž“แž’แžบแžŽแžทแžโ€‹แž›แžพโ€‹แž€แžถแžšโ€‹แž…แžผแž›โ€‹แž“แžทแž„โ€‹แž”แŸ’แžšแž˜แžผแž›โ€‹แž˜แŸ‰แŸ‚แžแŸ’แžšโ€‹แž–แžธโ€‹แžŸแŸแžœแžถโ€‹แž—แžถแž‚แžธโ€‹แž‘แžธโ€‹แž”แžธโ€‹แž‘แŸ…โ€‹แž€แŸ’แž“แžปแž„โ€‹แž”แŸ’แžšแž–แŸแž“แŸ’แž’โ€‹แžŠแŸ‚แž›โ€‹แž”แžถแž“โ€‹แžŠแžถแž€แŸ‹โ€‹แžฑแŸ’แž™โ€‹แž”แŸ’แžšแžพโ€‹แž€แŸ’แž“แžปแž„ Kubernetes. แžแŸ’แž‰แžปแŸ†แž€แŸ†แž–แžปแž„แž”แž„แŸ’แž แŸ„แŸ‡แžŠแŸ†แžŽแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ†แŸ” แžขแžแŸ’แžแž”แž‘แž“แŸแŸ‡แžŸแž“แŸ’แž˜แžแŸ‹แžแžถแžขแŸ’แž“แž€แž˜แžถแž“แž€แžถแžšแž„แžถแžšแžšแžฝแž…แž แžพแž™ Prometheus แž“แžทแž„แžŸแŸแžœแžถแž€แž˜แŸ’แž˜แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแŸ” แž‡แžถแžงแž‘แžถแž แžšแžŽแŸแž“แŸƒแž”แŸ’แžšแž—แž–แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŸแŸแžœแžถแž€แž˜แŸ’แž˜แžšแžŠแŸ’แž‹แžแžถแž„แž€แŸ’แžšแŸ… DBMS แž“แžนแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพ PostgreSQL แž“แŸ…แž€แŸ’แž“แžปแž„แž’แžปแž„แž˜แžฝแž™แŸ” Dockers. แž€แŸ’แžšแžปแž˜แž แŸŠแžปแž“แž”แŸ’แžšแžพแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž€แž‰แŸ’แž…แž”แŸ‹ แž€แžถแž“แŸ‹แžแŸ†แžŽแŸ‚แž„แžแžถแž„แž€แŸ’แžšแŸ„แž˜แž“แŸ…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘แž“แžนแž„แž˜แžถแž“แžงแž‘แžถแž แžšแžŽแŸแž“แŸ…แž›แžพแžœแžถแŸ” แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŠแŸ†แžŽแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž‘แžถแŸ†แž„แž˜แžผแž› แž™แžพแž„แž€แŸ†แž–แžปแž„แžšแŸ€แž”แž…แŸ†แž‚แŸ†แž“แžผแžŸแžแžถแž„แž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“แžšแž”แžŸแŸ‹แž™แžพแž„ แžŠแŸ‚แž›แžšแžถแž”แŸ‹แž”แž‰แŸ’แž…แžผแž›แž‘แžถแŸ†แž„แž‚แŸ†แž“แžผแžŸแžแžถแž„แžŠแŸ‚แž›แž‡แžถแž”แŸ‹แž–แžถแž€แŸ‹แž–แŸแž“แŸ’แž’แž“แŸƒแžŸแŸแžœแžถแž€แž˜แŸ’แž˜แž‘แžถแŸ†แž„แžขแžŸแŸ‹แžŠแŸ‚แž›แž”แžถแž“แž”แŸ’แžšแžพแŸ”

แž€แžถแžšแž€แžถแž”แŸ‹แžˆแžพ

แž€แŸ’แžšแžปแž˜แž แŸŠแžปแž“แž‡แžถแž…แŸ’แžšแžพแž“แž”แŸ’แžšแžพแž”แž…แŸ’แž…แŸแž€แžœแžทแž‡แŸ’แž‡แžถแž”แžŽแŸ’แžแžปแŸ†แžŠแžพแž˜แŸ’แž”แžธแž”แŸ’แžšแž˜แžผแž› แž˜แžพแž› แž“แžทแž„แž€แžŽแŸ’แžแžถแž›แž€แŸ†แžŽแžแŸ‹แž แŸแžแžป Elasticsearch + แžƒแŸ’แž›แžถแŸ†แž„แžŸแž˜แŸ’แž„แžถแžแŸ‹ + แž‚แžธแž”แŸŠแžธแžŽแžถแžขแž€แŸ’แžŸแžšแž€แžถแžแŸ‹แž‡แžถ ELK แŸ” แž€แŸ’แž“แžปแž„แž€แžšแžŽแžธแžšแž”แžŸแŸ‹แž™แžพแž„ แž˜แžทแž“แž…แžถแŸ†แž”แžถแž…แŸ‹แž’แŸ’แžœแžพแž›แžทแž”แžทแž€แŸ’แžšแž˜แžแŸ’แž›แžนแž˜แžŸแžถแžšแž‘แŸ แž แžพแž™แžแŸ’แž‰แžปแŸ†แž”แžถแž“แž”แŸ’แžšแžพแžŸแŸ’แžšแžถแž›แž‡แžถแž„แž˜แžปแž“ แžกแžผแž€แžผ. แžœแžถแžขแžถแž…แž”แŸ’แžšแžพแž”แžถแž“แž‡แžถแž€แž‰แŸ’แž…แž”แŸ‹ Helm แž™แžพแž„แž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜แžœแžถแž‡แžถแž‚แŸ†แž“แžผแžŸแžแžถแž„แžšแž„แžŠแŸ„แž™แž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแžแž˜แŸ’แž›แŸƒแžŸแž˜แŸ’แžšแžถแž”แŸ‹ 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.

แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแžแŸ‚แžŠแŸ†แžกแžพแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž”แž“แŸ’แžแŸ‚แž˜แž“แŸแŸ‡แž“แŸ…แž›แžพแžขแŸ’แžœแžธแž‚แŸ’แžšแž”แŸ‹แž™แŸ‰แžถแž„ Dockers แž˜แŸ‰แžถแžŸแŸŠแžธแž“แžŠแŸ‚แž›แžขแŸ’แž“แž€แž…แž„แŸ‹แž‘แž‘แžฝแž›แž€แŸ†แžŽแžแŸ‹แž แŸแžแžปแŸ” แž˜แžถแž“แžœแžทแž’แžธแž‡แžถแž…แŸ’แžšแžพแž“แžŠแžพแž˜แŸ’แž”แžธแž”แŸ’แžšแžถแž”แŸ‹แžŠแŸแž˜แžทแž“แžขแŸ†แž–แžธแžšแž”แŸ€แž”แž”แŸ’แžšแžพแž‘แŸ’แžšแž“แžถแž”แŸ‹แŸ” แžแŸ’แž‰แžปแŸ†แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแžขแŸ’แž“แž€แž”แžพแž€แž”แžšแž“แŸ…แž€แŸ’แž“แžปแž„ yaml แžŸแžšแžŸแŸแžš 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_แžขแŸ’แž“แž€แž“แžถแŸ†แž…แŸแž‰ แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Prometheus. แž€แžถแžšแž”แž“แŸ’แžแž“แŸƒแžฏแž€แžŸแžถแžšแžแžถแž„แž›แžพ 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"
...

แžŠแžพแž˜แŸ’แž”แžธแžฑแŸ’แž™แž€แžถแž“แŸ‹แžแŸ‚แž…แŸ’แž”แžถแžŸแŸ‹ แž™แžพแž„แž“แžนแž„แžŸแžšแžŸแŸแžšแžˆแŸ’แž˜แŸ„แŸ‡แžŸแŸแžœแžถแž€แž˜แŸ’แž˜แžšแžŠแŸ’แž‹แžแžถแž„แž€แŸ’แžšแŸ…แžŠแŸ„แž™แž”แŸ’แžšแžพ 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.yaml

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

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹