更新时间:2025-05-16 GMT+08:00
通过Core Dump文件定位容器问题
应用场景
Core Dump是Linux操作系统在程序突然异常终止或者崩溃时将当时的内存状态记录下来,保存在一个文件中。通过Core Dump文件可以分析查找问题原因。
容器一般将业务应用程序作为容器主程序,程序崩溃后容器直接退出,且被回收销毁,因此容器Core Dump需要将Core文件持久化存储在主机或云存储上。本文将介绍容器Core Dump的方法。
约束与限制
容器Core Dump持久化存储至OBS(并行文件系统或对象桶)时,由于CCE挂载OBS时默认挂载参数中带有umask=0的设置,这导致Core Dump文件虽然生成但由于umask原因Core Dump信息无法写入到Core文件中。
开启节点Core Dump
登录节点,执行如下命令开启Core Dump,设置core文件的存放路径及格式。
echo "/tmp/cores/core.%h.%e.%p.%t" > /proc/sys/kernel/core_pattern
其中%h、%e、%p、%t均表示占位符,说明如下:
- %h:主机名(在 Pod 内即为 Pod 的名称),建议配置。
- %e:程序文件名,建议配置。
- %p:进程 ID,可选。
- %t:coredump 的时间,可选。
即通过以上命令开启Core Dump后,生成的core文件的命名格式为“core.{主机名}.{程序文件名}.{进程ID}.{时间}”。
您也可以在创建节点时候通过设置安装前或安装后脚本自动执行该命令。
容器Core Dump持久化
core文件可以考虑使用HostPath或PVC存放在本机或云存储,如下为使用HostPath方式示例pod.yaml。
apiVersion: v1 kind: Pod metadata: name: coredump spec: volumes: - name: coredump-path hostPath: path: /home/coredump containers: - name: ubuntu image: ubuntu:12.04 command: ["/bin/sleep","3600"] volumeMounts: - mountPath: /tmp/cores name: coredump-path
执行以下命令,创建Pod。
kubectl create -f pod.yaml
配置验证
- 执行以下命令,获得Pod名称。
kubectl get pod
回显内容如下:
NAME READY STATUS RESTARTS AGE coredump 1/1 Running 0 56s
- 执行以下命令,进入容器内部。
kubectl exec -it coredump -- /bin/sh
进入容器后,执行以下命令触发当前shell终端的段错误。
kill -s SIGSEGV $$
回显结果如下:
command terminated with exit code 139
- 登录节点,在/home/coredump路径下查看core文件是否生成。
ls /home/coredump
回显结果如下,则说明已经生成core文件。
core.coredump.bash.18.1650438992
父主题: 容器