Skip to content

antony@notes:~/rancher$ cat "Grafana-Reporter-部署指南Harvester-Rancher-環境.md"

Grafana Reporter 部署指南(Harvester / Rancher 環境)

2026-03-11· rancher

Grafana Reporter 部署指南(Harvester / Rancher 環境)

概述

本文件說明如何在 Harvester(Rancher 管理)環境中部署 IzakMarais/reporter,讓 Grafana Dashboard 能一鍵產生 PDF 報表,並透過 Rancher Proxy 對外存取。

架構說明

瀏覽器
  │
  ▼
Rancher API Proxy(https://hvx.kubeantony.com/api/v1/namespaces/...)
  │
  ├──► grafana-reporter(:8686)──► Grafana(:80)──► Prometheus
  │
  └──► grafana-image-renderer(:8081)◄── Grafana(render 請求)
  • Grafana Reporter:接收使用者請求,透過 Grafana API 取得 Dashboard 資料與面板圖片,產生 PDF。
  • Grafana Image Renderer:Grafana 的圖片渲染服務,將面板渲染為 PNG 圖片供 Reporter 使用。
  • 所有元件都部署在 cattle-monitoring-system namespace 內,透過 K8s 內部 Service 互連。

前置確認

# 確認 Grafana Service 名稱
kubectl get svc -n cattle-monitoring-system | grep grafana

記下 Grafana 的 Service 名稱(通常為 rancher-monitoring-grafana),後續設定會用到。


步驟一:部署 Grafana Reporter

建立 grafana-reporter.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana-reporter
  namespace: cattle-monitoring-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana-reporter
  template:
    metadata:
      labels:
        app: grafana-reporter
    spec:
      containers:
      - name: grafana-reporter
        image: izakmarais/grafana-reporter:latest
        command: ["/usr/local/bin/grafana-reporter"]
        args:
          - "-ip"
          - "rancher-monitoring-grafana.cattle-monitoring-system.svc:80"
        ports:
        - containerPort: 8686
---
apiVersion: v1
kind: Service
metadata:
  name: grafana-reporter
  namespace: cattle-monitoring-system
spec:
  selector:
    app: grafana-reporter
  ports:
  - name: http
    port: 8686
    targetPort: 8686
    protocol: TCP
  type: ClusterIP

部署:

kubectl apply -f grafana-reporter.yaml

驗證:

# 確認 Pod 狀態為 Running
kubectl get pods -n cattle-monitoring-system | grep reporter

# 確認 log 顯示正確連線 Grafana
kubectl logs -n cattle-monitoring-system -l app=grafana-reporter

預期 log 輸出:

serving at ':8686' and using grafana at 'http://rancher-monitoring-grafana.cattle-monitoring-system.svc:80'

步驟二:部署 Grafana Image Renderer

Rancher Monitoring Chart 的 imageRenderer.enabled 有已知 template bug,因此採用手動獨立部署

建立 image-renderer.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana-image-renderer
  namespace: cattle-monitoring-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana-image-renderer
  template:
    metadata:
      labels:
        app: grafana-image-renderer
    spec:
      containers:
      - name: image-renderer
        image: grafana/grafana-image-renderer:latest
        ports:
        - containerPort: 8081
        env:
        - name: ENABLE_METRICS
          value: "true"
---
apiVersion: v1
kind: Service
metadata:
  name: grafana-image-renderer
  namespace: cattle-monitoring-system
spec:
  selector:
    app: grafana-image-renderer
  ports:
  - port: 8081
    targetPort: 8081
  type: ClusterIP

部署:

kubectl apply -f image-renderer.yaml

驗證:

kubectl get pods -n cattle-monitoring-system | grep image-renderer

步驟三:設定 Grafana 連線 Image Renderer

重點: 僅設定環境變數不夠,必須修改 grafana.ini 設定檔,Grafana 才會識別 renderer。

3-1. 編輯 Grafana ConfigMap

kubectl edit configmap rancher-monitoring-grafana -n cattle-monitoring-system

grafana.ini 最末尾加入 [rendering] 區塊:

    [rendering]
    server_url = http://grafana-image-renderer.cattle-monitoring-system.svc:8081/render
    callback_url = http://rancher-monitoring-grafana.cattle-monitoring-system.svc:80/

完整的 grafana.ini 範例:

    [analytics]
    check_for_updates = true
    [auth]
    disable_login_form = false
    [auth.anonymous]
    enabled = true
    org_role = Viewer
    [auth.basic]
    enabled = false
    [dashboards]
    default_home_dashboard_path = /tmp/dashboards/rancher-default-home.json
    [grafana_net]
    url = https://grafana.net
    [log]
    mode = console
    [paths]
    data = /var/lib/grafana/
    logs = /var/log/grafana
    plugins = /var/lib/grafana/plugins
    provisioning = /etc/grafana/provisioning
    [security]
    allow_embedding = true
    [server]
    domain = ''
    [users]
    auto_assign_org_role = Viewer
    [rendering]
    server_url = http://grafana-image-renderer.cattle-monitoring-system.svc:8081/render
    callback_url = http://rancher-monitoring-grafana.cattle-monitoring-system.svc:80/

3-2. 重啟 Grafana

kubectl rollout restart deployment rancher-monitoring-grafana -n cattle-monitoring-system

3-3. 驗證 Renderer 連線

# 從 Grafana Pod 測試連線 renderer
kubectl exec -n cattle-monitoring-system \
  $(kubectl get pods -n cattle-monitoring-system -l app.kubernetes.io/name=grafana \
    -o jsonpath='{.items[0].metadata.name}') \
  -- curl -s http://grafana-image-renderer.cattle-monitoring-system.svc:8081/

預期回應:

Grafana Image Renderer (Go)

也可以在 Grafana UI 中驗證:Administration → Plugins → 搜尋 “Image Renderer”,應顯示為 remote rendering service。


步驟四:測試 Rancher Proxy 存取 Reporter

在瀏覽器中打開以下 URL(將 <DASHBOARD_UID> 替換為實際的 Dashboard UID):

https://hvx.kubeantony.com/api/v1/namespaces/cattle-monitoring-system/services/http:grafana-reporter:8686/proxy/api/v5/report/<DASHBOARD_UID>

如果能下載 PDF 且包含圖表,代表全部設定正確。


步驟五:設定 Grafana Dashboard Link

  1. 進入目標 Dashboard
  2. 點右上角 齒輪圖示(Dashboard Settings)
  3. 點左側 Links 頁籤
  4. + New link,填入以下設定:
欄位
Typelink
Titlereports
URL見下方
Icondoc
Open in new tab✅ 打勾

URL 設定:

https://hvx.kubeantony.com/api/v1/namespaces/cattle-monitoring-system/services/http:grafana-reporter:8686/proxy/api/v5/report/${__dashboard.uid}?from=${__from}&to=${__to}

如果 Dashboard 有使用變數(如 datasource、instance),可以加上:

https://hvx.kubeantony.com/api/v1/namespaces/cattle-monitoring-system/services/http:grafana-reporter:8686/proxy/api/v5/report/${__dashboard.uid}?from=${__from}&to=${__to}&var-datasource=${datasource}&var-instance=${instance}
  1. Save dashboard

設定完成後,Dashboard 右上方會出現 reports 連結,點擊即可在新分頁下載 PDF 報表。


疑難排解

PDF 產生但沒有圖表

# 檢查 Grafana log 是否有 renderer 錯誤
kubectl logs -n cattle-monitoring-system \
  $(kubectl get pods -n cattle-monitoring-system -l app.kubernetes.io/name=grafana \
    -o jsonpath='{.items[0].metadata.name}') \
  -c grafana --tail=50 | grep rendering

如果看到 no image renderer found/installed,代表 grafana.ini[rendering] 設定未生效,請重新確認 ConfigMap 並重啟 Grafana。

Reporter 無法連線 Grafana

# 確認 Grafana Service 存在且可連線
kubectl exec -n cattle-monitoring-system \
  $(kubectl get pods -n cattle-monitoring-system -l app=grafana-reporter \
    -o jsonpath='{.items[0].metadata.name}') \
  -- wget -qO- http://rancher-monitoring-grafana.cattle-monitoring-system.svc:80/api/health

Rancher Proxy 回傳 404

確認 Service 已正確建立:

kubectl get svc -n cattle-monitoring-system grafana-reporter

Rancher Proxy URL 格式必須完全正確:

https://<rancher域名>/api/v1/namespaces/<namespace>/services/http:<service名稱>:<port>/proxy/

注意事項

  • 透過 kubectl edit 修改的 ConfigMap 和 Deployment,在下次 Rancher Monitoring Helm Chart 升級時可能被覆蓋。升級後需重新確認 [rendering] 設定是否仍存在。
  • Image Renderer 和 Reporter 是獨立部署的,不受 Helm Chart 升級影響。
  • 如果未來 Rancher 修復了 image-renderer-deployment.yaml 的 template bug,可以改回透過 Helm values 啟用 grafana.imageRenderer.enabled: true,屆時可移除手動部署的 image-renderer。