6 · Mimir 部署細節 — Kubernetes
namespace: mimir · helm: mimir-distributed · ring: memberlist gossip :7946
元件
gateway (nginx)
所有 Mimir 流量的單一入口 Service。把寫入與讀取路徑導到正確的內部 Services,用戶端只需一個端點。
- Deployment ×2,位於 ClusterIP/Ingress 之後
- /api/v1/push → distributor Service
- /prometheus/* → query-frontend Service
- 可在邊界強制驗證並注入 X-Scope-OrgID
| protocol | in :80/:443 · out :8080 internal Services |
distributor (K8s)
無狀態 Deployment — 最容易自動擴展的元件。依寫入吞吐量配置。
- Deployment,3 個以上副本 · 依 CPU HPA
- 無卷、無身分 — 隨時可殺
- PodDisruptionBudget:節點排空時維持多數存活
| protocol | Service: mimir-distributor:8080 |
ingester (K8s)
有狀態的核心。zone-aware StatefulSets — 每個可用區一個 — 讓 RF=3 在每個 zone 各放一份,zone 故障不丟資料。
- 3 個 StatefulSets:ingester-zone-a/b/c · pod anti-affinity
- 每個 pod 一個 PVC 放 WAL + head blocks(快速 SSD class)
- 擴容:沒問題。縮容:需要小心的 ring「leaving」+ flush
- 一次滾動一個 zone(rollout-operator)
| protocol | Service: mimir-ingester:9095 (gRPC) |
| tenancy | 每 tenant 記憶體上限(max series) |
query-frontend (K8s)
讀取路徑前端的無狀態 Deployment;搭配 query-scheduler,讓 queriers 主動拉工作而非被推。
- Deployment ×2 · 位於 mimir-query-frontend Service 之後
- 結果快取 → memcached-results
| protocol | Service: mimir-query-frontend:8080 |
query-scheduler (K8s)
可選但建議:把佇列從 query-frontends 解耦,讓兩者獨立擴展。
- Deployment ×2
- 每 tenant 公平排程;queriers 連上來拉工作
| protocol | gRPC :9095 |
querier (K8s)
無狀態的 PromQL 工作者。讀取密集的叢集要自動擴展的就是它。
- Deployment · 依 scheduler 佇列深度或 CPU HPA
- 無卷;儀表板負載下數秒內從 2 擴到 20
| protocol | pulls from query-scheduler |
store-gateway (K8s)
與 ingesters 一樣是 zone-aware StatefulSets — blocks 跨 zone 分片 + 複製,確保查詢可用性。
- 每 zone 一個 StatefulSet · PVC 快取延遲載入的 index headers
- 重啟成本尚可但會重新同步 block index → PVC 讓它保持暖機
| protocol | gRPC :9095 · reads mimir-blocks bucket |
compactor (K8s)
單例式 StatefulSet,配一個暫存 PVC 用來下載與合併 blocks。不在查詢或寫入路徑上 — 可安全重啟。
- StatefulSet ×1(大規模時可依 tenant 分片)
- PVC 暫存空間 ≈ 最大 tenant 的 block 集合
- 落後 → 查詢變慢(太多小 blocks)
| protocol | reads/writes mimir-blocks bucket |
ruler (K8s)
評估 rule groups 的 Deployment,透過 ring 在副本間分片。
- Deployment ×2 · rules 依 tenant 存在物件儲存
- 遠端評估模式:把 PromQL 送到 query-frontend
| protocol | notify → alertmanager :8080 |
alertmanager (K8s)
Mimir 的多租戶 Alertmanager:StatefulSet ×3 加 gossip 複製,silences 與通知狀態在 pod 遺失後仍存活。
- StatefulSet ×3 · PVC 放 silences + nflog
- 每 tenant 的 Alertmanager 設定存在 bucket
| protocol | :8080 UI/API · gossip :9094 |
| tenancy | 每 tenant 隔離的設定與路由 |
memcached 快取
四個獨立的快取池,一個熱快取不會擠掉另一個的項目。讀取延遲最大的單一改善。
- chunks-cache:原始 chunk 資料(最大,GB 級)
- index-cache:block index 查找
- results-cache:整個 PromQL 回應(query-frontend)
- metadata-cache:bucket 列表 + block metas
| protocol | memcached :11211 · one StatefulSet each |
hash ring · memberlist
元件如何找到彼此並分工:每個 pod 透過 memberlist gossip ring 成員資訊 — 不需要營運 etcd 或 Consul。
- 所有 ring 成員之間在 :7946 gossip
- Distributors 用它為每個 series 挑 3 個 ingesters(zone-aware)
- Store-gateways/compactors/rulers 用同一機制分片 blocks + rules
- Pod 掛掉 → ring 經 gossip 察覺 → 流量重新路由
| protocol | memberlist gossip :7946 |