Kubernetes中Grafana Pod日志异常、数据库锁死及ALB不健康问题求助
问题描述
我在Kubernetes环境中通过kube-prometheus-stack Helm Chart部署了Grafana 10.1.0,遇到三个核心问题:
- 异常请求日志泛滥:Pod日志中频繁出现访问不存在路径(如
/psnlink/.env)返回302,以及/api/info.php这类路径返回401未授权的请求记录; - 数据库锁死:日志持续输出数据库锁重试信息:
logger=sqlstore.transactions t=2024-05-03T11:36:34.901159296Z level=info msg="Database locked, sleeping then retrying" error="database is locked" retry=1 code="database is locked" logger=sqlstore.transactions t=2024-05-03T11:36:34.913546808Z level=info msg="Database locked, sleeping then retrying" error="database is locked" retry=2 code="database is locked" - AWS ALB目标不健康:ALB Ingress Controller显示Grafana后端目标状态不健康。
我已经尝试过调整Grafana版本、设置环境变量(如下),并配置了存活/就绪探针,但问题仍未解决:
image: tag: 10.1.0 env: GF_SECURITY_COOKIE_SAMESITE: disabled GF_SECURITY_COOKIE_SECURE: true GF_SECURITY_ALLOW_EMBEDDING: true
当前完整的values.yaml配置:
image: tag: 10.1.0 env: GF_LOG_LEVEL: debug readinessProbe: httpGet: path: /api/health port: 3000 livenessProbe: httpGet: path: /api/health port: 3000 initialDelaySeconds: 30 timeoutSeconds: 20 failureThreshold: 10 persistence: type: pvc enabled: true storageClassName: standard accessModes: - ReadWriteOnce size: 1Gi ingress: enabled: true annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-1:00000000000:certificate/288888bd2-c97d-433c-55555-400000000 alb.ingress.kubernetes.io/subnets: "subnet-1,subnet-2,subnet-3" alb.ingress.kubernetes.io/group.name: ms rules: - host: grafana.dev.developer.com http: paths: - backend: service: name: kube-stack-prometheus-grafana port: number: 80 path: / pathType: Prefix
解决方案建议
1. 异常请求日志处理
这类请求属于互联网爬虫或恶意扫描,可通过以下方式拦截:
- 在ALB层面配置WAF规则,匹配
/psnlink/、*.php等异常路径,直接返回403或拒绝请求; - 启用Grafana IP白名单:添加环境变量
GF_SECURITY_ALLOWED_IPs,仅允许可信IP段(如办公内网IP)访问Grafana; - 利用ALB listener规则,对异常路径设置重定向或直接拦截,避免请求到达Grafana Pod。
2. 数据库锁死问题
Grafana默认使用SQLite数据库,并发过高或存储IO不足时易出现锁死,可按以下优先级解决:
- 切换外部数据库:将SQLite替换为PostgreSQL/MySQL,彻底解决锁死问题。在
values.yaml中添加数据库配置:env: GF_DATABASE_TYPE: postgres GF_DATABASE_HOST: <postgres-service-name>:5432 GF_DATABASE_NAME: grafana GF_DATABASE_USER: <db-username> GF_DATABASE_PASSWORD: <db-password> - 优化存储性能:检查
standard存储类对应的底层存储(如AWS EBS),若存在IO瓶颈,升级到gp3等高性能存储类型; - 调整数据库连接参数:设置环境变量
GF_DATABASE_MAX_OPEN_CONNECTIONS(默认100),适当降低并发连接数;同时配置GF_DATABASE_MAX_IDLE_CONNECTIONS为合理值,减少闲置连接占用。
3. AWS ALB目标不健康问题
ALB检测后端不健康,需从探针、网络映射两方面排查:
- 验证端口映射:确认Service
kube-stack-prometheus-grafana的targetPort是否指向Grafana容器的3000端口(Service暴露80端口,需映射到容器3000端口); - 优化探针参数:当前
timeoutSeconds=20过长,建议缩短至5秒;failureThreshold=10调整为3-5,periodSeconds(默认10)增加到15秒,减少探测频率; - 检查网络权限:由于ALB
target-type为ip,需确保ALB安全组允许访问Grafana Pod所在节点的3000端口; - 验证探针路径可用性:在集群内部执行
curl <pod-ip>:3000/api/health,确认返回200和{"status":"ok"}。若返回401,添加环境变量允许匿名访问探针:env: GF_AUTH_ANONYMOUS_ENABLED: true GF_AUTH_ANONYMOUS_ORG_ROLE: Viewer
内容的提问来源于stack exchange,提问作者Gourav Saini
相关产品推荐
相关产品推荐

