Skip to content

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 部署都遵循相同的基本結構:

  1. Deployment(單副本): 執行 Exporter 容器,透過環境變數或啟動參數指定目標系統的連線資訊
  2. ClusterIP Service: 暴露 Exporter 的 metrics 埠,僅限叢集內部存取(通常由 Prometheus 抓取)
  3. Secret(視需要): 存放連線目標系統所需的密碼或憑證

Prometheus 透過 Service Discovery 或靜態設定,以 http://<service-name>.<namespace>.svc.cluster.local:<port>/metrics 的格式抓取指標。

MySQL Exporter

MySQL Exporter(prom/mysqld-exporter)用於監控 MySQL 資料庫的運行狀態,包括連線數、查詢效能、複寫延遲等指標。

前置作業: 需在 MySQL 伺服器上建立專用的 Exporter 帳號,授予 PROCESSREPLICATION CLIENTSELECT 權限,並限制最大連線數(建議 3 條)與來源網段。

密碼管理: 透過 Kubernetes Secret 存放密碼,Exporter Pod 以 secretKeyRef 方式注入環境變數 MYSQLD_EXPORTER_PASSWORD

關鍵參數:

  • --mysqld.address:指定 MySQL 主機與埠號
  • --mysqld.username:指定連線帳號
  • Metrics 埠號:9104

健康檢查: 設定 livenessProbereadinessProbe9104 埠進行 HTTP GET 檢查,確保 Exporter 正常運作。

預設啟用的 Collector(global_statusglobal_variablesslave_status)已涵蓋一般監控需求,無需額外指定。

Squid Exporter

Squid Exporter(boynux/squid-exporter)用於監控 Squid Proxy(Kubernetes 部署) 的運行狀態,包括請求數、命中率、流量等指標。

連線方式: Exporter 透過 Squid 的 Cache Manager 介面採集指標,因此 Squid 設定中必須為 Exporter 所在網段開放 Cache Manager 存取權限。

環境變數設定:

  • SQUID_HOSTNAME:Squid 主機 IP
  • SQUID_PORT:Squid 服務埠號(注意此處連接的是 Squid Service 的 3129 埠)
  • SQUID_EXPORTER_LISTEN:Exporter 自身監聽位址(:9301

資源配置: CPU 100m / Memory 128Mi,屬於輕量級元件。

模式比較

面向MySQL ExporterSquid Exporter
映像prom/mysqld-exporterboynux/squid-exporter
Metrics 埠91049301
連線方式直連 MySQL(TCP 3306)透過 Cache Manager 介面
認證方式Secret → 環境變數無需認證(靠 Squid ACL 控制)
健康檢查有(liveness + readiness)未設定(建議補上)

關鍵要點

  • Exporter 部署遵循「Deployment + ClusterIP Service」的標準模式,部署在 monitoring namespace
  • 密碼等敏感資訊一律透過 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 Namespacemonitoring

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 monitoring

Kubernetes 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: 2

Squid Exporter

環境參數

項目
Exporter 映像boynux/squid-exporter:latest
Exporter 監聽埠9301
Squid 主機 IP10.30.196.60
Squid 埠號3129
Namespacemonitoring
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: 9301

Prometheus 抓取位址

http://squid-exporter-service.monitoring.svc.cluster.local:9301/metrics

相關概念

來源