Openshift ๋‚ด์—์„œ postgres ๋ชจ๋‹ˆํ„ฐ๋ง

์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”, Habr ์ฃผ๋ฏผ๋“ค!

์˜ค๋Š˜ ์ €๋Š” OpenShift ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ postgres์™€ ๊ธฐํƒ€ ๋ช‡ ๊ฐ€์ง€ ์—”ํ„ฐํ‹ฐ๋ฅผ ์‹ค์ œ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ๋ฐฉ๋ฒ•๊ณผ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ง์”€๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ž…๊ตฌ์—๋Š” ๋‹ค์Œ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์˜คํ”ˆ ์‹œํ”„ํŠธ
  • ํ‚ค
  • ํ”„๋กœ ๋ฉ”ํ…Œ์šฐ์Šค


Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ํˆฌ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ •ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1) build.gradle์— ์ถ”๊ฐ€

 implementation "io.micrometer:micrometer-registry-prometheus"

2) ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค ์‹คํ–‰

 - job_name: 'job-name'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 5s
    kubernetes_sd_configs:
    - role: pod
      namespaces:
        names: 
          - 'name'

3) Grafana์— ๋””์Šคํ”Œ๋ ˆ์ด ์ถ”๊ฐ€

์šฐ๋ฆฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ทผ์ฒ˜์— ์žˆ๋Š” ๊ธฐ์ง€๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์ˆœ๊ฐ„์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ํ‰๋ฒ”ํ–ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ, ์ด๊ฒƒ์€ ๋‚˜์˜๊ณ  ์•„๋ฌด๋„ ์ด๊ฒƒ์„ ํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ์ผ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค).

์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

postgres ๋ฐ prometheus ์ž์ฒด๊ฐ€ ํฌํ•จ๋œ ํฌ๋“œ ์™ธ์—๋„ ๋‚ด๋ณด๋‚ด๊ธฐ๋ผ๋Š” ์—”ํ„ฐํ‹ฐ๊ฐ€ ํ•˜๋‚˜ ๋” ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ƒ์  ๊ฐœ๋…์˜ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์„œ๋ฒ„์—์„œ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•˜๋Š” ์—์ด์ „ํŠธ์ž…๋‹ˆ๋‹ค. Postgres ๋‚ด๋ณด๋‚ด๊ธฐ์˜ ๊ฒฝ์šฐ Go๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด๋ถ€์—์„œ SQL ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์›๋ฆฌ์— ๋”ฐ๋ผ ์ž‘๋™ํ•œ ๋‹ค์Œ prometheus๊ฐ€ ์–ป์€ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฅผ ํ†ตํ•ด ์ž์‹ ๋งŒ์˜ ์ธก์ •ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ง‘๋œ ์ธก์ •ํ•ญ๋ชฉ์„ ํ™•์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฐํฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(์˜ˆ:deployment.yaml, ๋น„๋ฐ”์ธ๋”ฉ).


---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: postgres-exporter
  labels:
    app: {{ .Values.name }}
    monitoring: prometheus
spec:
  serviceName: {{ .Values.name }}
  replicas: 1
  revisionHistoryLimit: 5
  template:
    metadata:
      labels:
        app: postgres-exporter
        monitoring: prometheus
    spec:
      containers:
      - env:
        - name: DATA_SOURCE_URI
          value: postgresdb:5432/pstgr?sslmode=disable
        - name: DATA_SOURCE_USER
          value: postgres
        - name: DATA_SOURCE_PASS
          value: postgres
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
          requests:
            cpu: 100m
            memory: 50Mi
        livenessProbe:
          tcpSocket:
            port: metrics
          initialDelaySeconds: 30
          periodSeconds: 30
        readinessProbe:
          tcpSocket:
            port: metrics
          initialDelaySeconds: 10
          periodSeconds: 30
        image: exporter
        name: postgres-exporter
        ports:
        - containerPort: 9187
          name: metrics

๋˜ํ•œ ์„œ๋น„์Šค์™€ ์ด๋ฏธ์ง€ ์ŠคํŠธ๋ฆผ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐํฌ ํ›„์—๋Š” ๋ชจ๋‘๊ฐ€ ์„œ๋กœ ๋งŒ๋‚˜๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ์›ํ•ฉ๋‹ˆ๋‹ค.

Prometheus ๊ตฌ์„ฑ์— ๋‹ค์Œ ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  - job_name: 'postgres_exporter'
    metrics_path: '/metrics'
    scrape_interval: 5s
    dns_sd_configs:
    - names:
      - 'postgres-exporter'
      type: 'A'
      port: 9187

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ–ˆ์œผ๋ฉฐ ๋‚จ์€ ๊ฒƒ์€ ์ด ๋ชจ๋“  ํ•ญ๋ชฉ์„ grafana์— ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ฆ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž์‹ ๋งŒ์˜ ์ฟผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ ์™ธ์—๋„ prometheus์˜ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋” ๋งŽ์€ ๋Œ€์ƒ ์ง€ํ‘œ๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์นดํ”„์นด
  • ํƒ„์„ฑ ๊ฒ€์ƒ‰
  • ๋ชฝ๊ณ 

PS ์ด๋ฆ„, ํฌํŠธ ๋ฐ ๊ธฐํƒ€ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ๊ณต์ค‘์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ์–ด๋– ํ•œ ์ •๋ณด๋„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ์šฉํ•œ ๋งํฌ :
๋‹ค์–‘ํ•œ ์ˆ˜์ถœ์—…์ฒด ๋ชฉ๋ก

์ถœ์ฒ˜ : habr.com

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