Kubernetes Daemonset挂载卷无日志/数据未收集问题咨询
排查GKE EFK Daemonset无法收集自定义路径日志的问题
咱们一步步拆解问题,从最基础的挂载验证开始排查:
1. 先确认Daemonset Pod的挂载是否真的生效
首先登录到Fluentd Daemonset的Pod里,直接检查挂载目录的状态:
# 先找到Fluentd的Pod名称 kubectl get pods -n kube-system | grep fluentd # 进入目标Pod kubectl exec -it <fluentd-pod-name> -n kube-system -- /bin/bash # 查看挂载的目录是否存在,有没有日志文件 ls -l /home/services/ # 尝试读取一个目标日志文件,比如app1的日志 cat /home/services/app1/logs/app.log
如果这里看不到目录或者日志文件,说明挂载配置有问题:
- 核对Daemonset的
VolumeMounts和Volumes配置,确保宿主节点的/home/services路径被正确映射到Pod内的对应路径 - 注意GKE节点宿主目录的权限,Fluentd运行的用户(通常是
fluentd或root)必须有读取该目录的权限
2. 验证Fluentd自定义配置是否被正确加载
检查你的ConfigMap是否挂载到了Fluentd的配置目录(一般是/etc/fluentd/config.d/):
# 在Fluentd Pod内查看配置文件列表 ls -l /etc/fluentd/config.d/ # 查看自定义配置的内容是否正确 cat /etc/fluentd/config.d/your-custom-config.conf
你的source配置块必须准确对应挂载路径,比如:
<source> @type tail path /home/services/*/logs/*.log pos_file /var/log/fluentd/app-logs.pos tag app.* <parse> @type json # 如果是纯文本日志,换成@type none,或者对应格式比如apache2、nginx </parse> </source>
重点注意:
path必须和Pod内挂载的路径完全一致pos_file的路径需要是Fluentd有权限写入的目录(/var/log/fluentd/一般没问题)- 日志解析格式要和实际日志匹配,否则会因为解析失败丢弃日志
3. 查看Fluentd的运行日志找报错
直接看Fluentd Pod的日志,能快速定位问题:
kubectl logs <fluentd-pod-name> -n kube-system
常见报错及解决:
Permission denied:Fluentd用户没有日志文件读取权限,要么调整宿主节点目录权限,要么在Daemonset里以root用户运行No such file or directory:挂载路径错误或日志文件不存在,回到第一步重新验证挂载parse error:日志解析配置和实际日志格式不匹配,调整<parse>块的配置
4. 检查GKE节点宿主目录的权限
如果挂载路径存在但Fluentd读不到,大概率是权限问题。可以登录到GKE节点检查:
# 登录到目标节点(需要gcloud权限) gcloud compute ssh <node-name> # 查看目录和文件权限 ls -ld /home/services/ ls -l /home/services/app1/logs/
如果权限是drwx------(只有所有者能访问),调整权限:
sudo chmod -R o+r /home/services/
或者在Daemonset的PodSpec里添加安全上下文,以root运行:
securityContext: runAsUser: 0
5. 验证Elasticsearch是否收到数据
如果Fluentd日志没报错,检查Elasticsearch是否有对应索引:
# 进入Elasticsearch Pod(集群内部署的情况) kubectl exec -it <es-pod-name> -n <efk-namespace> -- /bin/bash # 查询所有索引 curl localhost:9200/_cat/indices?v
如果看到app-开头的索引(对应配置里的tag app.*),说明数据已经到ES了,接下来检查Kibana的索引模式是否正确配置即可。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

