排查K8s Pod Core Dump问题的步骤
检查Pod日志
通过kubectl logs <pod-name>查看Pod的标准输出和错误日志,确认是否有崩溃或异常信息。若容器已重启,添加--previous参数查看前一个容器的日志。
检查Core Dump文件位置
默认情况下,容器内的Core Dump文件可能生成在/var/lib/systemd/coredump或/tmp目录。需确认容器是否配置了Core Dump路径,通过kubectl exec -it <pod-name> -- ls /tmp检查目标路径。
启用Core Dump收集
在容器内执行ulimit -c unlimited临时启用Core Dump。永久生效需在Pod的securityContext中配置:
yaml
securityContext:
capabilities:
add: ["SYS_PTRACE"]
privileged: false
配置Core Dump路径
在Pod的initContainer或主容器中挂载HostPath,将Core Dump保存到持久化存储:
yaml
volumeMounts:
- name: coredump-vol
mountPath: /tmp/coredump
volumes:
- name: coredump-vol
hostPath:
path: /var/coredumps
type: DirectoryOrCreate
分析Core文件
将Core文件复制到本地后,使用gdb分析:
bash
gdb <binary-path> <core-file>
执行bt full查看完整堆栈跟踪,定位崩溃点。
检查资源限制
通过kubectl describe pod <pod-name>确认是否因内存不足(OOMKilled)触发崩溃。调整resources.limits中的内存配置:
yaml
resources:
limits:
memory: "2Gi"
内核参数调优
在节点上修改/etc/sysctl.conf,确保内核允许Core Dump:
bash
echo "kernel.core_pattern=/var/coredumps/core.%e.%p" | sudo tee -a /etc/sysctl.conf
sysctl -p
使用Debug工具
对于复杂问题,在Pod中安装调试工具(如strace):
bash
kubectl exec -it <pod-name> -- apt-get update && apt-get install -y strace
strace -p 1
检查依赖库
通过ldd <binary-path>确认容器内依赖库版本是否匹配。使用docker history或kubectl describe pod检查基础镜像的变更历史。
复现问题
若条件允许,在测试环境复现问题。通过kubectl debug启动临时调试容器:
bash
kubectl debug -it <pod-name> --image=busybox --target=<container-name>