antony@notes:~/rancher$ cat "Grafana-Reporter-部署指南Harvester-Rancher-環境.md"
Grafana Reporter 部署指南(Harvester / 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-systemnamespace 內,透過 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-system3-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
- 進入目標 Dashboard
- 點右上角 齒輪圖示(Dashboard Settings)
- 點左側 Links 頁籤
- 點 + New link,填入以下設定:
| 欄位 | 值 |
|---|---|
| Type | link |
| Title | reports |
| URL | 見下方 |
| Icon | doc |
| 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}- 點 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/healthRancher Proxy 回傳 404
確認 Service 已正確建立:
kubectl get svc -n cattle-monitoring-system grafana-reporterRancher 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。