- 以下是一个可用于生产环境的 Kubernetes 部署 Grafana 的 YAML 文件。该配置包括 Deployment、Service、ConfigMap 和 PersistentVolumeClaim,确保 Grafana 的高可用性和数据持久化。
Grafana 生产部署 YAML 文件
☆实操示例
cat grafana-deployment.yaml
---
# Grafana Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
namespace: monitoring
labels:
app: grafana
spec:
replicas: 2 # 副本数量,生产环境可根据需求调整
selector:
matchLabels:
app: grafana
template:
metadata:
labels:
app: grafana
spec:
containers:
- name: grafana
image: harbor.fq.com/prometheus/grafana:9.5.3 # 建议使用固定版本,如 grafana/grafana:9.5.2
ports:
- containerPort: 3000 # Grafana 默认运行端口
env:
- name: GF_SECURITY_ADMIN_USER
value: "admin" # 管理员用户名,生产环境建议修改
- name: GF_SECURITY_ADMIN_PASSWORD
value: "Abc123!" # 管理员密码,生产环境建议使用更强的密码
- name: GF_INSTALL_PLUGINS
value: "grafana-clock-panel,grafana-piechart-panel" # 需要安装的 Grafana 插件
readinessProbe:
httpGet:
path: /api/health # 就绪探针,检测 Grafana 是否健康
port: 3000
initialDelaySeconds: 10 # 等待 10 秒后开始探测
periodSeconds: 10 # 每 10 秒进行一次探测
livenessProbe:
httpGet:
path: /api/health # 存活探针,检测 Grafana 是否正常运行
port: 3000
initialDelaySeconds: 30 # 等待 30 秒后开始探测
periodSeconds: 60 # 每 60 秒进行一次探测
volumeMounts:
- name: grafana-storage
mountPath: /var/lib/grafana # 挂载存储目录,存放 Grafana 数据
- name: grafana-config
mountPath: /etc/grafana/grafana.ini # 挂载配置文件
subPath: grafana.ini # 只映射 configMap 中的 grafana.ini 文件
volumes:
- name: grafana-storage
emptyDir: {} # 使用 emptyDir,不持久化存储数据,Pod 重启后数据会丢失
- name: grafana-config
configMap:
name: grafana-config # 关联 ConfigMap,提供 Grafana 配置文件
---
# Grafana 配置文件 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: grafana-config
namespace: 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: grafana
namespace: monitoring
labels:
app: grafana
spec:
type: NodePort # 使用 NodePort 方式暴露 Grafana
ports:
- port: 3000 # Service 端口
targetPort: 3000 # Grafana 容器内部端口
protocol: TCP
nodePort: 32000 # 指定 NodePort 端口,范围 30000-32767
selector:
app: grafana # 关联到 app=grafana 的 Pod
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
---
# Grafana Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
namespace: monitoring
labels:
app: grafana
spec:
replicas: 2 # 根据需求调整副本数
selector:
matchLabels:
app: grafana
template:
metadata:
labels:
app: grafana
spec:
containers:
- name: grafana
image: grafana/grafana:latest # 建议使用固定版本,如 grafana/grafana:9.5.2
ports:
- containerPort: 3000
env:
- name: GF_SECURITY_ADMIN_USER
value: "admin" # 生产环境建议使用更安全的用户名
- name: GF_SECURITY_ADMIN_PASSWORD
value: "StrongPassword123!" # 生产环境建议使用强密码
- name: GF_INSTALL_PLUGINS
value: "grafana-clock-panel,grafana-piechart-panel" # 可选:安装插件
readinessProbe:
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 10
periodSeconds: 10
livenessProbe:
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 30
periodSeconds: 60
volumeMounts:
- name: grafana-storage
mountPath: /var/lib/grafana
- name: grafana-config
mountPath: /etc/grafana/grafana.ini
subPath: grafana.ini
volumes:
- name: grafana-storage
persistentVolumeClaim:
claimName: grafana-pvc
- name: grafana-config
configMap:
name: grafana-config
---
# Grafana ConfigMap (配置文件)
apiVersion: v1
kind: ConfigMap
metadata:
name: grafana-config
namespace: monitoring
data:
grafana.ini: |
[server]
http_port = 3000
root_url = %(protocol)s://%(domain)s:%(http_port)s/
[database]
type = sqlite3
path = /var/lib/grafana/grafana.db
[security]
admin_user = admin
admin_password = StrongPassword123!
[users]
default_theme = light
[auth.anonymous]
enabled = true
org_name = Main Org.
org_role = Viewer
---
# Grafana PersistentVolumeClaim (数据持久化)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana-pvc
namespace: monitoring
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi # 根据需求调整存储大小
storageClassName: standard # 根据集群的 StorageClass 调整
---
# Grafana Service (暴露服务)
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: monitoring
labels:
app: grafana
spec:
type: ClusterIP # 生产环境建议使用 ClusterIP,配合 Ingress 暴露服务
ports:
- port: 3000
targetPort: 3000
protocol: TCP
selector:
app: grafana
---
# Grafana Ingress (可选,用于外部访问)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana-ingress
namespace: monitoring
annotations:
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-tls
rules:
- host: grafana.example.com # 替换为你的域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: grafana
port:
number: 3000
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
关键配置说明
- 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:
- 检查部署状态:
- 访问 Grafana:
- 如果使用了
Ingress,可以通过https://grafana.example.com访问。 - 如果未使用
Ingress,可以通过kubectl port-forward临时访问:
然后访问 http://localhost:3000。
生产环境建议
- 使用固定版本的镜像:
- 避免使用
latest标签,改为固定版本(如grafana/grafana:9.5.2)。
- 启用身份验证:
- 配置 OAuth、LDAP 或 SAML 集成,避免使用默认的管理员账号。
- 备份数据:
- 定期备份 Grafana 的持久化数据(如
/var/lib/grafana)。
- 监控 Grafana:
- 使用 Prometheus 监控 Grafana 的性能和健康状态。


所有评论(0)