Observability/Prometheus

EP01 [Part 1: Kubernetes ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ์ดˆ #1] ๋ชจ๋‹ˆํ„ฐ๋ง์˜ ๋ณธ์งˆ๊ณผ Prometheus์˜ ํ•ต์‹ฌ ๊ฐœ๋…

ygtoken 2025. 3. 19. 13:58
728x90

 

๐Ÿ“Œ ๋ชจ๋‹ˆํ„ฐ๋ง, ์™œ ์ค‘์š”ํ•œ๊ฐ€?

ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ ๋ชจ๋‹ˆํ„ฐ๋ง์€ ๋‹จ์ˆœํ•œ '๊ด€์ฐฐ'์„ ๋„˜์–ด ์‹œ์Šคํ…œ์˜ ์ƒ์กด๊ณผ ์ง๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

โœ… ๋ชจ๋‹ˆํ„ฐ๋ง์˜ ๋ณธ์งˆ์  ๊ฐ€์น˜

  • ์‹œ์Šคํ…œ ๊ฐ€์‹œ์„ฑ(Visibility) ํ™•๋ณด
  • ๋ฌธ์ œ ์กฐ๊ธฐ ๋ฐœ๊ฒฌ ๋ฐ ์˜ˆ๋ฐฉ
  • ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™” ๋ฐ ๋น„์šฉ ์ ˆ๊ฐ
  • ์„œ๋น„์Šค ํ’ˆ์งˆ(SLA) ๋ณด์žฅ

โ–ถ๏ธ ์‹ค๋ฌด ์‚ฌ๋ก€: ํ•œ ์Šคํƒ€ํŠธ์—…์—์„œ ์ ์ ˆํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ์—†์ด ํŠธ๋ž˜ํ”ฝ์ด ๊ธ‰์ฆํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค๊ฐ€, ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ์‹œ์Šคํ…œ ๋‹ค์šด์œผ๋กœ ์ˆ˜๋ฐฑ๋งŒ ์›์˜ ์†์‹ค์„ ์ž…์€ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋ง์€ '๋น„์šฉ'์ด ์•„๋‹Œ 'ํˆฌ์ž'์ž…๋‹ˆ๋‹ค.


๐Ÿ“Œ ์ „ํ†ต์  ๋ชจ๋‹ˆํ„ฐ๋ง vs ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋‹ˆํ„ฐ๋ง

โœ… ์ „ํ†ต์  ๋ชจ๋‹ˆํ„ฐ๋ง์˜ ํ•œ๊ณ„

  • ์ •์  ์ธํ”„๋ผ ์ค‘์‹ฌ
  • ์ˆ˜๋™ ์„ค์ • ๋ฐ ๊ด€๋ฆฌ
  • ํ™•์žฅ์„ฑ ์ œํ•œ
  • ๋‹จ์ผ ์„œ๋ฒ„/์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ์ 

โœ… ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋‹ˆํ„ฐ๋ง์˜ ํŠน์ง•

  • ๋™์  ํ™˜๊ฒฝ ๋Œ€์‘
  • ์ž๋™ํ™”๋œ ๊ฒ€์ƒ‰ ๋ฐ ์„ค์ •
  • ๋ฌดํ•œ ํ™•์žฅ์„ฑ
  • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ „์ฒด ์กฐ๋ง

โ–ถ๏ธ ๊ฐœ๋… ๋น„๊ต: ์ „ํ†ต์  ๋ชจ๋‹ˆํ„ฐ๋ง์€ '์ •์ ์ธ ํ’๊ฒฝ ์‚ฌ์ง„'์ด๋ผ๋ฉด, ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋‹ˆํ„ฐ๋ง์€ '์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ๋น„๋””์˜ค'์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Š์ž„์—†์ด ๋ณ€ํ™”ํ•˜๋Š” ํ™˜๊ฒฝ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ด€์ฐฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ Prometheus๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

Prometheus๋Š” CNCF(Cloud Native Computing Foundation)์˜ ๋‘ ๋ฒˆ์งธ ์กธ์—… ํ”„๋กœ์ ํŠธ๋กœ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ƒํƒœ๊ณ„์—์„œ ์‚ฌ์‹ค์ƒ ํ‘œ์ค€(de facto standard)์ด ๋œ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

 

โœ… Prometheus์˜ ํƒ„์ƒ ๋ฐฐ๊ฒฝ

  • 2012๋…„ SoundCloud์—์„œ ๊ฐœ๋ฐœ ์‹œ์ž‘
  • Google์˜ Borgmon์—์„œ ์˜๊ฐ์„ ๋ฐ›์Œ
  • 2016๋…„ CNCF ๊ฐ€์ž…, 2018๋…„ ์กธ์—…
  • ํ˜„์žฌ ๊ฐ€์žฅ ํ™œ๋ฐœํ•œ ์˜คํ”ˆ์†Œ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜

โœ… Prometheus์˜ ํ•ต์‹ฌ ์ฒ ํ•™

  • ์‹ ๋ขฐ์„ฑ ์šฐ์„ : ๋ฌธ์ œ ์ƒํ™ฉ์—์„œ๋„ ์ž‘๋™
  • ์ž์ฒด ํฌํ•จ(Self-contained): ์™ธ๋ถ€ ์˜์กด์„ฑ ์ตœ์†Œํ™”
  • ๋ฉ”ํŠธ๋ฆญ ๊ธฐ๋ฐ˜: ๋กœ๊ทธ๋‚˜ ํŠธ๋ ˆ์ด์‹ฑ์ด ์•„๋‹Œ ์ˆซ์ž ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ
  • ํ’€(Pull) ๋ชจ๋ธ: ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹

โ–ถ๏ธ ์‹ค๋ฌด ํŒ: "๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๊ฐ€ ๋‹ค์šด๋˜๋ฉด ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค" - Prometheus๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ Prometheus์˜ ํ•ต์‹ฌ ๊ฐœ๋…

โœ… ๋ฉ”ํŠธ๋ฆญ ํƒ€์ž…

Prometheus๋Š” 4๊ฐ€์ง€ ๊ธฐ๋ณธ ๋ฉ”ํŠธ๋ฆญ ํƒ€์ž…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  1. Counter: ์ฆ๊ฐ€๋งŒ ๊ฐ€๋Šฅํ•œ ๋ˆ„์  ๊ฐ’
  2. # ์š”์ฒญ ์ด ํšŸ์ˆ˜ ์˜ˆ์‹œ http_requests_total{status="200"} 1027
  3. Gauge: ์ฆ๊ฐ€/๊ฐ์†Œ ๊ฐ€๋Šฅํ•œ ํ˜„์žฌ ์ƒํƒœ ๊ฐ’
  4. # ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์˜ˆ์‹œ node_memory_MemFree_bytes 1.293144e+10
  5. Histogram: ๊ตฌ๊ฐ„๋ณ„ ๋ถ„ํฌ ์ธก์ •
  6. # ์‘๋‹ต ์‹œ๊ฐ„ ๋ถ„ํฌ ์˜ˆ์‹œ http_request_duration_seconds_bucket{le="0.1"} 12 http_request_duration_seconds_bucket{le="0.5"} 84 http_request_duration_seconds_bucket{le="1"} 93
  7. Summary: ๋ฐฑ๋ถ„์œ„ ๊ธฐ๋ฐ˜ ํ†ต๊ณ„
  8. # ๋ฐฑ๋ถ„์œ„ ์‘๋‹ต ์‹œ๊ฐ„ ์˜ˆ์‹œ http_request_duration_seconds{quantile="0.5"} 0.052 http_request_duration_seconds{quantile="0.9"} 0.87 http_request_duration_seconds{quantile="0.99"} 1.2

โœ… PromQL (Prometheus Query Language)

Prometheus๋Š” ๊ฐ•๋ ฅํ•œ ์ž์ฒด ์ฟผ๋ฆฌ ์–ธ์–ด์ธ PromQL์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

# ์ตœ๊ทผ 5๋ถ„ ๋™์•ˆ์˜ ์ดˆ๋‹น HTTP ์š”์ฒญ ์ˆ˜
rate(http_requests_total[5m])

# ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ 
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100

# ์„œ๋น„์Šค๋ณ„ 99๋ฒˆ์งธ ๋ฐฑ๋ถ„์œ„ ์‘๋‹ต ์‹œ๊ฐ„
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service))

