前置条件
一个可用的集群、kubectl 与 Helm 3。Grafana 官方在 GitHub 仓库 grafana/helm-charts 中维护 Chart,以下命令基于该仓库。
三十秒装一个
helm repo add grafana https://grafana.com/charts/
helm repo update
helm search repo grafana/grafana # 确认 chart 版本与 appVersion 对应关系
helm install grafana grafana/grafana \
--namespace monitoring --create-namespace \
-f values.yaml
提示:
helm search repo输出的APP VERSION才是会被部署的 Grafana 版本;Chart 版本与 Grafana 版本是两条独立的版本号,升级前先看清对应关系,见升级与回滚。
values.yaml 关键项
adminUser: admin
adminPassword: ChangeMe-Str0ng
persistence:
enabled: true
size: 10Gi
storageClassName: standard
ingress:
enabled: true
ingressClassName: nginx
hosts:
- grafana.example.com
sidecar:
datasources:
enabled: true
dashboards:
enabled: true
resources:
requests:
cpu: 100m
memory: 128Mi
| 配置项 | 作用 | 生产建议 |
|---|---|---|
adminUser / adminPassword |
初始管理员 | 改用 existingSecret 引用 Secret,别把明文写进 values |
persistence |
为数据目录建 PVC | 单机 SQLite 方案,见下节 |
ingress |
域名暴露 | 配合证书签发做 HTTPS |
sidecar |
自动发现带标签的 ConfigMap 作为数据源/仪表盘 | 强烈推荐,替代手点界面 |
resources |
资源请求与上限 | 按压测设置,避免查询高峰被驱逐 |
持久化怎么选
Chart 默认用内置 SQLite 加 PVC,适合试点。生产规模请换外部 PostgreSQL 或 MySQL:数据库交给专门的托管或 Operator,values.yaml 里通过环境变量指向它,例如:
envFromSecret: grafana-db-secret
env:
GF_DATABASE_TYPE: postgres
GF_DATABASE_HOST: pg-primary.database.svc.cluster.local:5432
GF_DATABASE_NAME: grafana
变量命名规则见环境变量覆盖配置。
Service 与 Ingress
- 集群内访问:Service 名称
grafana,端口80转发到容器的3000。 - 对外访问:优先 Ingress;云环境也可用
service.type: LoadBalancer。 - 走了域名就必须对齐
root_url,否则登录跳转与静态资源会出错,可在ingress.host之外用GF_SERVER_ROOT_URL显式设置。
生产建议清单
- 数据源与仪表盘全部走声明式:sidecar 加 ConfigMap,或 GitOps 工具统一管理,理念见Provisioning:配置即代码。
- 保留探针默认指向
/api/health,数据库故障时让集群感知,见日志、诊断与服务器管理。 - 需要多副本时,必须使用外部数据库;SQLite 不支持多实例共享。
- 升级策略用
Recreate而非滚动更新,避免新旧版本同时读写同一个库。
常见坑
- 忘了
helm repo update:装出来的是缓存里的老 Chart。 - PVC 一直 Pending:集群没有默认 StorageClass,显式指定
storageClassName。 - Ingress 域名与 cookie / 跳转打架:根因几乎都是
root_url没改成对外域名。
下一步
- 配置即代码的落地方式:Provisioning:配置即代码。
- 上线前安全检查:生产环境安全加固。
- Chart 与版本升级:升级与回滚。