Kind Kubernetes集群无容器日志 如何定位存储位置并重建软链接
问题根因说明
kind 集群的所有K8s节点本质上是运行在你本地Docker上的容器,K8s调度的业务容器实际运行在这些kind节点容器的内部,而非直接运行在你的宿主机Docker环境中,这是你遇到所有问题的核心原因:
- 宿主机上的
/var/lib/docker/containers/存储的是宿主机Docker直接创建的容器数据,也就是你看到的过往容器文件,kind创建的业务容器数据都在kind节点容器的内部存储中,自然无法在宿主机路径下找到 - 你通过kubectl拿到的containerID是kind节点内部的容器ID,和宿主机Docker没有关联,所以宿主机执行
docker inspect无法识别该ID kubectl logs能正常返回日志是因为请求发送到了对应节点的kubelet,kubelet直接读取节点内部的日志文件返回
容器日志定位步骤
- 首先获取你的kind节点列表,执行命令:
kind get nodes - 选择你业务Pod调度到的节点,进入节点内部的Shell环境,执行命令:
docker exec -it <替换为你的kind节点名称> bash - 进入节点后即可找到标准K8s日志路径:
- 容器日志软链接目录:
/var/log/containers/,默认由kubelet自动维护,其中每个软链接指向对应Pod的实际日志文件 - Pod日志实际存储目录:
/var/log/pods/ - 容器运行时存储的原始日志目录:如果你的kind版本使用containerd作为运行时(默认配置),路径为
/var/lib/containerd/io.containerd.grpc.v1.cri/containers/<容器ID>/;如果是Docker运行时,路径为/var/lib/docker/containers/<容器ID>/
- 如果你需要查询对应容器的详细信息,在kind节点内部执行CRI客户端命令即可:
crictl inspect <替换为你的容器ID>
重建
/var/log/containers软链接的方法 如果你进入kind节点后发现/var/log/containers目录不存在或者软链接缺失,直接重启对应节点的kubelet服务即可,kubelet会自动扫描所有运行中容器,重建完整的软链接列表,执行命令:systemctl restart kubelet
宿主机采集日志的方案建议
如果你需要在宿主机部署Fluentd采集集群日志,推荐两种方案:
- 方案一(最优):将Fluentd作为DaemonSet部署在kind集群中,每个Fluentd Pod直接挂载所在节点的
/var/log/containers、/var/log/pods路径即可正常采集日志,符合K8s日志采集的标准实现 - 方案二:创建kind集群时配置路径挂载,将kind节点的日志目录同步到宿主机,集群配置示例如下:
kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane extraMounts: - hostPath: /home/your-user/kind-logs/control-plane containerPath: /var/log - role: worker extraMounts: - hostPath: /home/your-user/kind-logs/worker containerPath: /var/log
使用该配置创建集群后,所有节点的日志会直接同步到宿主机的/home/your-user/kind-logs/路径下,无需额外配置软链接即可直接在宿主机访问。
内容的提问来源于stack exchange,提问作者Jason Nanay
相关产品推荐
相关产品推荐

