分享免费的编程资源和教程

网站首页 > 技术教程 正文

k8s平台:手动部署Grafana

goqiw 2025-05-28 17:10:38 技术教程 7 ℃ 0 评论

以下是一个可用于生产环境的 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
---
# 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. Deployment
  2. 使用 replicas: 2 确保高可用性。
  3. 通过环境变量设置管理员用户名和密码。
  4. 配置了 readinessProbe 和 livenessProbe 以确保 Grafana 的健康状态。
  5. 挂载了持久化存储卷 (PersistentVolumeClaim) 和配置文件 (ConfigMap)。
  6. ConfigMap
  7. 包含 grafana.ini 配置文件,用于自定义 Grafana 的行为。
  8. 配置了匿名访问、数据库路径等。
  9. PersistentVolumeClaim
  10. 使用持久化存储确保 Grafana 的数据(如仪表盘、用户配置)不会丢失。
  11. 可以根据需求调整存储大小和 StorageClass。
  12. Service
  13. 使用 ClusterIP 类型,仅在集群内部暴露服务。
  14. 如果需要外部访问,可以通过 Ingress 暴露。
  15. Ingress(可选):
  16. 使用 Ingress 和 cert-manager 自动管理 TLS 证书。
  17. 配置了 HTTPS 强制跳转以提高安全性。

部署步骤

  1. 将上述 YAML 文件保存为 grafana-deployment.yaml。
  2. 使用 kubectl 部署 Grafana:
  3. kubectl apply -f grafana-deployment.yaml
  4. 检查部署状态:
  5. kubectl get pods -n monitoring kubectl get svc -n monitoring kubectl get ingress -n monitoring
  6. 访问 Grafana:
  7. 如果使用了 Ingress,可以通过 https://grafana.example.com 访问。
  8. 如果未使用 Ingress,可以通过 kubectl port-forward 临时访问:
  9. kubectl port-forward svc/grafana -n monitoring 3000:3000
  10. 然后访问 http://localhost:3000。

生产环境建议

  1. 使用固定版本的镜像
  2. 避免使用 latest 标签,改为固定版本(如 grafana/grafana:9.5.2)。
  3. 启用身份验证
  4. 配置 OAuth、LDAP 或 SAML 集成,避免使用默认的管理员账号。
  5. 备份数据
  6. 定期备份 Grafana 的持久化数据(如 /var/lib/grafana)。
  7. 监控 Grafana
  8. 使用 Prometheus 监控 Grafana 的性能和健康状态。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表