๐ ์ด ๋ด์ฉ์ ์ฑ
๋ด์ฉ ๋ฉ๋ชจ์
๋๋ค.
๊ฐ์ธ์ ์ธ ์๊ฐ๊ณผ ๊ฒฝํ ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ์ก๋ด์ด ์์ผ๋, ์ฑ
์ ์ฝ์ผ๋ฉฐ ์๊ฒฌ์ ๋๋๊ณ ์ถ์๋ถ์ด ๋ด์ฃผ์๋ฉด ์ข๊ฒ ์ต๋๋ค.
์ด๋ฒ 3์ฅ์์๋ ํ๋ก๋ฉํ ์ฐ์ค์ ๋ํด ์ด์ผ๊ธฐ ํ๊ณ ์๋ค.
ํ๋ก๋ฉํ
์ฐ์ค๋ ํ๋ก๋ฉํ
์ฐ์ค ์์ฒด๋ฅผ ์ ์ฌ์ฉํ๊ธฐ ์ํ ๋ง ๊ทธ๋๋ก์ ์ํ๊ณ๋ฅผ ๊ตฌ์ถํ๊ณ ์๋ค.
ํ๋ก๋ฉํ
์ฐ์ค ์ํ๊ณ์ ๋ด๋ถ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ์๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ
์ ์ ์ํ ์ ์๊ธฐ๋๋ฌธ์ ์ดํดํ๋๊ฒ์ด ๋งค์ฐ ์ค์ํ๋ค.
3.1 ํ๋ก๋ฉํ ์ฐ์ค ๋ฐ์ด๋๋ฆฌ ๊ตฌ์ฑ
ํ๋ก๋ฉํ
์ฐ์ค๋ 2012๋
์์๋์๊ณ , ๋
๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ๋๊ณ ์๋ ์คํ์์ค์ด๋ค.
2016๋
์ Kubernetes์ ์ด์ด ๋ ๋ฒ์งธ๋ก Cloud Native Computing Foundation์ ๊ฐ์
ํ๋ค. Prometheus๋ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ํ๊ฒฝ์์ ์ ๋ง ์ค์ํ ์ญํ ์ ํ๊ณ ์๋ค๋๊ฒ ๊ทธ๋ฆฌ๊ณ Kubernetes์ Prometheus๋ ๊ธด๋ฐํ๊ฒ ์ฐ๊ณ๋์ด ์๋ค๋๊ฑธ ์ถ์ธกํด๋ณผ ์์๋ค.
ํ๋ก๋ฉํ
์ฐ์ค๋ ํ๋ก๋ฉํ
์ฐ์ค ์์ฒด ์๋ฒ ์ธ์๋ ํ๋ก๋ฉํ
์ฐ์ค ์ํ๊ณ๋ฅผ ๊ตฌ์ถํ๊ณ ์๋ค.
์ฌ๊ธฐ์์๋ ํ๋ก๋ฉํ
์ฐ์ค ์๋ฒ์์ฒด๊ฐ ์๋๋ผ ์ํ๊ณ์ ํฌํจ๋ Exporter, Operator, Adapter๋ฅผ ์๊ฐํ๋ค.
Prometheus ๊ธฐ๋ณธ๊ฐ๋ ์ค๋ช
FAQํ์ด์ง์๋ ์ด๋ ๊ฒ ํ๋ก๋ฉํ ์ฐ์ค๋ฅผ ์ด๋ ๊ฒ ์ ์ํ๊ณ ์๋ค. (์ฐธ๊ณ )
Prometheus is an open-source systems monitoring and alerting toolkit with an active ecosystem. It is the only system directly supported by Kubernetes and the de facto standard across the cloud native ecosystem.
์ฆ, ํ๋ก๋ฉํ ์ฐ์ค๋ ํ๋ฐํ ์ํ๊ณ๋ฅผ ๊ฐ์ง ๋ชจ๋ํฐ๋ง ๋ฐ ์๋ ํดํท์ด๋ค. ๋ํ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ํ๊ณ ์ ๋ฐ์ ๊ฑธ์ณ ์ฌ์ค์์ ํ์ค ์ด๋ผ๊ณ ๋งํ๊ณ ์๋ค. ๋ฉ์ง ์๊ฐ๊ธ์ด๋ค. ๐๐๐
์ด ์ฑ ์์๋ ์ด๋ ๊ฒ ๋งํ๊ณ ์๋ค.
"์ฟ ๋ฒ๋คํฐ์ค์ ์ฃผ์ ์ญํ ์ด ์ ํ๋ฆฌ์ผ์ด์
์ ํฌํจํ ์ปจํ
์ด๋๋ฅผ ์ด์ํ๊ณ ์ค์ผ์ค๋ง ํ๋๊ฒ์ด๋ผ๋ฉด, ํ๋ก๋ฉํ
์ฐ์ค๋ ์ฟ ๋ฒ๋คํฐ์ค ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ํํ๊ฒ ๋์๊ฐ๋๋ก ๋ค์ํ๊ณ ๋ณต์กํ ์ญํ ์ ์ํํ๋ค."
๋ค์ ์๊ฐํด๋ณด๋ฉด, ์ด๋ค ์คํ์์ค๋ฅผ ์ฌ์ฉํ๋์ง helm์ผ๋ก ์ค์นํ๋ฉด ๋๋ถ๋ถ prometheus exporter ("/metric")์ ํฌํจํ๊ณ ์์๋ค. ์ ๋ง ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์์ ์ฌ์ค์์ ํ์ค์ด ๋ง๋๊ฒ ๊ฐ๋ค.
๋ค๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ๊ธฐ๋ฅ๊ณผ ์ปดํฌ๋ํธ๋ฅผ ๊ณต์๋ฌธ์ ์์ ๋ฒ ๊ปด์๋ค. ์ดํดํ๋๋ฐ ๋์์ด ๋ ๊ฒ๊ฐ๋ค.
- ํ๋ก๋ฉํ
์ฐ์ค ๊ธฐ๋ฅ
- a multi-dimensional data model with time series data identified by metric name and key/value pairs
-> ์ด๊ฑด ๋ค์์ ์ค๋ช ํ๋ค. - PromQL, a flexible query language to leverage this dimensionality
- no reliance on distributed storage; single server nodes are autonomous
- time series collection happens via a pull model over HTTP
- pushing time series is supported via an intermediary gateway
- targets are discovered via service discovery or static configuration
- multiple modes of graphing and dashboarding support
- a multi-dimensional data model with time series data identified by metric name and key/value pairs
- ํ๋ก๋ฉํ
์ฐ์ค ์ปดํฌ๋ํธ
- ํ๋ก๋ฉํ ์ฐ์ค ์ํ๊ณ๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๋๋ถ๋ถ ์ต์ ๋ํ๊ฒ ์ ์ฉํ ์ ์๋ค.
- Prometheus server (scrapes and stores time series data)
- client libraries
- push gateway
- exporters.
- alertmanager
Prometheus ์ฃผ์ ์ปดํฌ๋ํธ
Prometheus๋ ๋ค์ํ ๋๊ตฌ๋ฅผ ํตํด ๊ฑฐ์ ๋ชจ๋ ์ ํ์ ์ธํ๋ผ์ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ชจ๋ํฐ๋งํ๊ณ ์ด์ ์๋ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ฅผ ์ํ ๋ช๊ฐ์ง ์ค์ํ ๋ถ๋ถ์ ์ดํด๋ณธ๋ค.
- Prometheus Operator
- Kubernetes ํ๊ฒฝ ๋ด์์ Prometheus์ ๋ฐฐํฌ์ ๊ด๋ฆฌ๋ฅผ ์๋ํํ ์์๋ค.
- Prometheus Operator์ Service Monitor์ Pod Monitor๋ฅผ ํตํด Kubernetes ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ์๋น์ค์ ํ๋์ ์ฆ๊ฐ์ ๋ชจ๋ํฐ๋ง ํ๋ฉฐ, ์ฆ๊ฐ ๋ฐ์ ์ ํ๋ก๋ฉํ ์ฐ์ค ๊ตฌ์ฑํ์ผ์ ์ ๋ฐ์ดํธ ํ๋ค.
- Prometheus Exporter
- Exporter๋ Prometheus๊ฐ ์ง์ ์ ์ผ๋ก ๋ฉํธ๋ฆญ์ ์์งํ ์ ์๋ ๋ค์ํ ์์ค๋ก๋ถํฐ ๋ฉํธ๋ฆญ์ ์์งํ์ฌ Prometheus๊ฐ ์ดํดํ ์ ์๋ ํ์์ผ๋ก ๋ณํํ๋ ์ญํ ์ ํ๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ Exporter๊ฐ ์กด์ฌํ๋ฉฐ, ๊ทธ ์ธ์๋ ์ปค์คํ ๋ฉํธ๋ฆญ ๊ฐ๋ฐ์ ์ํ API,SDK๋ฅผ ์ ๊ณตํ๋ค.
- Prometheus Adapter
- Adapter๋ ์ฃผ๋ก Kubernetes ํ๊ฒฝ์์ Prometheus์์ ์์งํ ๋ฉํธ๋ฆญ์ ์ฌ์ฉํ์ฌ Kubernetes์ ์๋ ์ค์ผ์ผ๋ง ๊ธฐ๋ฅ(์: Horizontal Pod Autoscaler, HPA)๊ณผ ์ฐ๋ํ๋ ์ญํ ์ ํ๋ค. Prometheus์ ๋ฉํธ๋ฆญ์ Kubernetes์ Custom Metrics API๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋๋ก ๋ณํํ๋ ์ค๊ฐ์ ์ญํ ์ ์ํํ๋ค.
์๋ ๊ทธ๋ฆผ์ PrometheusThanos ๊ด๋ จ ์ํคํ ์ณ์ธ๋ฐ, ์ฌ๊ธฐ ์์ Operator, Exporter, Adapter๊ฐ ๋ชจ๋ ์ฝ๊ฒ ํ์๋์ด์์ด ๊ฐ์ ธ์๋ค.
3. 2 ํ๋ก๋ฉํ ์ฐ์ค ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค
3.2.1. ๋ฐ์ดํฐ ํ์
Prometheus Exporter๊ฐ /metrics ๊ฒฝ๋ก๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ฉด, prometheus ๋ pull๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ค.
์ด ๋ฐ์ดํฐ ํ์์ ๋ณด๋ฉด, http_requests_total ์ด๋ผ๋ metric์ด๋ฆ์ผ๋ก ์ฌ๋ฌ ๋ ์ด๋ธ์ด ์๋ค.
status ๋ ์ด๋ธ์ "200", "400", "500" ๋ฑ์ ๊ฐ์ด ์์ ์ ์๊ณ , method ๋ ์ด๋ธ์ "GET", "POST"๊ฐ์ ๊ฐ์ง ์ ์๋ค๊ณ ๊ฐ์ ํ ๋ Prometheus๋ ๊ฐ๊ฐ์ ๋ ์ด๋ธ ์กฐํฉ์ ๋ํด ๋ณ๋์ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค.
- http_requests_total {status="200", method="GET"}
- http_requests_total {status="200", method="POST"}
- http_requests_total {status="400", method="GET"}
- http_requests_total {status="400", method="POST"}
- http_requests_total {status="500", method="GET"}
- http_requests_total {status="500", method="POST"}
์ฌ๊ธฐ์์ ์ค์ํ ๊ฐ๋ ์ด ์นด๋๋๋ฆฌํฐ์ด๋ค.
- ์นด๋๋๋ฆฌํฐ๋?
- ํน์ ๋ฉํธ๋ฆญ์ ๋ํด ๊ณ ์ ํ ๋ ์ด๋ธ ์กฐํฉ์ ์ด ์๋ฅผ ๋งํ๋ค.
- ์๋ฅผ๋ค์ด http_requests_total ๋ฉํธ๋ฆญ์ ๋ํด status์ method ๋ผ๋ฒจ์ด ๊ฐ๊ฐ ์ธ ๊ฐ์ง์ ๋ ๊ฐ์ง ๊ฐ๋ฅํ ๊ฐ์ ๊ฐ์ง ์ ์๋ค๊ณ ํ ๋, ์ต๋ ์นด๋๋๋ฆฌํฐ๋ 6(status์ 3๊ฐ ๊ฐ × method์ 2๊ฐ ๊ฐ)์ด๋ฉฐ, Prometheus์ ์ํด ๋ณ๋์ ์๊ณ์ด๋ก ๊ด๋ฆฌ๋๋ค.
- ์นด๋๋๋ฆฌํฐ๊ฐ ์ ์ค์ํ๊ฐ?
- ๊ฐ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ํ์ํ ๋ฆฌ์์ค์ ์์คํ ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๋ค.
- ๋ฉํธ๋ฆญ์ ์์ ์ด ์กฐํฉ๋ ์ฌ๋ฌ ์ฐจ์์ ํ๋ก๋ฉํ ์ฐ์ค์์ ์์ ์นด๋๋๋ฆฌํฐ ์คํ์ดํฌ๋ฅผ ์ผ๊ธฐํ ์์๋ค.
3.2.2. ๋ฐ์ดํฐ ๊ด๋ฆฌ
Prometheus์์ ์คํฌ๋ํ ๋ ๋ฐ์ดํฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ค.
ํ๋ก๋ฉํ
์ฐ์ค์์ ์๊ณ์ด ๋ฐ์ดํฐ์ ์ด๋ป๊ฒ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋์ง ํ์ธํด๋ณด์.
ํ๋ก๋ฉํ ์ฐ์ค Time Series Database(TSDB)๋ ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ฉฐ ์ด๋ฐ ํน์ง์ด ์๋ค.
- ํ๋ก๋ฉํ
์ฐ์ค TSDBํน์ง
- LRU ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ, ๊ฐ์ฅ ์ค๋ซ๋์ ์ฐธ์กฐํ์ง ์์ ํ์ด์ง๋ฅผ ๊ต์ฒดํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง(paging)์ ์ฌ์ฉํ๋๋ฐ, ์ผ์ ํฌ๊ธฐ์ธ ํ์ด์ง๋ก ๋ถํ ํด์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๋ ๋ฐฉ์์ด๋ค.
- ์์ง๋ ๋ฐ์ดํฐ(์์ผ๋ก๋ chunk ๋ผ๋ ์ฉ์ด๋ก ๋ถ๋ฅธ๋ค)๋ ๋ธ๋กํํ๋ก ๋ง๋ค์ด ๋์คํฌ์ ์ ์ฅํ๋ค.
- ๋ธ๋ก์ ๋ค์์ ํํฌ๋ฅผ ํฌํจํ์ฌ ์ธ๋ฑ์ค ๋ฑ์ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋๋ค. ์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ์ ์์น์ ์ฐธ์กฐ์ ๋ํ ์ ๋ณด ๋ฟ๋ง ์๋๋ผ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์กฐํํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ๋ฐ์ดํฐ์ ์ ๋ค์ ๋ฐ์ดํฐ๊ทธ๋ฃน์ ์๋ฏธํ๋ฉฐ, ๋ฐ์ดํฐ ํฌ์ธํธ๋ ๋์๋ณด๋์์ ์๊ณ์ด๋ก ์ถ๋ ฅ๋๋ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ๋งํ๋ค.
- ํ๋ก๋ฉํ
์ฐ์ค ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ์ค์ ๋ฐ์ดํฐ๊ฐ ์ด๋์ ์ ์ฅ๋์๋์ง ๋ณด๋ ค๋ฉด ps๋ก ํ์ธํด๋ณผ ์ ์๋ค.
# ํ๋ก๋ฉํ
์ฐ์ค ์คํ ๋ฆฌ์ง ์ด๋์ธ์ง ํ์ธํ๊ธฐ
/prometheus $ ps
PID USER TIME COMMAND
1 1000 12:09 /bin/prometheus --storage.tsdb.path=/prometheus --storage.tsdb.retention.time=24h (๋๋จธ์ง์๋ต)
77 1000 0:00 /bin/sh
# ๊ตฌ์กฐ ํ์ธํ๊ธฐ
/prometheus $ tree
.
โโโ 01HQ4SP85M2HZ1T160MKJ8ETAX
โ โโโ chunks
โ โ โโโ 000001
โ โโโ index
โ โโโ meta.json
โ โโโ tombstones
โโโ 01HQ53DJWQYFHF0R0W81TP1M51
โ โโโ chunks
โ โ โโโ 000001
โ โโโ index
โ โโโ meta.json
โ โโโ tombstones
โโโ 01HQ57N0M547EXEQF95J3H077B # ๋ธ๋ก
โ โโโ chunks # ์ฒญํฌํ์ผ
โ โ โโโ 000001
โ โโโ index # ์์ธ์ ์ํ ๋ ์ด๋ธ๊ณผ ์๊ฐ ์ธ๋ฑ์ค ํ์ผ
โ โโโ meta.json # ๋ธ๋ก์ ๋ฉํ๋ฐ์ดํฐ
โ โโโ tombstones # ์ญ์ ์ฌ๋ถ ํ์ ํ์ผ
โโโ chunks_head # ์ฒญํฌํค๋
โ โโโ 000007
โ โโโ 000008
โโโ lock
โโโ queries.active
โโโ wal # wal ํ์ผ
โโโ 00000004
โโโ 00000005
โโโ 00000006
โโโ 00000007
โโโ checkpoint.00000003 # ๋ณต๊ตฌ๋ฅผ ์ํ checkpoint walํ์ผ
โโโ 00000000
- ๋ธ๋ก(Blocks)
- Prometheus๋ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ณ์ ๋ธ๋ก์ผ๋ก ์ ์ฅํ๋ค.
- ๊ฐ ๋ธ๋ก์ ํน์ ์๊ฐ ๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ์ฌ๊ธฐ์ 01HQ57N0M547EXEQF95J3H077B ๊ฐ์ ๋๋ ํ ๋ฆฌ๋ ๊ฐ๋ณ ๋ธ๋ก์ ๋ํ๋ธ๋ค.
- ๋ธ๋ก์ ๊ตฌ์ฑ์์
- chunks: ์ค์ ์๊ณ์ด ๋ฐ์ดํฐ ์ํ์ด ์ ์ฅ๋ ํ์ผ์ด๋ฉฐ, ์ฒญํฌ ํ์ผ(000001 ๋ฑ)์ ์๊ฐ์ ๋ฐ๋ฅธ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์์ถํ์ฌ ์ ์ฅํ๋ค.
- index: ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฟผ๋ฆฌํ ์ ์๋๋ก ๋๋ ์ธ๋ฑ์ค ํ์ผ์ด๋ค. ๋ฉํธ๋ฆญ ์ด๋ฆ, ๋ ์ด๋ธ, ํ์์คํฌํ ๋ฑ์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ํฌํจํ์ฌ, ์ฟผ๋ฆฌ ์ ํด๋น ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๊ฒ ํ๋ค.
- meta.json: ํด๋น ๋ธ๋ก์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ํ์ผ์ ๋๋ค. ๋ธ๋ก์ ์๊ฐ ๋ฒ์, ๋ฒ์ ์ ๋ณด, ๋ธ๋ก์ ๋ํ ๋ค๋ฅธ ๋ฉํ๋ฐ์ดํฐ ๋ฑ์ด ํฌํจ๋๋ฉฐ ์ฌ๋์ด ์ฝ์ ์ ์๋ค.
- tombstones: ์ญ์ ๋ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ํ์ผ์ด๋ค. ๋ฐ์ดํฐ ์ญ์ ์์ฒญ์ด ์์ ๊ฒฝ์ฐ, ์ค์ ๋ฐ์ดํฐ๋ ์ฆ์ ์ญ์ ๋์ง ์๊ณ , ์ด ํ์ผ์ ์ญ์ ๋งํฌ๊ฐ ํ์๋๋ค.
- ์ฒญํฌ ํค๋(chunks_head)
- ํ์ฌ ์ฐ๊ธฐ ์์ ์ค์ธ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์์ ๊ณต๊ฐ์ด๋ค.
- Prometheus๋ ์๋ก์ด ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ๋จผ์ ์ด๊ณณ์ ์ ์ฅํ ํ, ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ๋ถ๋ณ ๋ธ๋ก์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ธด๋ค.
- WAL(Write-Ahead Logging)
- wal: WAL์ ์ฐ๊ธฐ ์ ํ ๋ก๊น (Write-Ahead Logging)์ ์ฝ์๋ก, ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ก์ผ๋ก ์ฎ๊ธฐ๊ธฐ ์ ์ ๋ชจ๋ ์ฐ๊ธฐ ์์ ์ ๋ก๊น ํ๋ค. ์ด๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ๋ณต๊ตฌ ๋ฉ์ปค๋์ฆ์ ๋ณด์ฅํ๊ธฐ ์ํ ๊ฒ์ด๋ค.
- checkpoint.00000003: ์ฒดํฌํฌ์ธํธ ํ์ผ์ WAL์ ํน์ ์์ ์์์ ์ค๋
์ท์ ๋ํ๋ธ๋ค.
์ด๋ ์์คํ ์ฌ์์ ์ WAL์ ์ ์ฒด ์ค์บ ์์ด ๋น ๋ฅธ ๋ณต๊ตฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ํ๋ก๋ฉํ ์ฐ์ค์์ ์ฅ์ ๊ฐ ๋ฐ์ํด์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด WAL๋ฅผ ํ์ฉํด ๋ฉ๋ชจ๋ฆฌ์์ ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌํ๋ค.
- ๊ธฐํ ํ์ผ
- lock: ๋์์ฑ ์ ์ด์ ๊ฐ์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฝ ํ์ผ
- queries.active: ํ์ฌ ์งํ ์ค์ธ ์ฟผ๋ฆฌ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ํ์ผ
3.2.3. ๋ธ๋ก๊ด๋ฆฌ
- ์ํ
- ์ํ(sample)์ ์๊ณ์ด ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์๋ฏธํ๋ฉฐ, ์๊ณ์ด ๋ฐ์ดํฐ์ ํต์ฌ ๋จ์์ด๋ค.
- ๊ฐ๊ฐ์ ์ํ์ ํน์ ์์ ์์์ ๋ฉํธ๋ฆญ ๊ฐ๊ณผ ๊ทธ ์์ ์ ๋ํ๋ด๋ ํ์์คํฌํ๋ก ๊ตฌ์ฑ๋๋ค.
- ๋ฉํธ๋ฆญ๊ฐ(float64): ์ธก์ ํ๊ณ ์ ํ๋ ์ค์ ๋ฐ์ดํฐ ๊ฐ์ด๋ค. ์๋ฅผ ๋ค์ด, http_requests_total ๋ฉํธ๋ฆญ์ ์ํ ๊ฐ์ ํน์ ์์ ์์์ HTTP ์์ฒญ ์ด ์๋ฅผ ์๋ฏธํ๋ค.
- ํ์์คํฌํ: ๋ฉํธ๋ฆญ ๊ฐ์ด ๊ธฐ๋ก๋ ์ ํํ ์๊ฐ์ด๋ค.
- ๋ธ๋ก ์์ฑ
- ์๊ณ์ด์ ์๊ฐ์์ผ๋ก ์ธ๋ฑ์ฑ ๋๋ ์ซ์๋ฐ์ดํฐ ํฌ์ธํธ์ ์ํ์ค๋ก ์ ์ํ ์ ์๋ค.
- ํ๋ก๋ฉํ ์ฐ์ค ๋ฐ์ดํฐ ํฌ์ธํธ๋ ์ผ์ ํ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์์ง๋๋ฉฐ, ์ด๋ฐ ํ์์ ๊ทธ๋ํฝ ํ์์ผ๋ก ํํํ์๋ฉด x์ถ์ ์๊ฐ, y์ถ์ ๋ฐ์ดํฐ ๊ฐ์ด๋ค. (์๊ฐ์ ๋ฐ๋ฅธ ๋ณํ ํ์)
- ๋ฉ๋ชจ๋ฆฌ์ ์์ง๋ ์ํ์ ๊ธฐ๋ณธ ๋์๊ฐ ๋จ์๋ก ๋์คํฌ๋ก ํ๋ฌ์ ๋๊ณ ๋ธ๋ก์ด ์์ฑ๋๋ค.
- ๋ธ๋ก ๋ณํฉ
- ํฌ๊ธฐ๊ฐ ์์ ํ์ผ๊ฐ ๋ฐ์ดํฐ๊ฐ ๋ค์ ์กด์ฌํ๋ฉด ๋ชจ๋ ํ์ผ์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค๊ณ ๊ฒ์ํด์ผํ๋ฏ๋ก ์กฐํ์๋๊ฐ ๋๋ ค์ง๋ค. ๋ฐ๋ฉด ํ์ผ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํฌ๋ฉด ํจ์จ์ฑ์ด ๋จ์ด์ง๋ค.
- ํ์ผ์ ๊ฐ์์ ํ์ผ์ ํฌ๊ธฐ๋ฅผ ์ ์ ํ๊ฒ ์ ์งํ๋๊ฒ์ด ์ค์ํ๋ค.
- tsdb์ ๊ด๋ จ๋ ์ฃผ์ ์ต์
์ด๋ค.
- --storage.tsdb.min-block-duration :
TSDB์์ ์์ฑ๋ ์ ์๋ ์ต์ ๋ธ๋ก์ ์๊ฐ ๋ฒ์๋ฅผ ์ค์ ํ๋ค. ์ด ์๊ฐ ๋ฒ์ ๋์์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๋ธ๋ก์ผ๋ก ์ ์ฅํ๋ค.
์ด ๊ฐ์ Prometheus๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ผ๋ง๋ ์์ฃผ ์ปดํฉ์ (compaction, ์ฌ๋ฌ ๋ธ๋ก์ ๋ณํฉํ๋ ๊ณผ์ )ํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ์ํฅ์ ์ค๋ค. - --storage.tsdb.min-block-duration:
์ต๋ ๋ธ๋ก ๊ธฐ๊ฐ์ ์ค์ ํ๋ค. max-block-duration์ ์ปดํฉ์ ๊ณผ์ ์์ ์ฌ๋ฌ ๊ฐ์ ๋ฏธ๋๋ฉ ๋ธ๋ก์ ํ๋์ ํฐ ๋ธ๋ก์ผ๋ก ๋ณํฉํ ๋ ์์ฑ๋ ์ ์๋ ์ต๋ ๋ธ๋ก์ ์๊ฐ ๋ฒ์๋ฅผ ์ ์ํ๋ฉฐ, ์ด ์ค์ ์ ํตํด ๊ธด ์๊ฐ ๋์์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
Prometheus์์๋ min-block-duration์ผ๋ก ์ค์ ๋ ์๊ฐ ๋์์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๋ธ๋ก์ผ๋ก ์ ์ฅํ๊ณ , ์ฌ๋ฌ ๊ฐ์ ์ด๋ฐ ๋ธ๋ก์ด max-block-duration์ ๋๋ฌํ๋ฉด ์ด๋ค์ ํ๋์ ํฐ ๋ธ๋ก์ผ๋ก ๋ณํฉ๋๋ค. - --storage.tsdb.retention.time=24h : ๋ฐ์ดํฐ๋ฅผ ์ผ๋ง๋ ์ค๋ ๋ณด๊ดํ ์ง๋ฅผ ์ ํ๋ฉฐ, ๊ทธ ์ด์ ์ ๋ฐ์ดํฐ๋ ์๋์ผ๋ก ์ญ์ ํ๋ค.
- --storage.tsdb.path=/prometheus : ๋ฐ์ดํฐ๊ฐ ์ด๋์ ์ ์ฅ๋ ์ง ์ง์ ํ๋ค.
- --storage.tsdb.min-block-duration :
- ํ๋ก๋ฉํ
์ฐ์ค ๋ก์ปฌ ์คํ ๋ฆฌ์ง
- ํ๋ก๋ฉํ ์ฐ์ค๋ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
- ์ต์์ ๋ ๋ฒจ์์ ํ๋ก๋ฉํ ์ฐ์ค ์คํ ๋ฆฌ์ง ๋์์ธ์ ํ์ฌ ์ ์ฅ๋ ๋ชจ๋ ๋ ์ด๋ธ ๋ชฉ๋ก๊ณผ ์์ฒด ์๊ณ์ด ํ์์ ์ฌ์ฉํ๋ ์์ธ์ ์กฐํฉ์ผ๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
- ๋ฐ์ดํฐ ํ๋ฆ
- ๋ฉ๋ชจ๋ฆฌ
- ์ต์ ๋ฐ์ดํฐ ๋ฐฐ์น๋ ๊ธฐ๋ณธ ์ต๋ 2์๊ฐ ๋์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ค.
- ์์ง๋ ๋ฐ์ดํฐ๋ ํ๋์ด์์ ๋ฐ์ดํฐ ์ฒญํฌ(chunk) ํํ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ค. ์ด ๋ฐฉ์์ ์ฟผ๋ฆฌ ์๋ต ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ฉฐ, ๋์คํฌ I/O๋ฅผ ์ค์ธ๋ค. ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํจ์ผ๋ก์จ, ์์ฃผ ์ก์ธ์คํ๋ ์ต์ ๋ฐ์ดํฐ์ ๋ํ ์ฟผ๋ฆฌ ์๋๊ฐ ํฅ์๋๊ณ , ๋ฐ๋ณต์ ์ธ ๋์คํฌ ์ฐ๊ธฐ๊ฐ ๋ฐฉ์ง๋๋ค.
- ํค๋ ์ฒญํฌ (Head Chunks)
- ํค๋ ์ฒญํฌ๋ Prometheus์์ ํ์ฌ ํ์ฑํ๋์ด ๋ฐ์ดํฐ๊ฐ ์์ง๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ์ฒญํฌ๋ฅผ ์๋ฏธํ๋ค.
- ์ฒญํฌ๋ ๊ฐ์ฅ ์ต์ ์ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ๊ฐ ์ง์์ ์ผ๋ก ์ด ์ฒญํฌ์ ์ถ๊ฐ๋๋ค.
- ํค๋ ์ฒญํฌ๋ ์ผ์ ์๊ฐ์ด ์ง๋๊ฑฐ๋ ์ฒญํฌ๊ฐ ํน์ ํฌ๊ธฐ์ ๋๋ฌํ๋ฉด ๋์คํฌ์ ์ ์ฅ๋๋ ๋ถ๋ณ ์ฒญํฌ(immutable chunks)๋ก ๋ณํ๋๋ค.
- ์๋ฒํฐ๋ธ ์ฒญํฌ (Evictable Chunks, LRU ๊ธฐ๋ฐ)
- ์๋ฒํฐ๋ธ ์ฒญํฌ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด LRU (Least Recently Used) ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐ๋ ์ ์๋ ์ฒญํฌ๋ฅผ ์๋ฏธํ๋ค.
- Prometheus๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ผ์ ์๊ฐ ๋์ ์ฟผ๋ฆฌ์ ์ฌ์ฉ๋์ง ์์ ์ฒญํฌ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๋ค.
- ๋ก๊ทธ ์ ํ ๊ธฐ์
(Write-Ahead Logging, WAL)
- Prometheus๋ ๋ฐ์ดํฐ ์์ค์ ๋ฐฉ์งํ๊ธฐ ์ํด Write-Ahead Logging (WAL)์ ์ฌ์ฉํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๊ฐ ์์คํ ์ฅ์ ์ ๊ฐ์ด ์์ํ์ง๋ชปํ ์ํฉ์๋ ์์ ํ๊ฒ ๋ณดํธ๋ ์ ์๋๋กํ๋ค.
- ๋ฐ์ดํฐ๊ฐ ๋์คํฌ์ ์์ ํ๊ฒ ์ ์ฅ๋๊ธฐ ์ ์ ๋จผ์ ๋ก๊ทธ๋ก ๊ธฐ๋ก๋๋ ๋ฐฉ์์ผ๋ก, ์์คํ ์ฌ์์ ํ์๋ ๋ฐ์ดํฐ ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํ๊ฒ๋๋ค.
- ๋์คํฌ
- ์ค์ ๋ ์๊ฐ(๊ธฐ๋ณธ์ ์ผ๋ก 2์๊ฐ)์ด ์ง๋๋ฉด, ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ ์ฒญํฌ๋ ๋์คํฌ๋ก ์ฎ๊ฒจ์ง๋ฉฐ, ์ด๋ ์ฒญํฌ๋ ๋ถ๋ณ(immutable)์ ํํ๋ก ์ ์ฅ๋๋ค.
- ๋ฐ์ดํฐ ์ญ์ ๊ฐ ํ์ํ ๊ฒฝ์ฐ, Prometheus๋ ์ญ์ ํ์๋ฅผ ์ํ 'tombstone' ํ์ผ์ ์์ฑํฉ๋๋ค. ์ด๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์ญ์ ํ์ง ์๊ณ , ๋์ค์ ์ปดํฉ์ (compaction) ๊ณผ์ ์์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ
ํ๋ก๋ฉํ
์ฐ์ค์์ ์ ๊ณตํ๋ ๋ด๋ถ ๋ฉํธ๋ฆญ์ ํตํด ํ๋ฌ์ ์ํ, WAL,TSDB์ ์ํ์ ํฌ๊ธฐ, ์ ์ฌ๋๋ ๋ฉํธ๋ฆญ์ ๊ฐ์๋ฑ์ ๋ชจ๋ํฐ๋ง ํ ์ ์๋ค.
ํ๋ก๋ฉํ
์ฐ์ค๋ ํด๋ฌ์คํฐ๋ง์ด ๋์ง ์๊ณ ๋น๋ฒํ ์ฅ์ ๋ฐ์์ผ๋ก ์ธํด ๋ฉํธ๋ฆญ์ ์ ์ค์ด ๋ฐ์ํ๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
3. 3 ํ๋ก๋ฉํ ์ฐ์ค ์ฟ ๋ฒ๋คํฐ์ค ๊ตฌ์ฑ
helm chart๋ก ์ค์นํ๋ฉด ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋๊ฒ ์ฝ์ง ์์, ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ค์ด๋ฐ๊ณ , ๊ตฌ์คํ์ผ์ ์์ฑํ๊ณ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค๋ค.
ํ๋ก๋ฉํ ์ฐ์ค ์คํผ๋ ์ดํฐ (https://github.com/prometheus-operator/kube-prometheus)๋ฅผ ์ฌ์ฉํ์ฌ ์ค์นํ๋ค.
# ๋ก์ปฌ minikube ์์
minikube start
์ด๋, ๋ด minikube์ ํ ๋น๋ cpu/mem๊ฐ์ ์ ํ์ธํด์ผํ๋ค.
๐ฅ Creating docker container (CPUs=2, Memory=8100MB) ...
์ด์ ์์ค์ฝ๋๋ฅผ ๋ค์ด๋ฐ๊ณ ๋ช๊ฐ์ง ์์ ํด์ฃผ์ด์ผ ํ๋ค.
๋ก์ปฌ์ ๋์ฐ๋๊ฑฐ๋ผ ๋ฆฌ์์ค๊ฐ ๋ชจ์๋ผ์ Replica ๋ฐ ํ ๋น ํฌ๊ธฐ๋ฅผ ์ข ์ค์ฌ์ค์ผ ํ๋ค.
# ์์ค ๋ค์ด๋ก๋
git clone https://github.com/prometheus-operator/kube-prometheus.git
# ๋๋ ํ ๋ฆฌ ์ด๋
cd kube-prometheus
# manifests/alertmanager-alertmanager.yaml ์์
spec:
replicas: 1
resources:
limits:
cpu: 50m
memory: 50Mi
requests:
cpu: 4m
memory: 50Mi
# manifests/prometheus-prometheus.yaml ์์
spec:
replicas: 1
# manifests/prometheusAdapter-deployment.yaml ์์
spec:
replicas: 1
๊ทธ๋ฆฌ๊ณ setup์ ๋จผ์ ๋๋ฆฐ๋ค.
kubectl create -f manifests/setup
# ์ถ๋ ฅ๊ฒฐ๊ณผ
customresourcedefinition.apiextensions.k8s.io/alertmanagerconfigs.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/probes.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheusagents.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/scrapeconfigs.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/thanosrulers.monitoring.coreos.com created
namespace/monitoring created
๊ทธ๋ค์ ๋๋จธ์ง๋ ์์ฑํด์ค๋ค.
kubectl create -f manifests
# ์ถ๋ ฅ๊ฒฐ๊ณผ
alertmanager.monitoring.coreos.com/main created
networkpolicy.networking.k8s.io/alertmanager-main created
poddisruptionbudget.policy/alertmanager-main created
prometheusrule.monitoring.coreos.com/alertmanager-main-rules created
secret/alertmanager-main created
service/alertmanager-main created
serviceaccount/alertmanager-main created
servicemonitor.monitoring.coreos.com/alertmanager-main created
clusterrole.rbac.authorization.k8s.io/blackbox-exporter created
clusterrolebinding.rbac.authorization.k8s.io/blackbox-exporter created
configmap/blackbox-exporter-configuration created
deployment.apps/blackbox-exporter created
networkpolicy.networking.k8s.io/blackbox-exporter created
service/blackbox-exporter created
serviceaccount/blackbox-exporter created
servicemonitor.monitoring.coreos.com/blackbox-exporter created
secret/grafana-config created
secret/grafana-datasources created
configmap/grafana-dashboard-alertmanager-overview created
configmap/grafana-dashboard-apiserver created
configmap/grafana-dashboard-cluster-total created
configmap/grafana-dashboard-controller-manager created
configmap/grafana-dashboard-grafana-overview created
configmap/grafana-dashboard-k8s-resources-cluster created
configmap/grafana-dashboard-k8s-resources-multicluster created
configmap/grafana-dashboard-k8s-resources-namespace created
configmap/grafana-dashboard-k8s-resources-node created
configmap/grafana-dashboard-k8s-resources-pod created
configmap/grafana-dashboard-k8s-resources-workload created
configmap/grafana-dashboard-k8s-resources-workloads-namespace created
configmap/grafana-dashboard-kubelet created
configmap/grafana-dashboard-namespace-by-pod created
configmap/grafana-dashboard-namespace-by-workload created
configmap/grafana-dashboard-node-cluster-rsrc-use created
configmap/grafana-dashboard-node-rsrc-use created
configmap/grafana-dashboard-nodes-darwin created
configmap/grafana-dashboard-nodes created
configmap/grafana-dashboard-persistentvolumesusage created
configmap/grafana-dashboard-pod-total created
configmap/grafana-dashboard-prometheus-remote-write created
configmap/grafana-dashboard-prometheus created
configmap/grafana-dashboard-proxy created
configmap/grafana-dashboard-scheduler created
configmap/grafana-dashboard-workload-total created
configmap/grafana-dashboards created
deployment.apps/grafana created
networkpolicy.networking.k8s.io/grafana created
prometheusrule.monitoring.coreos.com/grafana-rules created
service/grafana created
serviceaccount/grafana created
servicemonitor.monitoring.coreos.com/grafana created
prometheusrule.monitoring.coreos.com/kube-prometheus-rules created
clusterrole.rbac.authorization.k8s.io/kube-state-metrics created
clusterrolebinding.rbac.authorization.k8s.io/kube-state-metrics created
deployment.apps/kube-state-metrics created
networkpolicy.networking.k8s.io/kube-state-metrics created
prometheusrule.monitoring.coreos.com/kube-state-metrics-rules created
service/kube-state-metrics created
serviceaccount/kube-state-metrics created
servicemonitor.monitoring.coreos.com/kube-state-metrics created
prometheusrule.monitoring.coreos.com/kubernetes-monitoring-rules created
servicemonitor.monitoring.coreos.com/kube-apiserver created
servicemonitor.monitoring.coreos.com/coredns created
servicemonitor.monitoring.coreos.com/kube-controller-manager created
servicemonitor.monitoring.coreos.com/kube-scheduler created
servicemonitor.monitoring.coreos.com/kubelet created
clusterrole.rbac.authorization.k8s.io/node-exporter created
clusterrolebinding.rbac.authorization.k8s.io/node-exporter created
daemonset.apps/node-exporter created
networkpolicy.networking.k8s.io/node-exporter created
prometheusrule.monitoring.coreos.com/node-exporter-rules created
service/node-exporter created
serviceaccount/node-exporter created
servicemonitor.monitoring.coreos.com/node-exporter created
clusterrole.rbac.authorization.k8s.io/prometheus-k8s created
clusterrolebinding.rbac.authorization.k8s.io/prometheus-k8s created
networkpolicy.networking.k8s.io/prometheus-k8s created
poddisruptionbudget.policy/prometheus-k8s created
prometheus.monitoring.coreos.com/k8s created
prometheusrule.monitoring.coreos.com/prometheus-k8s-prometheus-rules created
rolebinding.rbac.authorization.k8s.io/prometheus-k8s-config created
rolebinding.rbac.authorization.k8s.io/prometheus-k8s created
rolebinding.rbac.authorization.k8s.io/prometheus-k8s created
rolebinding.rbac.authorization.k8s.io/prometheus-k8s created
role.rbac.authorization.k8s.io/prometheus-k8s-config created
role.rbac.authorization.k8s.io/prometheus-k8s created
role.rbac.authorization.k8s.io/prometheus-k8s created
role.rbac.authorization.k8s.io/prometheus-k8s created
service/prometheus-k8s created
serviceaccount/prometheus-k8s created
servicemonitor.monitoring.coreos.com/prometheus-k8s created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
clusterrole.rbac.authorization.k8s.io/prometheus-adapter created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/prometheus-adapter created
clusterrolebinding.rbac.authorization.k8s.io/resource-metrics:system:auth-delegator created
clusterrole.rbac.authorization.k8s.io/resource-metrics-server-resources created
configmap/adapter-config created
deployment.apps/prometheus-adapter created
networkpolicy.networking.k8s.io/prometheus-adapter created
poddisruptionbudget.policy/prometheus-adapter created
rolebinding.rbac.authorization.k8s.io/resource-metrics-auth-reader created
service/prometheus-adapter created
serviceaccount/prometheus-adapter created
servicemonitor.monitoring.coreos.com/prometheus-adapter created
clusterrole.rbac.authorization.k8s.io/prometheus-operator created
clusterrolebinding.rbac.authorization.k8s.io/prometheus-operator created
deployment.apps/prometheus-operator created
networkpolicy.networking.k8s.io/prometheus-operator created
prometheusrule.monitoring.coreos.com/prometheus-operator-rules created
service/prometheus-operator created
serviceaccount/prometheus-operator created
servicemonitor.monitoring.coreos.com/prometheus-operator created
crd๋ฅผ ํ์ธํด๋ณธ๋ค.
์ค์น๋ svc๋ ํ์ธํด๋ณธ๋ค.
ํ๋๋ ํ๋ฒ ํ์ธํด๋ณธ๋ค.
๊ทธ๋ฆฌ๊ณ ํฌํธํฌ์๋ฉ ํด์ prometheus ์ ์ ์ํด๋ณด์
kubectl -n monitoring port-forward svc/prometheus-k8s 9090
3. 4 ํ๋ก๋ฉํ ์ฐ์ค ์คํผ๋ ์ดํฐ
Prometheus Operator์ ์ญํ ์ Service Discovery, ์ฆ, ๋์ ์ผ๋ก ๋ณํ๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๋ฅผ ์ฝ๊ฒ ํ์ํ๊ณ ๊ฒ์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
ํ๋ก๋ฉํ
์ฐ์ค์ ํ๊น์ Configํ์ผ์์ ๊ด๋ฆฌํ๋ค, ์ด๋ Configmap๋๋ ๋ณ๋ ํ์ผ๋ก ๊ด๋ฆฌํ๋๊ฒ์ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ค.
Prometheus Operator๋ฅผ ์ฌ์ฉํ๋ฉด Kubernetes ํด๋ฌ์คํฐ ๋ด์ ์๋น์ค๊ฐ ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋ ๋ ๋ณํ๋ฅผ ์๋์ผ๋ก ๊ฐ์งํ๊ณ Prometheus์ ํ๊น ๋ชฉ๋ก์ ์
๋ฐ์ดํธ ํ ์ ์๋ค.
Custom Resource Definitions (CRDs)๋ฅผ ํตํด ๋ชจ๋ํฐ๋ง ํ๋ ๋ฐฉ๋ฒ์ ์ ์ธ์ ์ผ๋ก ์ ์ํ๋๋ฐ, CRDs ์ค ํ๋๊ฐ ServiceMonitor์ด๋ค.
- ServiceMonitor: ํน์ ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค๋ฅผ ๋ชจ๋ํฐ๋ง ๋์์ผ๋ก ์ง์ ํ๊ณ , Prometheus๊ฐ ํด๋น ์๋น์ค์ ์๋ํฌ์ธํธ๋ฅผ ์ด๋ป๊ฒ ์คํฌ๋ํํ ์ง ์ธ๋ถ ์ฌํญ์ ์ ์ํ๋ค.
- PodMonitor: ServiceMonitor์ ์ ์ฌํ์ง๋ง, ์๋น์ค ๋์ ๊ฐ๋ณ ํ๋๋ฅผ ์ง์ ๋ชจ๋ํฐ๋ง ๋์์ผ๋ก ์ง์ ํ๋ค.
- PrometheusRule: ๊ฒฝ๊ณ ๊ท์น์ ์ ์ํ์ฌ Prometheus Alertmanager๊ฐ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
์๋์์ Node๋ฅผ ์ํ ServiceMonitor ์์๋ฅผ ํ์ธํ ์ ์๋ค.
# Node Exporter๋ฅผ ์ํ ์๋น์ค ๋ชจ๋ํฐ (์ํ)
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
app.kubernetes.io/component: exporter
app.kubernetes.io/name: node-exporter
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 1.7.0
name: node-exporter
namespace: monitoring
spec:
endpoints: # ๋ชจ๋ํฐ๋งํ ์๋ํฌ์ธํธ ๋ชฉ๋ก
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
interval: 15s
port: https
relabelings: # ํ๊ฒ์ ๋ผ๋ฒจ์ ์ฌ์ค์ ํ๋ ๊ท์น
- action: replace
regex: (.*)
replacement: $1
sourceLabels:
- __meta_kubernetes_pod_node_name
targetLabel: instance
scheme: https
tlsConfig:
insecureSkipVerify: true
jobLabel: app.kubernetes.io/name # ์์
(job) ์ด๋ฆ์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉํ๋ ๋ผ๋ฒจ
selector: # ๋ผ๋ฒจ ์
๋ ํฐ
matchLabels:
app.kubernetes.io/component: exporter
app.kubernetes.io/name: node-exporter
app.kubernetes.io/part-of: kube-prometheus
๋ ์ด๋ธ์ ๋ณ๊ฒฝ, ์ ๊ฑฐ ๋ฐ ๊ฐ์ ์ค์ด๊ธฐ๋ฑ์ ์์ ์ ํตํด ์๊ณ์ด ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ์ต์ ํ ํ ์ ์๋ค.
- relabel_configs:
- ๋ฉํธ๋ฆญ์ ์์งํ ํ ๋ ์ด๋ธ์ ๋ณ๊ฒฝํ๋ค.
- ์์ง๋ ๋ฉํธ๋ฆญ์ ์ฒ๋ฆฌํ๊ณ ํ์ํ์ง ์์ ๋ฉํธ๋ฆญ์ ์ ๊ฑฐํ๊ฑฐ๋ ๋ผ๋ฒจ์ ๋ณ๊ฒฝํ๋๋ฐ ์ฌ์ฉํ๋ค.
- metric_relabel_configs:
- ์์ง๋ ๋ฉํธ๋ฆญ์ ์ ์ฅํ๊ธฐ ์ ์ ๋ณํํ๊ฑฐ๋ ์ญ์ ํ๋ค.
- ์คํฌ๋ํํ ๋ฉํธ๋ฆญ์ ์ ํํ๊ฑฐ๋, ํ๊ฒ์ ์ฌ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
app.kubernetes.io/component: exporter
app.kubernetes.io/name: node-exporter
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 1.7.0
name: node-exporter
namespace: monitoring
spec:
endpoints:
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
interval: 15s
port: https
relabelings:
- action: replace
regex: (.*)
replacement: $1
sourceLabels:
- __meta_kubernetes_pod_node_name
targetLabel: instance
scheme: https
tlsConfig:
insecureSkipVerify: true
# ์ถ๊ฐ๋ relabel_configs ์์
relabel_configs:
- sourceLabels: [__address__] # ์๋ณธ๋ผ๋ฒจ
targetLabel: instance_address # ์ต์ข
๋ผ๋ฒจ
- targetLabel: __address__ # ์๋ณธ๋ผ๋ฒจ
replacement: 127.0.0.1:9090 # ๊ณ ์ ๋ผ๋ฒจ๋ก ์์
# ์ถ๊ฐ๋ metric_relabel_configs ์์
metric_relabel_configs:
- sourceLabels: [job]
regex: 'node-exporter'
action: drop
jobLabel: app.kubernetes.io/name
selector:
matchLabels:
app.kubernetes.io/component: exporter
app.kubernetes.io/name: node-exporter
app.kubernetes.io/part-of: kube-prometheus
3. 5 ํ๋ก๋ฉํ ์ฐ์ค ์คํ ์ค์ผ์ผ๋ง
3.5.1 ํ๋ก๋ฉํ ์ฐ์ค ์ด๋ํฐ
ํ๋ก๋ฉํ ์ฐ์ค ์ด๋ํฐ๋ Prometheus์์ ์์งํ ๋ฉํธ๋ฆญ์ ์ฌ์ฉํ์ฌ Kubernetes์ ์๋ ์ค์ผ์ผ๋ง ๊ธฐ๋ฅ(์: Horizontal Pod Autoscaler, HPA)๊ณผ ์ฐ๋ํ๋ ์ญํ ์ํ๋ค.
์ด ์ฑ ์์๋ ์์ธํ ์๊ฐํ์ง๋ง, ํ๋ก๋ฉํ ์ฐ์ค ์ด๋ํฐ๋ฅผ ๋ง์ด ์ฌ์ฉํ์ง๋ ์๊ณ ์ด ์ฑ ์์๋ KEDA๋ฅผ ์ฌ์ฉํ๋๋ก ์ถ์ฒํ๊ณ ์์ด ๊ฐ๋จํ๋ง ํ์ธํ๊ณ ๋์ด๊ฐ๋ค.
Prometheus Adapter์ ConfigMap์ ์ ์๋ ๋ฐ๋ก ๋์ํ๋ฉฐ, Prometheus Adapter Deployment์ ๋ง์ดํธ ๋๋ค.
์๋ ์ค์ ํ์ผ์์๋ ์ด๋ค Prometheus Metric์ ์ฌ์ฉํ ๊ฒ์ธ์ง, HPA์์ ์ด๋ป๊ฒ ์ฐธ์กฐํ๋์ง ๋ณผ ์์๋ค.
# http_requests_total ๋ฉํธ๋ฆญ์ ๋ํ 2๋ถ ๋์์ ๋น์จ(rate)์ ๊ณ์ฐํ์ฌ,
# http_requests_per_second๋ผ๋ ๋ฉํธ๋ฆญ ์ด๋ฆ์ผ๋ก ์ ๊ณต
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-adapter-config
namespace: custom-metrics
data:
config.yaml: |
rules:
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: "^(.*)$"
as: "http_requests_per_second"
metricsQuery: 'sum(rate(http_requests_total{namespace="my-ns",job="web-app"}[2m])) by (pod)'
---
# http_requests_per_second ๋ฉํธ๋ฆญ์ด 100์ ์ด๊ณผํ๋ ๊ฒฝ์ฐ
# Pod์๋ฅผ ๋๋ฆฌ๋๋ก ์ค์
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
namespace: my-ns
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: your_deployment_name
minReplicas: 1
maxReplicas: 10
metrics:
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 100
3.5.2 KEDA ์คํ ์ค์ผ์ผ
์์ ๊ฐ์ ์กฐ๊ฑด์ผ๋ก ๋์ํ๋ KEDA ScaledObject ์ ์ํ์ผ์ด๋ค.
๊ฐ์ ์กฐ๊ฑด์ธ๋ฐ, HPA๋ฅผ ๋ฐ๋ก ์ค์ ํ์ง ์๊ณ , ๋ฉํธ๋ฆญ ๋ณํ์ ์ํ ConfigMap์ค์ ๋ ์์ ํ์ง ์๊ณ , ScaledObject ํ๋๋ง ์์ฑํ๋ฉด ๋๋ ๋งค์ฐ ๊ฐ๋จํ๋ค.
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: prometheus-scaledobject
namespace: my-ns
spec:
scaleTargetRef: # ์ค์ผ์ผ๋งํ ๋์ ๋ฆฌ์์ค
name: your_deployment_name
pollingInterval: 30 # ํด๋ง ๊ฐ๊ฒฉ์ ์ด ๋จ์๋ก ์ค์ (๊ธฐ๋ณธ๊ฐ์ 30์ด)
cooldownPeriod: 300 # ์ค์ผ์ผ ๋ค์ด ์ ์ฟจ๋ค์ด ์๊ฐ์ ์ด ๋จ์๋ก ์ค์ (๊ธฐ๋ณธ๊ฐ์ 300์ด)
minReplicas: 1 # ์ต์ Replica ์
maxReplicas: 10 # ์ต๋ Replica ์
triggers: # ํธ๋ฆฌ๊ฑฐ ์กฐ๊ฑด ์ง์
- type: prometheus
metadata:
serverAddress: http://prometheus.monitoring
metricName: http_requests_per_second
threshold: '100'
query: |
sum(rate(http_requests_total{namespace="my-ns",job="web-app"}[2m])) by (pod)
3. 6 ํ๋ก๋ฉํ ์ฐ์ค ์๋
์ด ์ฑ ์์๋ Rule Manager, Alert manager ์ปดํฌ๋ํธ๊ฐ ๋ชจ๋ ๋ ๋ฆฝ์ ์ธ ์๋น์ค๋ก ์คํ๋๋๊ฒ์ฒ๋ผ ์ค๋ช ํ์ง๋ง, ์ต์ ๋ฒ์ (2.50)์์๋ Rule Manager์ ์ญํ ์ด ALERTING RULES ๊ธฐ๋ฅ์ผ๋ก ํ๋ก๋ฉํ ์ฐ์ค ์๋ฒ ๋ด๋ถ์ ๋ด์ ๋์ด์๋๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
- Prometheus์์ ๊ตฌ์ฑํ ์ ์๋ ๋๊ฐ์ง ์ ํ์ ๊ท์น
- recording_rules
- ๋ณต์กํ๊ฑฐ๋ ์์ฃผ ์ฌ์ฉ๋๋ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์๋ก์ด ์๊ณ์ด๋ก ์ ์ฅํ์ฌ, ์ดํ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ , ์ฟผ๋ฆฌ๋ฅผ ๋จ์ํํ๋ค.
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ์ง์์๋ต ์๊ฐ์ ๊ฐ์ ํ๋ค.
- alerting_rules
- ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ ๋ ์ธ๋ถ ์๋น์ค์ ๊ฒฝ๊ณ ์คํ์ ๋ํ ์๋ฆผ์ ๋ณด๋ผ ์ ์๋ค.
- Prometheus ์ฟผ๋ฆฌ ์ธ์ด(PromQL)๋ฅผ ์ฌ์ฉํ์ฌ ์ ์๋๋ฉฐ, ์กฐ๊ฑด์ด ์ฐธ์ด ๋๋ฉด ๊ฒฝ๊ณ ์ํ๊ฐ ๋์ด AlertManager๋ก ์ ์ก๋๋ค.
- ๊ฒฝ๊ณ ์กฐ๊ฑด์ ํ๊ฐ ์์ฒด๋ Prometheus์ ์ ์ฅ๋ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ง๋ง, "๊ฒฝ๊ณ ์ ์ํ"๋ "๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ๋ค๋ ์ฌ์ค"์ด Prometheus์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณ๋์ ์๊ณ์ด ๋ฐ์ดํฐ๋ก ์ ์ฅ๋์ง ์๋๋ค. - ์ฐธ๊ณ 1, ์ฐธ๊ณ 2
- Prometheus์์ ์๋ ์ด๋ ฅ(history)๋ฅผ ์ ์ฅํ๊ณ ์์ง ์๋๊ฒ ๊ฐ์๋ฐ ์ด ์ฑ ์์๋ ๋ณ๋์ ์๊ณ์ด ๋ฐ์ดํฐ๋ก ์ ์ฅํ๊ฒ์ผ๋ก ๋์์๋ค(163-164p). Grafana์์ ์๋์ ๋ฐ์์ํจ๊ฒฝ์ฐ Grafana์ RDB์ Alart์ด๋ ฅ์ด ์ ์ฅ๋์ด์์๋ค. (๋ง๋?)
- recording_rules
- Alert Manager
- Prometheus ์๋ฒ๋ ๊ฒฝ๊ณ ๊ท์น์ ๋ฐ๋ผ ๋ฐ์ํ ๊ฒฝ๊ณ ๋ฅผ Alertmanager์ ์ ์กํ๊ณ , Alertmanager๋ ์ด๋ฌํ ๊ฒฝ๊ณ ๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ต์ข ์ฌ์ฉ์์๊ฒ ์๋ฆฐ๋ค.
# Prometheus ์๋ ๊ท์น
# ํ๊ท ์์ฒญ ๋๊ธฐ ์๊ฐ์ด 5๋ถ๋์ 0.5์ด๋ณด๋ค ํฐ "HighRequestLatency"์๋ ์ ์
groups:
- name: HighRequestLatencyAbove0.5s
rules:
- alert: HighRequestLatency
expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
for: 10m
labels:
severity: 2
name: HighRequestLatencyAbove0.5s
annotations:
summary: High request latency
- name: HighRequestLatencyAbove1s
rules:
- alert: HighRequestLatency
expr: job:request_latency_seconds:mean5m{job="myjob"} > 1
for: 10m
labels:
severity: 1
name: HighRequestLatencyAbove1s
annotations:
summary: High request latency
# AlertManager ๋ผ์ฐํ
๊ท์น
route:
receiver: 'devops-team'
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
group_by: ['job', 'severity']
routes:
- match:
name: 'HighRequestLatencyAbove1s'
severity: '1'
receiver: 'devops-team'
receivers:
- name: 'devops-team'
email_configs:
- to: 'devops@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:25'
๋, ์ด์ ์ ์๋์ ์ค์ ํ๋ฉด์ Prometheus ์๋๊ณผ Grafana ์๋์ด ๋ญ๊ฐ ๋ค๋ฅธ๊ฑด์ง ๊ถ๊ธํ๋๋ฐ, ์ด ์ฑ ์์๋ ์ด ๋์ ์ฐจ์ด๊ฐ ์๊ณ ๋์ผํ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๊ณ ๋์ด์๋ค. (๊ทธ๋ผํ๋ ์๋ฒ๋ ํ๋ก๋ฉํ ์ฐ์ค์์ ๊ฐ๋ผ์ ธ์ ๋์ ๊ฐ๋ฐ๋ ์คํ์์ค์ด๋ฉฐ, ํ๋ก๋ฉํ ์ฐ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ๋ฐ ๋ ์๋ ๊ท์น์ ๊ทธ๋ผํ๋ ์๋ฒ์์๋ ๋์ผํ๊ฒ ์๋ํ๋ค.)
๊ณ ๋ คํด์ผํ ์ฌํญ
- ๋ก๊ทธ์ ๊ฒฝ์ฐ ๋ ์ฝ๋ฉ ๊ท์น์ ๊ฐ๋ฐํ๊ณ ๋ฉํธ๋ฆญ ํ์์ผ๋ก ์ ์ฌํ๊ณ ๊ท์น์ ๊ฐ๋ฐํ๋ค.
- ์ถ์ ์ ๊ฒฝ์ฐ์๋ ์ง์ ๋ ์ฝ๋ฉ ๊ท์น์ ๊ฐ๋ฐํ ์ ์์ผ๋ฏ๋ก, ์คํฌ ๋ฉํธ๋ฆญ์ ์ฌ์ฉํด์ ๋ฉํธ๋ฆญ(๋ฒํท)์ ์์ฑํ๊ณ ๊ท์น์ ๊ฐ๋ฐํ๋ค.
- ํ๋กํ์ผ์ ๋ ์ฝ๋ฉ ๊ท์น์ ๊ฐ๋ฐํ ์ ์์ผ๋ฉฐ, ํ๋กํ์ผ์ ๋ฉํธ๋ฆญ์ผ๋ก ๋ฐ์ถ(export)ํ๊ณ ๊ท์น์ ๊ฐ๋ฐํ๋ค.
- ์๋๊ณผ ํต์ง๋ ์ํ๋ฅผ ๊ฐ๋๋ค. ์๋์ ์์ฑํ๊ณ ํต์งํ๋ ๋ผ์ดํ์ฌ์ดํด์ ์ค๊ณํ๊ณ ์ํ๋ฅผ ๊ด๋ฆฌํด์ผํ๋ค.
์ฃผ์์ฌํญ
- ๋ค์ํ ๊ธฐ์ ์ธํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ถํ ๊ด๋ฆฌ๊ฐ ์ด๋ ต๊ธฐ๋๋ฌธ์ ์๋ฆผ ๊ท์น์ ํ๋ก๋ฉํ ์ฐ์ค๋ก ๋จ์ผํ ํ๋ค.
- ๊ฐ๊ธ์ ๋ฉํธ๋ฆญ์ผ๋ก๋ง ์๋์ ๊ด๋ฆฌํ๊ณ , ์คํ ์ดํธ ํ์๋ผ์ธ์ฐจํธ๋ก ์๊ฐํํ๋ค.
- SLO์งํ์ ์ฐ๊ณํ๋ค.
3. 7 ํ๋ก๋ฉํ ์ฐ์ค ์ค๋ฉ ์ํคํ ์ณ
ํ๋ก๋ฉํ ์ฐ์ค ๊ตฌ์ฑ์ ์ํ ๊ธฐ๋ณธ์ ์ธ ๊ฐ์ด๋๋ผ์ธ์ ๋์ ์นด๋๋๋ฆฌํฐ ๋ฉํธ๋ฆญ ์์ฑ(label userid)์ ํผํ๋๊ฒ (์ฐธ๊ณ : ์นด๋๋๋ฆฌํฐ ์ค์ด๊ธฐ ๋ธ๋ก๊ทธ)๊ทธ๋ฆฌ๊ณ ์ค๋ฉ์ ๊ตฌ์ฑํ๋๊ฒ์ด๋ค.
Prometheus๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋จ์ผ ์ธ์คํด์ค๋ก ์ด์๋๋ฉฐ ๋ก์ปฌ๋์คํฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
์ด๋ ๋๊ท๋ชจ ํ๊ฒฝ์์๋ ํ๊ณ๊ฐ ์๋ค. ์ด๋ ํ์ํ๊ฒ์ด ์ค๋ฉ๊ณผ ํ๋๋ ์ด์
์ด๋ค.
3.7.1 ์ค๋ฉ ์ํคํ ์ณ
์ค๋ฉ์ด๋, ์คํฌ๋ํ ํ๊น ๋ชฉ๋ก์ 2๊ฐ ์ด์์ ํ๋ก๋ฉํ
์ฐ์ค๋ก ๋ถํ ํ๋๊ฒ์ ๋ปํ๋ฉฐ,
๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ์์ง์ค๋ฉ, ์ํ ์ค๋ฉ ๋๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
- ์์ง์ค๋ฉ:
- ํ๋ก๋ฉํ ์ฐ์ค ์๋ฒ๋ฅผ ์ฌ๋ฌ๊ฐ๋ฅผ ์ด์ํ๋ฉฐ, ํน์ ๊ธฐ์ค(์: ์กฐ์ง๋ณ, ํ๋ณ)์ ๋ฐ๋ผ ์๋ฒ๋ฅผ ๋ถํ ํ๋ค.
- ๊ฐ ์๋ฒ๋ ๋ ๋ฆฝ์ ์ผ๋ก ํน์ ๋ฉํธ๋ฆญ์ ์์งํ๊ณ ๊ด๋ฆฌํ๋ค.
- ์ํ์ค๋ฉ: (์ดํด๋ชปํจ)
- ์ค๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฉํธ๋ฆญ์ ์์งํ๋ค.
- ํ๋์ ํ๋ก๋ฉํ ์ฐ์ค ์๋ฒ๊ฐ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ๊ฐ๋๊ฒ์ ์๋ฏธํ๋ค.
3.7.2 ํ๋๋ ์ด์ ์ํคํ ์ณ
ํ๋๋ ์ด์ ์ด๋, ์ฌ๋ฌ Prometheus ์๋ฒ๋ค ์ฌ์ด์์ ๋ฉํธ๋ฆญ์ ์ง๊ณํ๊ณ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค.
- ๊ณ์ธต์ ํ๋๋ ์ด์
- ์์ ํ๋ก๋ฉํ ์ฐ์ค ์๋ฒ ์๋์ ์ฌ๋ฌ ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์กด์ฌํ๋ ์ํคํ ์ณ์ด๋ค.
- ํ์ ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์์งํ๋ ๋ฉํธ๋ฆญ์ ์์ ํ๋ก๋ฉํ ์ฐ์ค์์ ๋ค์ ์คํฌ๋ฉํ์ฌ ์ ์ฒด์ ์ธ ๋ด์ฉ์ ์์๋ ๋ฒจ์์ ์ทจํฉํ์ฌ ๋ชจ๋ํฐ๋งํ ์ ์๊ฒ ๋๋ค.
- ๋์ผ ๋ ๋ฒจ ํ๋๋ ์ด์
(๊ต์ฐจ์๋น์ค)
- ํ ํ๋ก๋ฉํ ์ฐ์ค ์๋ฒ์์ ๋ค๋ฅธ ํ๋์ ํ๋ก๋ฉํ ์ฐ์ค ์๋น์ค๋ฅผ ์คํฌ๋ฉ ํ๋๋ก ๊ตฌ์ฑํ๋ค.
- ๋จ์ผ์๋ฒ์์ ๋ ๋ฐ์ดํฐ์ ์ ๋ํ ์ฟผ๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ง๋ค.
์์์ ์ค๋ช
ํ ์ค๋ฉ๊ณผ ํ๋๋ ์ด์
๊ธฐ์ ์ ์ฌ์ฉํ์ฌ Prometheus ํด๋ฌ์คํฐ๋ง ๊ตฌ์ฑ์ ๊ตฌํํ๊ฒ์ด ๋ฐ๋ก Thanos, Mimir์ด๋ค.
Prometheus์ ํ์ฅ์ฑ๊ณผ ์ฅ๊ธฐ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๊ณ ๊ฐ์ฉ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ก ์ค๊ณ๋์ด์์ผ๋ฉฐ ๋ฐ๋ก ๋ค์์ Thanos, ๊ทธ๋ฆฌ๊ณ ์๋ง๋ 4์ฅ์์ Mimir๋ฅผ ์ธ๊ธํ๊ฒ ๋๋ค.
3. 8 ํ๋ ธ์ค ์ด์
3.8.1 ํ๋ ธ์ค ์ด์
๋จ์ผ Prometheus๋ ๊ณ์ ๋ฐ๋ณตํด์ ๋งํ์ง๋ง, ํ์ฅ์ฑ(์ํํ์ฅ ๋ถ๊ฐ)๊ณผ ์ฅ๊ธฐ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๊ณ ๊ฐ์ฉ์ฑ ๋ฌธ์ ๊ฐ ์กด์ฌํ๋ค.
์ด๋ฐ ๋ฌธ์ ๋ Thanos๋ฅผ ๋์
ํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์๋ค.
- Thanos ์ฅ์ (=์ปดํฌ๋ํธ)
- ๊ธ๋ก๋ฒ ๋ทฐ์ฌ๋ฌ Prometheus์๋ฒ์์ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ์ธ์คํด์ค์์ ์ฟผ๋ฆฌํ ์ ์๋ค. (Thanos Querier)
- ๋ค์ด์ํ๋ง: ๋ค์ด์ํ๋ง์ ์๋์ผ๋ก ์์ฑํ์ฌ ์ค๋๊ธฐ๊ฐ์ ๊ฑธ์น ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ๋๊ฒ์ด ๊ฐ๋ฅํ๋ค. (Thanos compactor)
- ๊ท์น: ํ๋ก๋ฉํ ์ฐ์ค ์ค๋์ ๋ฉํธ๋ฆญ์ ํผํฉํ๋ ๊ธ๋ก๋ฒ ์๋ ๊ท์น๊ณผ ๋ ์ฝ๋ฉ ๊ท์น์ ์์ฑํ ์ ์๋ค. (Thanos Ruler)
- ์ฅ๊ธฐ๋ณด๊ด: ๊ฐ์ฒด ์คํ ๋ฆฌ์ง๋ฅผ ํ์ฉํด ์คํ ๋ฆฌ์ง์ ๋ด๊ตฌ์ฑ, ์ ๋ขฐ์ฑ, ํ์ฅ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. (Thanos StoreGateway)
Thanos๋ ์ฌ์ด๋์นด ํน์ ๋ฆฌ์๋ฒ ๋ฐฉ์ ์ด ๋๊ฐ์ง ์ ํ์ผ๋ก ์ด์๋ ์ ์์ผ๋ฉฐ ,์๋์์ ์์๋ณด๋๋ก ํ๋ค.
์ถ๊ฐ์ ์ผ๋ก ์ด ๋ธ๋ก๊ทธ์ ๊ธ์ด ์ฌ์ด๋ํค ๋ฐฉ์๊ณผ ๋ฆฌ์๋ฒ ๋ฐฉ์์ ์ฐจ์ด์ ์ ์ ์ค๋ช
ํด์ค๊ฒ ๊ฐ๋ค.
3.8.2 ํ๋ ธ์ค ์ฌ์ด๋์นด ๋ฐฉ์
Thanos Sidecar ๋ฐฉ์์ ์ฌ๋ฌ Prometheus ์๋ฒ์ Thanos์ฌ์ด๋์นด ์ปจํ ์ด๋๋ฅผ ํจ๊ป ์ด์ํ๋ ์ํคํ ์ณ๋ฅผ ๋งํ๋ค.
โโโโโโโโโโโโโโฌโโโโโโโโโโ โโโโโโโโโโโโโโฌโโโโโโโโโโ โโโโโโโโโโโ
โ Prometheus โ Sidecar โ ... โ Prometheus โ Sidecar โ โ Rule โ
โโโโโโโโโโโโโโดโโโโโฌโโโโโ โโโโโโโโโโโโโโดโโโโโฌโโโโโ โโฌโโโโโโโโโ
โ โ โ
Blocks Blocks Blocks
โ โ โ
v v v
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Object Storage โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# https://thanos.io/tip/thanos/design.md/
์ฑ
์์ ๋์ค๋ ์๊ฒฉ์ฝ๊ธฐ์ ๋ํด ์ดํดํ์ง ๋ชปํ๋ค.
์ฌ์ด๋์นด๋ฐฉ์์ ์๊ฒฉ์ฝ๊ธฐ, ๋ฆฌ์๋ฒ ๋ฐฉ์์ ์๊ฒฉ์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
- ์ฐ๊ธฐ:
- ํ๋ ธ์ค ์ฌ์ด๋์นด๋ ํ๋ก๋ฉํ ์ฐ์ค ์ธ์คํด์ค์ ์ฐ๊ณํด์ ๋ฉํธ๋ฆญ์ ์์ง์ ์ฒ๋ฆฌํ๊ณ , ์ ์ฌ๋ TSDB๋ธ๋ก์ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง๋ก ์ ๋ฌํ๋ค.
- ์ฐ๊ธฐ์ ํต์ฌ ์ปดํฌ๋ํธ๋ ์ฌ์ด๋์นด์ด๋ค.
- ์ฌ์ด๋์นด๋ Prometheus์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์์ ์ฝ์ผ๋ฏ๋ก TSDB์ ์ถ๊ฐ ๋ก์ปฌ ์คํ ๋ฆฌ์ง(PV)๊ฐ ํ์ํ์ง ์๋ค.
- ๊ธฐ๋ก ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง๋ฅผ ํตํด ๋ด๊ตฌ์ฑ ์๊ณ ์ฟผ๋ฆฌ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด์ง๋ ๋์ 2์๊ฐ๋ง๋ค ์ ๋ก๋๋๋ฏ๋ก Prometheus ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ TSDB ๋ณด์กด ์๊ฐ์ด ๋จ์ถ๋๋ค.
- ์ฝ๊ธฐ:
-
- ํ๋ ธ์ค ์คํ ์ด๋ ์คํ ์ด API๋ฅผ ์ด์ฉํด ๋ธ๋ก์ ๊ฒ์ํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ํ๋ ธ์ค ์ฟผ๋ฆฌ์ ๋ฐํํ๋ค.
- ์ฝ๊ธฐ์ ํต์ฌ์ ํ๋ ธ์ค ์คํ ์ด์ ์ฌ์ด๋์นด ์ด๋ค.
- ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์๋ ํ๋ ธ์ค ์คํ ์ด์ ์ฌ์ด๋์นด ์์ชฝ์ผ๋ก ์กฐํ๋ฅผ ์์ฒญํ๋ค. ์ฌ์ด๋์นด๋ ๋ธ๋ก์์ฑ ์ด์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋๋ฐ ์ฌ์ฉํ๊ณ , ํ๋ ธ์ค์คํ ์ด๋ ๋ธ๋ก ์์ฑ ์ดํ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์๋๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋๋ฐ ์ฌ์ฉํ๋ค.
3.8.3 ํ๋ ธ์ค ๋ฆฌ์๋ฒ ๋ฐฉ์
์ฐ๊ธฐ๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ๋ณ๋์ Receiver๊ฐ ์กด์ฌํ๋ ์ํคํ ์ณ ์ด๋ค.
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโ
โ Prometheus โ ... โ Prometheus โ โ Rule โ
โโโโโโโโโฌโโโโโโ โโโโโโโโโฌโโโโโโ โโโโโฌโโโโโโ
v v v
โโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ
โ Thanos โ โ Thanos โ โ Thanos โ
โ Receiver โ โ Receiver โ โ Receiver โ
โโโโโโโโโฌโโโโโโโโโ โโโโโโโโโโโโฌโโโโโโ โโโโโโโโโโโฌโโโโโโโ
โโโโโโโโโโโโโฌโโโโโโโโโโโโ โ
โ โ
v v
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Object Storage โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- ์ฐ๊ธฐ
- ์์ ์ฌ์ด๋์นด ๋ฐฉ์์์ Prometheus TSDB๋ธ๋ก์ด ๋ฐ๋ก ObjectStorage์ ์ฐ์๋ค๋ฉด,
๋ฆฌ์๋ฒ ๋ฐฉ์์ Prometheus์์ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ Reciver์๊ฒ ๋ณด๋ด๊ณ , TSDB๋ธ๋ก์ Reciver์ ์ํด์ ์ค๋ธ์ ํธ ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋๋ค. - Reciver StatefulSet์ด ๋ฐฐํฌ๋์ด์ผ ํ๋ค. (+PV)
- ์์ ์ฌ์ด๋์นด ๋ฐฉ์์์ Prometheus TSDB๋ธ๋ก์ด ๋ฐ๋ก ObjectStorage์ ์ฐ์๋ค๋ฉด,
- ์ฝ๊ธฐ
- ์ ํํ ๋ถ๋ถ์ ๋ด์ฉ์ด ์์ง๋ง, ์ํคํ ์ณ๋ ๋ค๋ฅธ ๋ฌธ์๋ฅผ ํ์ธํด๋ดค์๋ ๋์ ๋ฐฉ์์ ๊ฑฐ์ ์ฌ์ด๋์นด์ ๋น์ทํ๊ฒ ๊ฐ๋ค.
- ๋ค๋ง, ๋ฉ๋ชจ๋ฆฌ์ ์๋ ์ต๊ทผ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ์์น๊ฐ Thanos Reciver๊ฐ ๋๋ค.
3.8.4 ํ๋ ธ์ค ๊ตฌ์ฑ
Step.1 minio ์คํ ๋ฆฌ์ง ๊ตฌ์ฑ
์คํ ๋ฆฌ์ง๋ก ์ฌ์ฉํ minio๋ฅผ ๋ค์ด๋ฐ๊ณ ์คํ์ํจ๋ค.
# ์ฐธ๊ณ : https://min.io/download#/macos
# ์๋ฒ ๋ค์ด๋ก๋
curl --progress-bar -O https://dl.min.io/server/minio/release/darwin-arm64/minio
# minio๊ฐ ์ฌ์ฉํ ๋๋ ํ ๋ฆฌ ์์ฑ
mkdir minio-dir
# minio ์คํ
chmod +x minio
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server ./minio-dir --console-address ":9001"
์ด๋ ๊ฒ ์คํ์ํค๋ฉด ๋ก์ปฌ์์ ๋ธ๋ผ์ฐ์ ๋ก ์ ์ํ ์ ์๋ค. (http://127.0.0.1:9001)
์ฌ์ฉํ ๋ฒํท์ ํ๋ ๋ง๋ค์ด์ค๋ค.
Step.2 Prometheus ์คํ
๋จผ์ , ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ๋ฉํธ๋ฆญ์ ๊ฐ์ ธ๊ฐ์ผ ํ๊ธฐ๋๋ฌธ์, ๊ฐ์ฅ ๊ฐ๋จํ node-exporter๋ฅผ ์ค์นํ์ฌ ์์งํ ์์๋ ๋ฉํธ๋ฆญ์ ๋ง๋ค์ด์ฃผ์
brew install node_exporter
brew services start node_exporter
# ์คํ ํ ํ์ธ ๋ฐฉ๋ฒ curl http://localhost:9100/metrics
# ํ
์คํธ ์ข
๋ฃ ํ brew services stop node_exporter && brew uninstall node_exporter ๋ช
๋ น์ด๋ก ์ญ์
์ด์ ํ๋ก๋ฉํ
์ฐ์ค๋ฅผ ์คํํด๋ณด์.
์์์ ๋ง๋ค์ด๋์ node_exporter์ ๋ฉํธ๋ฆญ์ ์์งํ๋๋ก ํ๋ค.
# ๋ฐ์ด๋๋ฆฌ ๋ค์ด๋ก๋
wget https://github.com/prometheus/prometheus/releases/download/v2.50.1/prometheus-2.50.1.darwin-arm64.tar.gz
# ์์ถํด์
tar zxvf prometheus-2.50.1.darwin-arm64.tar.gz
# ํ๋ก๋ฉํ
์ฐ์ค๋ฅผ ์ํ ๋๋ ํ ๋ฆฌ ์์ฑ
mkdir prometheus-tsdb
# prometheus.ymlํ์ผ์ thanos๋ฅผ ์ํ ๋ผ๋ฒจ ์ค์ ์ถ๊ฐ
cd prometheus-2.50.1.darwin-arm64
vi prometheus.yml
----------------------------------------
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: "test-cluster"
environment: "local-test"
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: "local-node-exporter"
static_configs:
- targets: ['localhost:9100']
----------------------------------------
# ์คํ
./prometheus --config.file=prometheus.yml \
--storage.tsdb.path=../prometheus-tsdb \
--storage.tsdb.min-block-duration=2h \
--storage.tsdb.max-block-duration=2h
์ฌ๊ธฐ๊น์ง ์ ์คํ๋์๋ค๋ฉด http://0.0.0.0:9090/์ ์ ์ํ ์ ์๋ค.
์ ์ ํ node_memory_inactive_bytes ๋ฑ node_exporter์์ ์์ง๋ ๋ฉํธ๋ฆญ๋ ํ์ธํ ์ ์๋ค.
Step.3 Thanos ๋ฐ์ด๋๋ฆฌ ํ์ผ ๋ค์ด๋ก๋ ๋ฐ ๋น๋
ํ๋
ธ์ค ๊ตฌ์ฑ์ ์ํด https://github.com/thanos-io/thanos/releases ์์ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๋น๋ํ์..
mac m1์ ์ฌ์ฉํ๋๋ฐ, ๋ฐ์ด๋๋ฆฌ ์คํ์ด ์๋์ ๋น๋ ํ๋ค......... ๐ญ๐ญ๐ญ๐ญ๐ญ
# ๋ค์ด๋ก๋ ๋ฐ ์ค์น
# go 1.21 ์ด์ ์ค์น๋์ด์์ด์ผ ํจ
wget https://github.com/thanos-io/thanos/archive/refs/tags/v0.34.1.tar.gz
tar zxvf v0.34.1.tar.gz
cd thanos-0.34.1
go mod tidy
make build
# ๋น๋๊ฐ ์๋ฃ๋๋ฉด ๋ฐ์ด๋๋ฆฌ ํ์ผ์ด ์์ฑ๋๋๋ฐ, ์ด ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผํ๋ฏ๋ก ์์น๋ฅผ ์ ํ์ธํด์ผํจ
Step.4 Thanos sidecar ์คํ
./thanos sidecar \
--prometheus.url=http://localhost:9090 \
--grpc-address=localhost:10901 \
--http-address=localhost:10902 \
--tsdb.path ./prometheus-tsdb \ # ํ๋ก๋ฉํ
์ฐ์ค์ TSDB๊ฒฝ๋ก
--objstore.config-file=./bucket.yml
Step.5 Thanos store ์คํ
Thanos Store๋ฅผ ์คํ์ํจ๋ค.
# ๋ฒํท ์ค์
cat <<EOF > bucket.yml
type: S3
config:
bucket: bucket
access_key: admin
secret_key: password
endpoint: 127.0.0.1:9000
insecure: true
EOF
# store ์์ ๋๋ ํ ๋ฆฌ ์์ฑ
mkdir thanos-store
# ์คํ
./thanos store \
--data-dir=./thanos-store \
--objstore.config-file=./bucket.yml \
--http-address=localhost:10906 \
--grpc-address=localhost:10905
Step.6 Thanos query ์คํ ๋ฐ ๋์ ํ์ธ
./thanos query \
--http-address=0.0.0.0:29090 \
--grpc-address=localhost:10903 \
--store=localhost:10901 \
--query.replica-label prometheus-1
์ฌ๊ธฐ๊น์ง ์คํํ๋ค๋ฉด http://localhost:29090/ ์ฌ๊ธฐ๋ก ์ ์ํด๋ณด์.
thanos UI๊ฐ ์คํ๋๋ค.
์ ์์ ์ผ๋ก ์คํ ๋์๋ค๋ฉด, ์๊น prometheus UI์์ ๊ฒ์ํ๋๊ฒ ๊ทธ๋๋ก ์ฌ๊ธฐ์์๋ ์ฟผ๋ฆฌํ ์ ์์ด์ผ ํ๋ค.