Appearance
Prometheus Exporter 部署模式
在 Kubernetes 中部署 Prometheus Exporter 的通用模式:以 MySQL Exporter 與 Squid Exporter 為例,說明 Deployment + ClusterIP Service 的標準做法。
概述
Prometheus Exporter 是一類專門將第三方系統的指標轉換為 Prometheus 格式的輕量級代理程式。在 Kubernetes 環境中,Exporter 通常以獨立的 Deployment 部署在 monitoring namespace,搭配 ClusterIP Service 讓 Prometheus 能在叢集內部抓取指標。
這種模式的核心思路是:Exporter 作為「翻譯層」,連線至目標系統(如資料庫、代理伺服器),讀取其內部狀態,再以 /metrics 端點輸出標準化的 Prometheus 指標。本文以 MySQL Exporter 與 Squid Exporter 兩個實例,歸納出可複用的部署模式。
核心內容
通用部署架構
所有 Exporter 的 Kubernetes 部署都遵循相同的基本結構:
- Deployment(單副本): 執行 Exporter 容器,透過環境變數或啟動參數指定目標系統的連線資訊
- ClusterIP Service: 暴露 Exporter 的 metrics 埠,僅限叢集內部存取(通常由 Prometheus 抓取)
- Secret(視需要): 存放連線目標系統所需的密碼或憑證
Prometheus 透過 Service Discovery 或靜態設定,以 http://<service-name>.<namespace>.svc.cluster.local:<port>/metrics 的格式抓取指標。
MySQL Exporter
MySQL Exporter(prom/mysqld-exporter)用於監控 MySQL 資料庫的運行狀態,包括連線數、查詢效能、複寫延遲等指標。
前置作業: 需在 MySQL 伺服器上建立專用的 Exporter 帳號,授予 PROCESS、REPLICATION CLIENT、SELECT 權限,並限制最大連線數(建議 3 條)與來源網段。
密碼管理: 透過 Kubernetes Secret 存放密碼,Exporter Pod 以 secretKeyRef 方式注入環境變數 MYSQLD_EXPORTER_PASSWORD。
關鍵參數:
--mysqld.address:指定 MySQL 主機與埠號--mysqld.username:指定連線帳號- Metrics 埠號:
9104
健康檢查: 設定 livenessProbe 與 readinessProbe 對 9104 埠進行 HTTP GET 檢查,確保 Exporter 正常運作。
預設啟用的 Collector(global_status、global_variables、slave_status)已涵蓋一般監控需求,無需額外指定。
Squid Exporter
Squid Exporter(boynux/squid-exporter)用於監控 Squid Proxy(Kubernetes 部署) 的運行狀態,包括請求數、命中率、流量等指標。
連線方式: Exporter 透過 Squid 的 Cache Manager 介面採集指標,因此 Squid 設定中必須為 Exporter 所在網段開放 Cache Manager 存取權限。
環境變數設定:
SQUID_HOSTNAME:Squid 主機 IPSQUID_PORT:Squid 服務埠號(注意此處連接的是 Squid Service 的3129埠)SQUID_EXPORTER_LISTEN:Exporter 自身監聽位址(:9301)
資源配置: CPU 100m / Memory 128Mi,屬於輕量級元件。
模式比較
| 面向 | MySQL Exporter | Squid Exporter |
|---|---|---|
| 映像 | prom/mysqld-exporter | boynux/squid-exporter |
| Metrics 埠 | 9104 | 9301 |
| 連線方式 | 直連 MySQL(TCP 3306) | 透過 Cache Manager 介面 |
| 認證方式 | Secret → 環境變數 | 無需認證(靠 Squid ACL 控制) |
| 健康檢查 | 有(liveness + readiness) | 未設定(建議補上) |
關鍵要點
- Exporter 部署遵循「Deployment + ClusterIP Service」的標準模式,部署在
monitoringnamespace - 密碼等敏感資訊一律透過 Kubernetes Secret 管理,避免寫死在 Deployment YAML 中
- 目標系統端需預先開放 Exporter 的存取權限(MySQL 帳號授權 / Squid ACL 白名單)
- Exporter 是輕量級元件,資源需求低,但建議設定健康檢查以確保可靠性
- Metrics 埠號因 Exporter 而異,Prometheus 設定中需正確對應
實際應用
在建置 Kubernetes 監控體系時,Prometheus + Exporter 是最常見的組合。透過為不同基礎設施元件部署對應的 Exporter,可以建立統一的指標採集管線,再搭配 Grafana 進行視覺化與告警。新增監控目標時,只需按照本文歸納的模式,替換映像與連線參數即可。
部署設定參考
以下為實際部署時使用的完整設定,供日後查詢與複製使用。
MySQL Exporter
環境參數
| 項目 | 值 |
|---|---|
| MySQL 主機 | 10.30.196.60:3306 |
| Exporter 帳號 | exporter |
| Exporter 密碼 | JRG63t8t |
| 允許連線網段 | 10.30.196.% |
| Exporter 映像 | prom/mysqld-exporter:latest |
| Metrics 埠號 | 9104 |
| K8s Namespace | monitoring |
MySQL 帳號建立 SQL
sql
CREATE USER 'exporter'@'10.30.196.%' IDENTIFIED BY 'JRG63t8t' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'10.30.196.%';Kubernetes Secret
bash
kubectl create secret generic mysqld-exporter-secret \
--from-literal=MYSQLD_EXPORTER_PASSWORD='JRG63t8t' \
-n monitoringKubernetes YAML(Service + Deployment)
yaml
apiVersion: v1
kind: Service
metadata:
name: mysqld-exporter
namespace: monitoring
labels:
app.kubernetes.io/name: mysqld-exporter
spec:
selector:
app.kubernetes.io/name: mysqld-exporter
ports:
- name: metrics
port: 9104
targetPort: 9104
protocol: TCP
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysqld-exporter
namespace: monitoring
labels:
app.kubernetes.io/name: mysqld-exporter
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: mysqld-exporter
template:
metadata:
labels:
app.kubernetes.io/name: mysqld-exporter
spec:
containers:
- name: mysqld-exporter
image: prom/mysqld-exporter:latest
args:
- "--mysqld.address=10.30.196.60:3306"
- "--mysqld.username=exporter"
env:
- name: MYSQLD_EXPORTER_PASSWORD
valueFrom:
secretKeyRef:
name: mysqld-exporter-secret
key: MYSQLD_EXPORTER_PASSWORD
ports:
- name: metrics
containerPort: 9104
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 9104
initialDelaySeconds: 10
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /
port: 9104
initialDelaySeconds: 5
timeoutSeconds: 2Squid Exporter
環境參數
| 項目 | 值 |
|---|---|
| Exporter 映像 | boynux/squid-exporter:latest |
| Exporter 監聽埠 | 9301 |
| Squid 主機 IP | 10.30.196.60 |
| Squid 埠號 | 3129 |
| Namespace | monitoring |
| Service 類型 | ClusterIP |
Kubernetes YAML(Deployment + Service)
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: squid-exporter
namespace: monitoring
labels:
app: squid-exporter
spec:
replicas: 1
selector:
matchLabels:
app: squid-exporter
template:
metadata:
labels:
app: squid-exporter
spec:
containers:
- name: squid-exporter
image: boynux/squid-exporter:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9301
env:
- name: SQUID_HOSTNAME
value: "10.30.196.60"
- name: SQUID_PORT
value: "3129"
- name: SQUID_EXPORTER_LISTEN
value: ":9301"
resources:
requests:
cpu: 100m
memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
name: squid-exporter-service
namespace: monitoring
labels:
app: squid-exporter
spec:
type: ClusterIP
selector:
app: squid-exporter
ports:
- name: metrics
protocol: TCP
port: 9301
targetPort: 9301Prometheus 抓取位址
http://squid-exporter-service.monitoring.svc.cluster.local:9301/metrics相關概念
- MySQL Exporter 部署 — MySQL 專用 Exporter 的完整部署 SOP(本文以此為示範案例)
- Squid Proxy(Kubernetes 部署) — Squid Exporter 的監控目標,需在 ACL 中開放 Cache Manager 存取
- MongoDB Helm 部署 — MongoDB 也可透過類似模式部署 Exporter 進行監控
- MariaDB Helm 部署(Kubernetes) — 可搭配 MySQL/MariaDB Exporter 監控資料庫指標
- PgBouncer 連線池(Kubernetes 部署) — 可搭配 pgbouncer_exporter 監控連線池狀態
- Caddy 靜態檔案伺服器 — 內建 metrics 端點,無需額外 Exporter 即可被 Prometheus 直接抓取
- Shadowsocks Sidecar 代理 — 可考慮部署自訂 metrics 端點進行監控
- M365 MCP Server(Kubernetes 部署) — 同樣採用 Deployment + ClusterIP Service 的 K8s 部署模式
- Postgres Exporter 部署 — PostgreSQL 專用 Exporter,使用 Helm Chart 部署
- Redis Exporter 部署 — Redis 專用 Exporter,使用 Helm Chart 部署
- RabbitMQ Exporter 部署 — RabbitMQ 專用 Exporter,透過 Management API 採集指標
- Prometheus StatsD Exporter 部署 — 接收應用推送指標的特殊 Exporter,支援 Sidecar 模式
- Prometheus on Kubernetes 部署 — 完整的 Prometheus 伺服器部署設定,含所有 Exporter 的 scrape job 配置
- Node Exporter(VM 系統層監控) — 非 K8s 環境的 VM 系統層 Exporter,systemd 部署方式
- Grafana on Kubernetes 部署 — 視覺化 Exporter 採集指標的前端儀表板
- Kubernetes RBAC 帳號管理 — Exporter 存取資料庫等受保護資源時所需的 RBAC 授權
- MariaDB 遷移(Bitnami Galera → 官方 StatefulSet) — 遷移完成後可為新 MariaDB 部署 MySQL Exporter 實現監控