Kubernetes 环境下如何使用 Helm chart 部署高可用 Grafana?

文章导读
在 Kubernetes 上用 Helm 部署高可用 Grafana,核心不仅是多副本,更是外部数据库配合共享存储与安全配置。
📋 目录
  1. 1. 安全准备:管理数据库密码
  2. 2. 核心配置:values.yaml 关键参数
  3. 3. 部署与升级
  4. 4. 验证高可用生效
  5. 5. 常见坑与数据迁移
  6. 参考来源
A A

在 Kubernetes 上用 Helm 部署高可用 Grafana,核心不仅是多副本,更是外部数据库配合共享存储与安全配置。

先说结论:官方 Helm Chart 支持高可用,但必须配合外部数据库才能实现真正的读写分离和状态共享,且需规避密码明文风险。

  • 适合:生产环境监控大盘,要求服务不中断
  • 先准备:独立的 PostgreSQL 或 MySQL 实例,Kubernetes Secret 管理凭证
  • 验收:Pod 分散在不同节点,重启后会话不丢失,配置变更同步生效

1. 安全准备:管理数据库密码

避免将数据库密码明文写入 values.yaml。使用 Kubernetes Secret 管理敏感信息。

kubectl create secret generic grafana-db-secret \
  `--from-literal`="user=grafana" \
  `--from-literal`="password=YourStrongPassword" \
  -n monitoring

2. 核心配置:values.yaml 关键参数

重点配置副本数、反亲和性、外部数据库引用及持久化存储。

replicas: 2

# 高可用调度:确保 Pod 分散在不同节点
affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchLabels:
            app.kubernetes.io/name: grafana
        topologyKey: kubernetes.io/hostname

# 数据库配置:引用 Secret (避免明文)
grafana.ini:
  database:
    type: mysql
    host: mysql-host:3306
    name: grafana
    user: grafana
    # 建议使用 existingSecret 引用 Kubernetes Secret
    existingSecret: grafana-db-secret
    existingSecretPasswordKey: password

# 持久化存储:需支持多节点读写
persistence:
  enabled: true
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client  # 根据实际环境修改
  size: 10Gi

注意:若使用文件型 Provisioning(如 dashboards 配置),存储类必须支持 ReadWriteMany (RWX),否则多副本无法共享文件。若全部配置存入数据库,可放宽此要求。

3. 部署与升级

helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm upgrade `--install` grafana grafana/grafana -f values.yaml -n monitoring

4. 验证高可用生效

1. 检查 Pod 分布:

kubectl get pods -l app.kubernetes.io/name=grafana -o wide -n monitoring

确认 Pod 运行在不同的 NODE 上。

2. 检查会话保持:

登录 Grafana 页面,修改一个 Dashboard。删除其中一个 Pod,等待重建后刷新页面,确认修改保留且无需重新登录。

Kubernetes 环境下如何使用 Helm chart 部署高可用 Grafana?

3. 检查日志:

kubectl logs -l app.kubernetes.io/name=grafana -n monitoring | grep -i error

5. 常见坑与数据迁移

1. 数据迁移风险:

从 SQLite 迁移到 MySQL/PostgreSQL 没有官方一键工具。生产环境建议新建数据库实例,重新配置数据源。若必须迁移,需停止旧服务,导出 SQLite 数据并导入新库,再切换 Helm 配置。

2. 会话丢失:

确保 grafana.ini 中配置了统一的 session_provider 且后端存储共享(如数据库),否则切换节点后可能需要重新登录。

3. 存储类不匹配:

若集群默认 StorageClass 不支持 RWX,需显式指定支持共享读写的存储类(如 NFS、CephFS),否则 Pod 可能无法启动或挂载失败。

参考来源

  • Grafana Helm Charts 仓库:https://github.com/grafana/helm-charts
  • Grafana 高可用配置文档:https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#high-availability