3. Grafana 安装与部署:二进制安装、Docker 部署、Kubernetes 部署、配置文件的详解
在生产环境中,Grafana 的部署方式直接影响后续的运维效率与扩展能力。本章将系统讲解三种主流部署方式(二进制、Docker、Kubernetes),并深入剖析核心配置文件的结构与关键参数。无论你是初次搭建还是迁移升级,都能在此找到对应的操作路径与避坑指南。
📌 选型建议: 单机测试或低负载场景推荐二进制或 Docker 部署;生产集群、需要弹性伸缩与自愈能力时,优先选择 Kubernetes 部署。
3.1 二进制安装(Linux 环境)
二进制安装是最直接的方式,不依赖容器运行时,适合对系统资源有严格管控的场景。以下步骤基于 CentOS 7 / Ubuntu 20.04 验证。
3.1.1 下载与解压
# 获取最新稳定版(以 10.4.2 为例)
wget https://dl.grafana.com/oss/release/grafana-10.4.2.linux-amd64.tar.gz
# 解压到指定目录
tar -zxvf grafana-10.4.2.linux-amd64.tar.gz -C /opt/
mv /opt/grafana-10.4.2 /opt/grafana
3.1.2 创建系统用户与数据目录
# 创建 grafana 用户(无登录权限)
useradd --no-create-home --shell /bin/false grafana
# 创建数据与日志目录
mkdir -p /var/lib/grafana /var/log/grafana
chown -R grafana:grafana /var/lib/grafana /var/log/grafana /opt/grafana
3.1.3 配置 systemd 服务
cat <<EOF > /etc/systemd/system/grafana-server.service
[Unit]
Description=Grafana Server
After=network.target
[Service]
User=grafana
Group=grafana
ExecStart=/opt/grafana/bin/grafana-server \
--homepath=/opt/grafana \
--config=/opt/grafana/conf/defaults.ini \
--config=/opt/grafana/conf/custom.ini
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
# 启动并设置开机自启
systemctl daemon-reload
systemctl start grafana-server
systemctl enable grafana-server
✅ 验证: 访问
http://<服务器IP>:3000,默认用户名/密码为 admin/admin,首次登录会强制修改密码。
3.2 Docker 部署
Docker 部署将 Grafana 及其依赖打包在容器中,实现环境一致性。官方镜像 grafana/grafana 已包含默认配置,用户只需挂载数据卷与自定义配置文件即可。
3.2.1 快速启动(单容器)
docker run -d \
--name=grafana \
-p 3000:3000 \
-v /data/grafana:/var/lib/grafana \
-v /data/grafana/conf:/etc/grafana \
-e "GF_SERVER_ROOT_URL=http://yourdomain.com" \
-e "GF_SECURITY_ADMIN_PASSWORD=StrongPass123" \
--restart=always \
grafana/grafana:10.4.2
3.2.2 Docker Compose 编排(推荐)
version: '3.8'
services:
grafana:
image: grafana/grafana:10.4.2
container_name: grafana
ports:
- "3000:3000"
volumes:
- ./data/grafana:/var/lib/grafana
- ./config/grafana.ini:/etc/grafana/grafana.ini
- ./config/provisioning:/etc/grafana/provisioning
environment:
- GF_SERVER_ROOT_URL=http://localhost:3000
- GF_SECURITY_ADMIN_PASSWORD=admin
restart: unless-stopped
⚠️ 权限陷阱: 容器内 Grafana 以 UID 472(grafana 用户)运行。如果宿主机挂载目录权限不足,会导致容器启动失败。请执行
chown -R 472:472 ./data/grafana 修正。
3.2.3 关键环境变量速查表
| 环境变量 | 对应配置项 | 说明 |
|---|---|---|
GF_SERVER_HTTP_PORT | [server].http_port | 容器内监听端口,默认 3000 |
GF_SERVER_ROOT_URL | [server].root_url | 外部访问 URL,反向代理时必填 |
GF_SECURITY_ADMIN_PASSWORD | [security].admin_password | 初始管理员密码 |
GF_DATABASE_TYPE | [database].type | 后端数据库类型(sqlite3/mysql/postgres) |
GF_INSTALL_PLUGINS | — | 启动时自动安装插件,多个用逗号分隔 |
3.3 Kubernetes 部署
在 K8s 集群中部署 Grafana,可以充分利用声明式配置、自动扩缩容与自愈能力。推荐使用 Helm Chart 或自定义 YAML 清单。
3.3.1 使用 Helm 安装(官方 Chart)
# 添加 Grafana 官方 Helm 仓库
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
# 安装 Grafana(命名空间 monitoring)
helm upgrade --install grafana grafana/grafana \
--namespace monitoring --create-namespace \
--set service.type=NodePort \
--set service.nodePort=30300 \
--set persistence.enabled=true \
--set persistence.size=10Gi \
--set adminPassword="K8sAdmin123"
3.3.2 自定义 YAML 部署(核心资源清单)
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
namespace: monitoring
spec:
replicas: 2
selector:
matchLabels:
app: grafana
template:
metadata:
labels:
app: grafana
spec:
containers:
- name: grafana
image: grafana/grafana:10.4.2
ports:
- containerPort: 3000
env:
- name: GF_SERVER_ROOT_URL
value: "https://grafana.yourdomain.com"
- name: GF_SECURITY_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: grafana-admin
key: password
volumeMounts:
- name: data
mountPath: /var/lib/grafana
- name: config
mountPath: /etc/grafana/grafana.ini
subPath: grafana.ini
volumes:
- name: data
persistentVolumeClaim:
claimName: grafana-pvc
- name: config
configMap:
name: grafana-config
3.3.3 暴露服务(Ingress 示例)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana-ingress
namespace: monitoring
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: grafana.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: grafana
port:
number: 3000
🔐 安全建议: 生产环境务必通过 Secret 管理管理员密码,并启用 Ingress TLS 证书。避免将
adminPassword 明文写在 Values 或 YAML 中。
3.4 配置文件详解
Grafana 的配置体系采用“分层覆盖”机制:defaults.ini 提供出厂默认值,custom.ini(或通过 --config 指定的文件)中的值会覆盖前者。理解核心配置段是调优与排障的基础。
3.4.1 配置文件加载顺序
- defaults.ini — 内置默认配置,不要直接修改,升级时会被覆盖。
- custom.ini — 用户自定义配置,优先级高于 defaults.ini。
- 环境变量 — 格式
GF_<SECTION>_<KEY>,优先级最高。
3.4.2 核心配置段速查表
| 配置段 | 关键参数 | 默认值 | 说明 |
|---|---|---|---|
[server] | http_port | 3000 | HTTP 监听端口 |
[server] | root_url | http://localhost:3000 | 外部访问 URL,反向代理时必填 |
[security] | admin_user | admin | 初始管理员用户名 |
[security] | admin_password | admin | 初始管理员密码(首次登录强制修改) |
[database] | type | sqlite3 | 后端数据库类型:sqlite3 / mysql / postgres |
[database] | path | grafana.db | SQLite 数据库文件路径 |
[auth.anonymous] | enabled | false | 是否允许匿名访问 |
[smtp] | enabled | false | 是否启用邮件通知 |
[smtp] | host | localhost:25 | SMTP 服务器地址 |
[alerting] | enabled | true | 是否启用报警功能 |
[unified_alerting] | enabled | true | 是否启用统一报警系统(Grafana 8+ 推荐) |
3.4.3 典型配置示例(custom.ini)
# ==================== 服务器配置 ====================
[server]
http_port = 3000
root_url = https://grafana.example.com
enable_gzip = true
# ==================== 数据库配置 ====================
[database]
type = postgres
host = postgres-service:5432
name = grafana
user = grafana
password = DB_Password_123
ssl_mode = disable
# ==================== 安全配置 ====================
[security]
admin_user = admin
admin_password = Admin_Strong_456
secret_key = SW2YkxI1Q2Z8F3T5p7b9d0e1r4t6y8u0
# ==================== 邮件通知 ====================
[smtp]
enabled = true
host = smtp.example.com:587
user = alert@example.com
password = Mail_Pass_789
from_address = alert@example.com
from_name = Grafana Alert
# ==================== 统一报警 ====================
[unified_alerting]
enabled = true
evaluation_timeout = 30s
notification_timeout = 30s
max_attempts = 3
⚠️ 生产环境必改项:
secret_key— 用于加密数据源密码、告警通知等敏感信息,务必使用强随机字符串。admin_password— 首次登录后应立即修改,或通过环境变量注入。database— 生产环境建议使用 PostgreSQL 或 MySQL,避免 SQLite 在高并发下出现锁冲突。
3.4.4 配置验证与重载
# 检查配置文件语法(Grafana 10+)
grafana-cli admin check-config
# 热重载配置(无需重启服务)
# 方法一:通过 API
curl -X POST http://localhost:3000/api/admin/provisioning/dashboards/reload \
-H "Authorization: Bearer <>"
# 方法二:发送 SIGHUP 信号
kill -HUP $(pgrep grafana-server)
# 方法三:重启服务(最彻底)
systemctl restart grafana-server
💡 最佳实践: 将配置文件纳入 Git 版本管理,配合 CI/CD 实现配置变更的审计与回滚。对于 Kubernetes 部署,使用 ConfigMap 管理配置,修改后自动触发 Pod 滚动更新。
3.5 部署方式对比总结
| 维度 | 二进制安装 | Docker 部署 | Kubernetes 部署 |
|---|---|---|---|
| 部署复杂度 | 中等(需手动配置 systemd) | 低(一条命令启动) | 较高(需掌握 Helm / YAML) |
| 资源隔离 | 无(直接使用宿主机资源) | 容器级隔离 | Pod 级隔离 + 资源限制 |
| 扩展性 | 手动复制部署 | 需编排工具(Compose/Swarm) | 原生支持水平扩缩 |
| 配置管理 | 本地文件 | 挂载卷 / 环境变量 | ConfigMap / Secret |
| 升级回滚 | 手动替换二进制 | 更换镜像标签 | Helm rollback / 镜像版本控制 |
| 适用场景 | 单机测试、离线环境 | 开发环境、中小规模生产 | 大规模生产、微服务架构 |
📘 学习路径建议: 初学者先从 Docker 部署入手,快速体验 Grafana 功能;熟悉后再尝试二进制安装以理解底层文件结构;最后在生产环境中落地 Kubernetes 部署,结合本章的配置详解进行调优。