Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์„œ๋น„์Šค ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น…

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์„œ๋น„์Šค ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น…

๋ชจ๋‘์—๊ฒŒ ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค.

ํƒ€์‚ฌ ์„œ๋น„์Šค์—์„œ ๋ฐฐํฌ๋œ ์‹œ์Šคํ…œ์œผ๋กœ ๋ฉ”ํŠธ๋ฆญ์„ ๋กœ๊น…ํ•˜๊ณ  ์ˆ˜์ง‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ผ๋ฐ˜ํ™”๋œ ๊ฐ€์ด๋“œ๋ฅผ ์˜จ๋ผ์ธ์—์„œ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. Kubernetes. ๋‚ด ์†”๋ฃจ์…˜์„ ๊ฒŒ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์—์„œ๋Š” ๊ท€ํ•˜๊ฐ€ ์ด๋ฏธ ์ž‘์—… ์ค‘์ธ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ ๋ฉ”ํ…Œ์šฐ์Šค ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์„œ๋น„์Šค. ์™ธ๋ถ€ Stateful ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค์˜ ์˜ˆ๋กœ๋Š” DBMS๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. PostgreSQL ์šฉ๊ธฐ์— ๋„์ปค. ํšŒ์‚ฌ์—์„œ๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ‚ค, ์•„๋ž˜ ํ…์ŠคํŠธ์— ์ด์— ๋Œ€ํ•œ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ๋œ ๋ชจ๋“  ์„œ๋น„์Šค์˜ ์ค‘์ฒฉ ์ฐจํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ์ž์ฒด ์ฐจํŠธ๋ฅผ ์ค€๋น„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒŒ์ฑ„ ๋ฐ˜์ถœ

๋งŽ์€ ๊ธฐ์—…์—์„œ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘, ํ™•์ธ ๋ฐ ์ค‘์•™ํ™”ํ•ฉ๋‹ˆ๋‹ค. ํƒ„์„ฑ ๊ฒ€์ƒ‰ + ๋กœ๊ทธ ๋Œ€์‰ฌ + ํ‚ค๋ฐ”๋‚˜, ์•ฝ์นญ ELK. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์ธ๋ฑ์‹ฑํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๋” ๊ฐ€๋ฒผ์šด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋กœํ‚ค. Helm ํŒจํ‚ค์ง€๋กœ ์ œ๊ณต๋˜๋ฉฐ ์‹œ์Šคํ…œ์— ๋งž๊ฒŒ ingress ๋ฐ pv ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ํ•˜์œ„ ์ฐจํŠธ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ’.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 ๋กœ๊น… ๋“œ๋ผ์ด๋ฒ„.

๋ชจ๋“  ๊ธฐ๊ธฐ์— ์ด ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„์ปค ๋กœ๊ทธ๋ฅผ ์ˆ˜์‹ ํ•˜๋ ค๋Š” ํ˜ธ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๋ฐ๋ชฌ์—๊ฒŒ ํŒจ๋”ฉ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. yaml์—์„œ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋„์ปค ์ž‘์„ฑ์˜ ์ผ๋ถ€์ธ ์ฑ…์ž„๊ฐ์žˆ๋Š” ํ”Œ๋ ˆ์ด๋ถ.

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

๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด 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 }}

postgres_exporter ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๋„๋ก Prometheus๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ž‘์—…์€ ํ•˜์œ„ ์ฐจํŠธ์˜ ๊ฐ’์„ ํŽธ์ง‘ํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๊ฐ’.yaml

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

์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋ ค๋ฉด ์ ์ ˆํ•œ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.
๊ทธ๋ผ ํŒŒ๋‚˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Grafana ํ•˜์œ„ ์ฐจํŠธ์˜ ๊ฐ’์„ ํ†ตํ•ด์„œ๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€
Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์„œ๋น„์Šค ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น…

์ด ์งง์€ ๊ธฐ์‚ฌ๊ฐ€ ์ด ์†”๋ฃจ์…˜์˜ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋ฅผ ์ดํ•ดํ•˜๊ณ  Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Loki/Prometheus์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์„œ๋น„์Šค์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น…์„ ์„ค์ •ํ•  ๋•Œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€