โ–ถ๏ธ PromQL ํŒ: PromQL์€ ์ฒ˜์Œ์—๋Š” ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ, ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž์™€ ํ•จ์ˆ˜๋ฅผ ์ตํžˆ๋ฉด ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” 10๊ฐœ ์ฟผ๋ฆฌ๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์„ธ์š”.

โœ… ๋ผ๋ฒจ(Labels)๊ณผ ์ฐจ์›

Prometheus์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋ผ๋ฒจ ๊ธฐ๋ฐ˜ ์ฐจ์› ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค:

# ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•œ ๋ฉ”ํŠธ๋ฆญ ์˜ˆ์‹œ
http_requests_total{method="GET", endpoint="/api/users", status="200"} 93
http_requests_total{method="POST", endpoint="/api/users", status="201"} 45
http_requests_total{method="GET", endpoint="/api/products", status="200"} 128

์ด ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ:

  • ๋™์ผํ•œ ๋ฉ”ํŠธ๋ฆญ์— ๋‹ค์–‘ํ•œ ์ฐจ์› ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
  • ๋‹ค์ค‘ ์ฐจ์› ๋ถ„์„ ๊ฐ€๋Šฅ
  • ๋™์  ํ™˜๊ฒฝ์— ์ ํ•ฉํ•œ ์œ ์—ฐ์„ฑ

