应用场景
Core Dump是指当一个程序发生严重错误导致异常终止时,操作系统将该程序当前的内存状态以及其他相关信息保存到一个特殊的文件中,这个文件通常称为 core 文件或核心转储文件。core文件包含了程序在崩溃时的内存映像、CPU 寄存器状态、堆栈信息等,可以用于分析程序异常终止的原因。
在容器环境中,Core Dump的处理与传统的物理机环境略有不同,因为容器本身是在宿主机上运行的,因此需要一些特殊的配置才能捕获容器内发生的核心转储。本节介绍容器中core文件的一般处理流程和相关概念。
将Core Dump文件输出到主机目录
开启节点Core Dump
设置Core Dump文件的输出路径
echo "/tmp/cores/core.%t.%e.%p" > /proc/sys/kernel/core_pattern
上述文件路径中:
- %t:表示coredump的时间。
- %e:表示程序文件名。
- %p:表示进程ID。
将Core Dump的输出路径修改为/tmp/cores,后续容器中的应用程序Core Dump文件也将输出到容器的/tmp/cores文件,因为在容器中读取的 /proc/sys/kernel/core_pattern
文件实质上就是主机的 /proc/sys/kernel/core_pattern文件
。
配置容器Core Dump和验证
通过kubectl或者控制台完成如下配置:
apiVersion: v1
kind: Pod
metadata:
name: core-volume
spec:
volumes:
- name: coredump-path
hostPath: # 通过hostPath将容器Core Dump持久化在主机
path: /home/coredump
containers:
- name: ubuntu
image: ubuntu:12.04
command: ["/bin/sleep","3600"]
volumeMounts:
- mountPath: /tmp/cores
name: coredump-path
用上述方式创建Pod并进入,触发当前shell终端的段错误。
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
core-volume 1/1 Running 0 55s
$ kubectl exec -it core-volume -- /bin/bash
root@core-volume:/# kill -s SIGSEGV $$
在容器实际运行的主机上查看/home/core-dump目录会生成core文件。
# ls /home/coredump
core.1738160312.core-volume.15