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!如果有其他问题,请随时告诉我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值