โ–ถ๏ธ ๋ผ๋ฒจ๋ง ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค: ๋„ˆ๋ฌด ๋งŽ์€ ๋ผ๋ฒจ์€ ์นด๋””๋„๋ฆฌํ‹ฐ ํญ๋ฐœ(cardinality explosion)์„ ์ผ์œผ์ผœ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ผญ ํ•„์š”ํ•œ ์ฐจ์›๋งŒ ๋ผ๋ฒจ๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.


๐Ÿ“Œ Prometheus ์—์ฝ”์‹œ์Šคํ…œ

Prometheus๋Š” ๋‹จ์ผ ๋„๊ตฌ๊ฐ€ ์•„๋‹Œ ์™„์ „ํ•œ ์—์ฝ”์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค:

โœ… ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

  • Prometheus Server: ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ ๋ฐ ์ €์žฅ
  • Alertmanager: ์•Œ๋ฆผ ์ฒ˜๋ฆฌ ๋ฐ ๋ผ์šฐํŒ…
  • Pushgateway: ๋ฐฐ์น˜ ์ž‘์—… ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘
  • ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ง€์›
  • Exporters: ๊ธฐ์กด ์‹œ์Šคํ…œ ๋ฉ”ํŠธ๋ฆญ ๋…ธ์ถœ

โœ… ์ฃผ์š” Exporters

  • Node Exporter: ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ ๋ฉ”ํŠธ๋ฆญ
  • cAdvisor: ์ปจํ…Œ์ด๋„ˆ ๋ฉ”ํŠธ๋ฆญ
  • kube-state-metrics: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ฐ์ฒด ์ƒํƒœ
  • Blackbox Exporter: ํ”„๋กœ๋ธŒ ๊ธฐ๋ฐ˜ ๋ชจ๋‹ˆํ„ฐ๋ง

[Prometheus ์—์ฝ”์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ.

  • ์ค‘์•™์— Prometheus ์„œ๋ฒ„
  • ์ฃผ๋ณ€์— ๋‹ค์–‘ํ•œ Exporters, Alertmanager, Pushgateway
  • ํ™”์‚ดํ‘œ๋กœ ๋ฐ์ดํ„ฐ ๋ฐ ์•Œ๋ฆผ ํ๋ฆ„ ํ‘œ์‹œ]

โ–ถ๏ธ ์—์ฝ”์‹œ์Šคํ…œ ํ™•์žฅ: Prometheus๋Š” Thanos, Cortex ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ๋Œ€๊ทœ๋ชจ ํ™˜๊ฒฝ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ํ›„์† ๊ธ€์—์„œ ๋” ์ž์„ธํžˆ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ์˜ Prometheus

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์™€ Prometheus๋Š” ๋งˆ์น˜ ์ง์ด ๋งž๋Š” ํผ์ฆ ์กฐ๊ฐ์ฒ˜๋Ÿผ ์ž˜ ์–ด์šธ๋ฆฝ๋‹ˆ๋‹ค:

 

โœ… ํ†ตํ•ฉ ์ด์ 

  • ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ ์ž๋™ํ™”
  • ๋™์  ํ™˜๊ฒฝ ์ ์‘์„ฑ
  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ™œ์šฉ
  • ์˜คํ† ์Šค์ผ€์ผ๋ง ์ง€์›

โœ… ๋ฐฐํฌ ์˜ต์…˜

  • ์ˆ˜๋™ ์„ค์น˜: ์œ ์—ฐ์„ฑ ๊ทน๋Œ€ํ™”
  • Helm Charts: ๊ฐ„ํŽธํ•œ ์„ค์น˜
  • Prometheus Operator: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„ค์ดํ‹ฐ๋ธŒ ๊ด€๋ฆฌ
  • kube-prometheus-stack: ์™„์ „ํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ์Šคํƒ

โ–ถ๏ธ ์‹œ์ž‘ ์ถ”์ฒœ: ์ฒ˜์Œ์ด๋ผ๋ฉด kube-prometheus-stack์œผ๋กœ ์‹œ์ž‘ํ•˜์„ธ์š”. ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋ณธ ์„ค์ •์ด ์ค€๋น„๋˜์–ด ์žˆ์–ด ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ Summary

  • Prometheus๋Š” ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.
  • ๋ฉ”ํŠธ๋ฆญ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ํ’€ ๋ชจ๋ธ์€ ๋™์  ํ™˜๊ฒฝ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ผ๋ฒจ ์‹œ์Šคํ…œ์€ ๋‹ค์ฐจ์› ๋ถ„์„์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์™€์˜ ํ†ตํ•ฉ์€ ์ž๋™ํ™”๋œ ๋ชจ๋‹ˆํ„ฐ๋ง ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 


 

728x90