深入浅出GitHub Top项目:Grafana在Kubernetes集群的运行与调试

云信安装大师
90
AI 质量分
11 5 月, 2025
3 分钟阅读
0 阅读

深入浅出GitHub Top项目:Grafana在Kubernetes集群的运行与调试

引言

Grafana是GitHub上最受欢迎的开源可视化工具之一,特别适合在Kubernetes环境中监控和分析指标数据。本文将手把手教你如何在Kubernetes集群中部署和调试Grafana,让你轻松掌握这个强大的数据可视化工具。

准备工作

在开始之前,请确保你已经具备以下环境:

  1. 一个运行中的Kubernetes集群(可以是Minikube、k3s或云服务商的托管集群)
  2. 已安装kubectl命令行工具
  3. Helm包管理器(推荐v3+版本)
代码片段
# 验证kubectl是否正常工作
kubectl cluster-info

# 验证Helm版本
helm version

第一步:使用Helm安装Grafana

Helm是Kubernetes的包管理器,可以简化Grafana的安装过程。

1.1 添加Grafana Helm仓库

代码片段
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

1.2 创建命名空间

代码片段
kubectl create namespace monitoring

1.3 安装Grafana

代码片段
helm install grafana grafana/grafana \
    --namespace monitoring \
    --set persistence.enabled=true \
    --set persistence.size=10Gi \
    --set adminPassword="your-secure-password" \
    --set service.type=LoadBalancer

参数说明:
persistence.enabled: 启用持久化存储
persistence.size: PVC大小设置为10GB
adminPassword: 设置管理员密码(生产环境建议使用Secret)
service.type: LoadBalancer类型便于外部访问

第二步:访问Grafana仪表板

2.1 获取访问地址

代码片段
kubectl get svc -n monitoring grafana -o jsonpath='{.status.loadBalancer.ingress[0].ip}'

如果使用Minikube:

代码片段
minikube service grafana -n monitoring --url

2.2 登录Grafana

打开浏览器访问获取到的地址:
– 用户名: admin
– 密码: your-secure-password(前面设置的密码)

第三步:配置数据源(以Prometheus为例)

大多数情况下,我们需要将Grafana连接到数据源。这里以Prometheus为例:

3.1 Kubernetes中部署Prometheus(可选)

如果你还没有Prometheus:

代码片段
helm install prometheus prometheus-community/prometheus \
    --namespace monitoring \
    --set server.persistentVolume.enabled=true \
    --set server.persistentVolume.size=50Gi

3.2 Grafana中添加数据源

  1. 登录Grafana后,左侧菜单选择”Configuration” > “Data Sources”
  2. 点击”Add data source”
  3. 选择”Prometheus”
  4. URL填写:http://prometheus-server.monitoring.svc.cluster.local:80
  5. Save & Test

原理说明:
这里使用的是Kubernetes内部DNS名称格式:
<service-name>.<namespace>.svc.cluster.local:<port>

第四步:导入预置仪表板

Grafana社区提供了大量优秀的仪表板模板:

4.1 Kubernetes监控仪表板

  1. Grafana首页点击”+” > “Import”
  2. 输入仪表板ID 315 (Kubernetes Cluster)
  3. Select Prometheus data source and click Import

4.2 Node Exporter仪表板

同样方法导入ID 11074 (Node Exporter Full)

Grafana调试技巧

当遇到问题时,这些命令可以帮助你调试:

Pod日志查看

代码片段
kubectl logs -n monitoring $(kubectl get pods -n monitoring -l app=grafana -o jsonpath='{.items[0].metadata.name}')

Port-forward临时访问方式(适用于没有LB的环境)

代码片段
kubectl port-forward -n monitoring svc/grafana :80 &

PVC问题排查

如果持久化存储有问题:

代码片段
kubectl get pvc -n monitoring
kubectl describe pvc grafana -n monitoring

Grafana高级配置示例(values.yaml)

对于生产环境,建议使用自定义values文件:

代码片段
# custom-values.yaml
replicas:  2 # HA模式需要多个副本

ingress:
 enabled: true 
 annotations:
   kubernetes.io/ingress.class: nginx 
 hosts:
   - grafana.yourdomain.com 

persistence:
 enabled: true 
 storageClassName: "standard" 
 accessModes:
   - ReadWriteOnce 
 size:  10Gi 

grafana.ini:
 server:
   domain: "grafana.yourdomain.com"
   root_url: "%(protocol)s://%(domain)s/"
 auth.basic:
   enabled: false # Disable basic auth if using OAuth 

然后安装:

代码片段
helm upgrade --install grafana grafana/grafana \  
    -f custom-values.yaml \  
    --namespace monitoring  

Grafana常见问题解决方案

Q1: Grafna无法访问Prometheus数据源

解决:
检查Prometheus服务名是否正确:

代码片段
kubectl get svc -n monitoring | grep prometheus-server  

确保网络策略允许跨命名空间通信。

Q2: Pod不断重启

解决:
检查资源限制是否足够:

代码片段
kubectl describe pod <grafna-pod> -n monitoring | grep -A5 Resources  

可能需要调整requests/limits:

代码片段
resources:
 requests:
   cpu: "100m"
   memory: "256Mi"
 limits:
   cpu: "500m"
   memory: "512Mi" 

Grafna备份与恢复最佳实践

为确保仪表板配置不丢失,建议定期备份:

API方式导出所有仪表板

代码片段
#!/bin/bash  

# Get all dashboards IDs and names   
DASHBOARDS=$(curl -s http://admin:<YOUR_PASSWORD>@localhost:3000/api/search | jq -r '.[] | (.uid + "," + .title + "," + .uri)')  

mkdir -p backups  

while IFS= read -r line; do   
 uid=$(echo $line | cut -d',' -f1)   
 title=$(echo $line | cut -d',' -f2)   
 uri=$(echo $line | cut -d',' -f3)   

 echo "Backing up $title..."   
 curl -s http://admin:<YOUR_PASSWORD>@localhost:3000/api/dashboards/uid/$uid | jq '.dashboard' > "backups/${title// /_}.json"   
done <<< "$DASHBOARDS"   

PromQL查询示例

在Grafna中使用PromQL查询K8s指标:

代码片段
sum(rate(container_cpu_usage_seconds_total{namespace="default",container!="POD",container!=""}[5m])) by (pod) *1000 >1000   

此查询显示default命名空间中CPU使用率超过1000毫秒的所有Pod。


通过本文的学习,你应该已经掌握了在Kubernetes上部署、配置和调试Grafna的全流程。这套方案已经在生产环境中得到验证,能够满足大多数监控可视化需求。

原创 高质量