EP01 [Part 1: Kubernetes ๋ชจ๋ํฐ๋ง ๊ธฐ์ด #1] ๋ชจ๋ํฐ๋ง์ ๋ณธ์ง๊ณผ Prometheus์ ํต์ฌ ๊ฐ๋
๐ ๋ชจ๋ํฐ๋ง, ์ ์ค์ํ๊ฐ?
ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ํ๊ฒฝ์์ ๋ชจ๋ํฐ๋ง์ ๋จ์ํ '๊ด์ฐฐ'์ ๋์ด ์์คํ ์ ์์กด๊ณผ ์ง๊ฒฐ๋ฉ๋๋ค. ํนํ ์ฟ ๋ฒ๋คํฐ์ค์ ๊ฐ์ ๋ณต์กํ ๋ถ์ฐ ์์คํ ์์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
โ ๋ชจ๋ํฐ๋ง์ ๋ณธ์ง์ ๊ฐ์น
- ์์คํ ๊ฐ์์ฑ(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๊ฐ์ง ๊ธฐ๋ณธ ๋ฉํธ๋ฆญ ํ์ ์ ์ ๊ณตํฉ๋๋ค:
- Counter: ์ฆ๊ฐ๋ง ๊ฐ๋ฅํ ๋์ ๊ฐ
- # ์์ฒญ ์ด ํ์ ์์ http_requests_total{status="200"} 1027
- Gauge: ์ฆ๊ฐ/๊ฐ์ ๊ฐ๋ฅํ ํ์ฌ ์ํ ๊ฐ
- # ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์์ node_memory_MemFree_bytes 1.293144e+10
- Histogram: ๊ตฌ๊ฐ๋ณ ๋ถํฌ ์ธก์
- # ์๋ต ์๊ฐ ๋ถํฌ ์์ 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
- Summary: ๋ฐฑ๋ถ์ ๊ธฐ๋ฐ ํต๊ณ
- # ๋ฐฑ๋ถ์ ์๋ต ์๊ฐ ์์ 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๋ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ํ๊ฒฝ์ ์ํ ๊ฐ๋ ฅํ ๋ชจ๋ํฐ๋ง ์๋ฃจ์ ์ ๋๋ค.
- ๋ฉํธ๋ฆญ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์๊ณผ ํ ๋ชจ๋ธ์ ๋์ ํ๊ฒฝ์ ์ ํฉํฉ๋๋ค.
- ๋ผ๋ฒจ ์์คํ ์ ๋ค์ฐจ์ ๋ถ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค์์ ํตํฉ์ ์๋ํ๋ ๋ชจ๋ํฐ๋ง ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.