以下是一個可用于生產環境的 Kubernetes 部署 Grafana 的 YAML 文件。該配置包括 Deployment、Service、ConfigMap 和 PersistentVolumeClaim,確保 Grafana 的高可用性和數據持久化。
Grafana 生產部署 YAML 文件
☆實操示例
cat grafana-deployment.yaml
---
# Grafana Deployment
apiVersion: apps/v1
kind: Deployment
metadata:name: grafananamespace: monitoringlabels:app: grafana
spec:replicas: 2 # 副本數量,生產環境可根據需求調整selector:matchLabels:app: grafanatemplate:metadata:labels:app: grafanaspec:containers:- name: grafanaimage: harbor.fq.com/prometheus/grafana:9.5.3 # 建議使用固定版本,如 grafana/grafana:9.5.2ports:- containerPort: 3000 # Grafana 默認運行端口env:- name: GF_SECURITY_ADMIN_USERvalue: "admin" # 管理員用戶名,生產環境建議修改- name: GF_SECURITY_ADMIN_PASSWORDvalue: "Abc123!" # 管理員密碼,生產環境建議使用更強的密碼- name: GF_INSTALL_PLUGINSvalue: "grafana-clock-panel,grafana-piechart-panel" # 需要安裝的 Grafana 插件readinessProbe:httpGet:path: /api/health # 就緒探針,檢測 Grafana 是否健康port: 3000initialDelaySeconds: 10 # 等待 10 秒后開始探測periodSeconds: 10 # 每 10 秒進行一次探測livenessProbe:httpGet:path: /api/health # 存活探針,檢測 Grafana 是否正常運行port: 3000initialDelaySeconds: 30 # 等待 30 秒后開始探測periodSeconds: 60 # 每 60 秒進行一次探測volumeMounts:- name: grafana-storagemountPath: /var/lib/grafana # 掛載存儲目錄,存放 Grafana 數據- name: grafana-configmountPath: /etc/grafana/grafana.ini # 掛載配置文件subPath: grafana.ini # 只映射 configMap 中的 grafana.ini 文件volumes:- name: grafana-storageemptyDir: {} # 使用 emptyDir,不持久化存儲數據,Pod 重啟后數據會丟失- name: grafana-configconfigMap:name: grafana-config # 關聯 ConfigMap,提供 Grafana 配置文件
---
# Grafana 配置文件 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:name: grafana-confignamespace: monitoring
data:grafana.ini: |[server]http_port = 3000 # Grafana 監聽端口root_url = %(protocol)s://%(domain)s:%(http_port)s/[database]type = sqlite3 # 默認使用 SQLite 數據庫path = /var/lib/grafana/grafana.db # 數據庫存放路徑[security]admin_user = admin # 管理員用戶名admin_password = Abc123! # 管理員密碼[users]default_theme = light # 默認 UI 主題(light / dark)[auth.anonymous]enabled = true # 允許匿名訪問(默認 Viewer 權限)org_name = Main Org.org_role = Viewer
---
# Grafana Service (NodePort 方式暴露)
apiVersion: v1
kind: Service
metadata:name: grafananamespace: monitoringlabels:app: grafana
spec:type: NodePort # 使用 NodePort 方式暴露 Grafanaports:- port: 3000 # Service 端口targetPort: 3000 # Grafana 容器內部端口protocol: TCPnodePort: 32000 # 指定 NodePort 端口,范圍 30000-32767selector:app: grafana # 關聯到 app=grafana 的 Pod
---
# Grafana Deployment
apiVersion: apps/v1
kind: Deployment
metadata:name: grafananamespace: monitoringlabels:app: grafana
spec:replicas: 2 # 根據需求調整副本數selector:matchLabels:app: grafanatemplate:metadata:labels:app: grafanaspec:containers:- name: grafanaimage: grafana/grafana:latest # 建議使用固定版本,如 grafana/grafana:9.5.2ports:- containerPort: 3000env:- name: GF_SECURITY_ADMIN_USERvalue: "admin" # 生產環境建議使用更安全的用戶名- name: GF_SECURITY_ADMIN_PASSWORDvalue: "StrongPassword123!" # 生產環境建議使用強密碼- name: GF_INSTALL_PLUGINSvalue: "grafana-clock-panel,grafana-piechart-panel" # 可選:安裝插件readinessProbe:httpGet:path: /api/healthport: 3000initialDelaySeconds: 10periodSeconds: 10livenessProbe:httpGet:path: /api/healthport: 3000initialDelaySeconds: 30periodSeconds: 60volumeMounts:- name: grafana-storagemountPath: /var/lib/grafana- name: grafana-configmountPath: /etc/grafana/grafana.inisubPath: grafana.inivolumes:- name: grafana-storagepersistentVolumeClaim:claimName: grafana-pvc- name: grafana-configconfigMap:name: grafana-config
---
# Grafana ConfigMap (配置文件)
apiVersion: v1
kind: ConfigMap
metadata:name: grafana-confignamespace: monitoring
data:grafana.ini: |[server]http_port = 3000root_url = %(protocol)s://%(domain)s:%(http_port)s/[database]type = sqlite3path = /var/lib/grafana/grafana.db[security]admin_user = adminadmin_password = StrongPassword123![users]default_theme = light[auth.anonymous]enabled = trueorg_name = Main Org.org_role = Viewer
---
# Grafana PersistentVolumeClaim (數據持久化)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: grafana-pvcnamespace: monitoring
spec:accessModes:- ReadWriteOnceresources:requests:storage: 10Gi # 根據需求調整存儲大小storageClassName: standard # 根據集群的 StorageClass 調整
---
# Grafana Service (暴露服務)
apiVersion: v1
kind: Service
metadata:name: grafananamespace: monitoringlabels:app: grafana
spec:type: ClusterIP # 生產環境建議使用 ClusterIP,配合 Ingress 暴露服務ports:- port: 3000targetPort: 3000protocol: TCPselector:app: grafana
---
# Grafana Ingress (可選,用于外部訪問)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: grafana-ingressnamespace: monitoringannotations:nginx.ingress.kubernetes.io/ssl-redirect: "true"nginx.ingress.kubernetes.io/force-ssl-redirect: "true"cert-manager.io/cluster-issuer: "letsencrypt-prod" # 使用 cert-manager 自動管理 TLS 證書
spec:tls:- hosts:- grafana.example.com # 替換為你的域名secretName: grafana-tlsrules:- host: grafana.example.com # 替換為你的域名http:paths:- path: /pathType: Prefixbackend:service:name: grafanaport:number: 3000
關鍵配置說明
-
Deployment:
- 使用
replicas: 2
確保高可用性。 - 通過環境變量設置管理員用戶名和密碼。
- 配置了
readinessProbe
和livenessProbe
以確保 Grafana 的健康狀態。 - 掛載了持久化存儲卷 (
PersistentVolumeClaim
) 和配置文件 (ConfigMap
)。
- 使用
-
ConfigMap:
- 包含
grafana.ini
配置文件,用于自定義 Grafana 的行為。 - 配置了匿名訪問、數據庫路徑等。
- 包含
-
PersistentVolumeClaim:
- 使用持久化存儲確保 Grafana 的數據(如儀表盤、用戶配置)不會丟失。
- 可以根據需求調整存儲大小和
StorageClass
。
-
Service:
- 使用
ClusterIP
類型,僅在集群內部暴露服務。 - 如果需要外部訪問,可以通過
Ingress
暴露。
- 使用
-
Ingress(可選):
- 使用
Ingress
和cert-manager
自動管理 TLS 證書。 - 配置了 HTTPS 強制跳轉以提高安全性。
- 使用
部署步驟
-
將上述 YAML 文件保存為
grafana-deployment.yaml
。 -
使用
kubectl
部署 Grafana:kubectl apply -f grafana-deployment.yaml
-
檢查部署狀態:
kubectl get pods -n monitoring kubectl get svc -n monitoring kubectl get ingress -n monitoring
-
訪問 Grafana:
-
如果使用了
Ingress
,可以通過https://grafana.example.com
訪問。 -
如果未使用
Ingress
,可以通過kubectl port-forward
臨時訪問:kubectl port-forward svc/grafana -n monitoring 3000:3000
然后訪問
http://localhost:3000
。
-
生產環境建議
-
使用固定版本的鏡像:
- 避免使用
latest
標簽,改為固定版本(如grafana/grafana:9.5.2
)。
- 避免使用
-
啟用身份驗證:
- 配置 OAuth、LDAP 或 SAML 集成,避免使用默認的管理員賬號。
-
備份數據:
- 定期備份 Grafana 的持久化數據(如
/var/lib/grafana
)。
- 定期備份 Grafana 的持久化數據(如
-
監控 Grafana:
- 使用 Prometheus 監控 Grafana 的性能和健康狀態。
希望這個配置能幫助你順利部署 Grafana!如果有其他問題,請隨時告訴我。