k8s平台:手动部署Grafana

以下是一个可用于生产环境的 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

    • 使用 replicas: 2 确保高可用性。
    • 通过环境变量设置管理员用户名和密码。
    • 配置了 readinessProbelivenessProbe 以确保 Grafana 的健康状态。
    • 挂载了持久化存储卷 (PersistentVolumeClaim) 和配置文件 (ConfigMap)。
  2. ConfigMap

    • 包含 grafana.ini 配置文件,用于自定义 Grafana 的行为。
    • 配置了匿名访问、数据库路径等。
  3. PersistentVolumeClaim

    • 使用持久化存储确保 Grafana 的数据(如仪表盘、用户配置)不会丢失。
    • 可以根据需求调整存储大小和 StorageClass
  4. Service

    • 使用 ClusterIP 类型,仅在集群内部暴露服务。
    • 如果需要外部访问,可以通过 Ingress 暴露。
  5. Ingress(可选):

    • 使用 Ingresscert-manager 自动管理 TLS 证书。
    • 配置了 HTTPS 强制跳转以提高安全性。

部署步骤

  1. 将上述 YAML 文件保存为 grafana-deployment.yaml

  2. 使用 kubectl 部署 Grafana:

    复制代码
    kubectl apply -f grafana-deployment.yaml
  3. 检查部署状态:

    复制代码
    kubectl get pods -n monitoring
    kubectl get svc -n monitoring
    kubectl get ingress -n monitoring
  4. 访问 Grafana:

    • 如果使用了 Ingress,可以通过 https://grafana.example.com 访问。

    • 如果未使用 Ingress,可以通过 kubectl port-forward 临时访问:

      复制代码
      kubectl port-forward svc/grafana -n monitoring 3000:3000

      然后访问 http://localhost:3000


生产环境建议

  1. 使用固定版本的镜像

    • 避免使用 latest 标签,改为固定版本(如 grafana/grafana:9.5.2)。
  2. 启用身份验证

    • 配置 OAuth、LDAP 或 SAML 集成,避免使用默认的管理员账号。
  3. 备份数据

    • 定期备份 Grafana 的持久化数据(如 /var/lib/grafana)。
  4. 监控 Grafana

    • 使用 Prometheus 监控 Grafana 的性能和健康状态。

希望这个配置能帮助你顺利部署 Grafana!如果有其他问题,请随时告诉我。

相关推荐
BullSmall14 小时前
linux zgrep命令介绍
linux·运维
A9better14 小时前
嵌入式开发学习日志36——stm32之USART串口通信前述
stm32·单片机·嵌入式硬件·学习
不太可爱的叶某人14 小时前
【学习笔记】kafka权威指南——第6章 可靠的数据传递
笔记·学习·kafka
emma羊羊15 小时前
【文件读写】图片木马
linux·运维·服务器·网络安全·靶场
你疯了抱抱我15 小时前
【SSH】同一局域网下windows使用Xshell SSH连接另一台 ubuntu 22.04 电脑
运维·ubuntu·ssh
2301_8184115515 小时前
Ubuntu之apt更新源
linux·运维·ubuntu
CS Beginner16 小时前
【Linux】Mysql的基本文件组成和配置
linux·运维·mysql
2301_7909949917 小时前
仿神秘海域/美末环境交互的程序化动画学习
学习·microsoft·交互
能不能别报错17 小时前
K8s学习笔记(十六) 探针(Probe)
笔记·学习·kubernetes
初圣魔门首席弟子17 小时前
C++ STL 向量(vector)学习笔记:从基础到实战
c++·笔记·学习