
# 通过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文件中。您可通过设置OBS的挂载参数umask=0077，将Core Dump文件正常存储到OBS中。设置umask的方法请参见[设置挂载参数](https://support.huaweicloud.com/usermanual-cce/cce_10_0631.html)。
#### 开启节点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}.{时间}"。
您也可以在创建节点时候通过设置安装前或安装后脚本自动执行该命令。
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
EulerOS 2.3 Systemd有一个[社区bug](https://github.com/lnykryn/systemd-rhel/pull/67/commits/d7ee19aaae52a5c7471bd2193e2a73d8c43569ec)影响容器Core Dump，如需使用Core Dump需执行如下操作。
1. 在节点的/usr/lib/systemd/system/docker.service文件中，将**LimitCORE** 的值修改为**infinity**。
2. 重启Docker。
3. 业务容器重新部署。
 
#### 容器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
```
#### 配置验证
1. 执行以下命令，获得Pod名称。
   ```
   kubectl get pod
   ```
   回显内容如下：
   ```
   NAME        READY   STATUS    RESTARTS   AGE
   coredump    1/1     Running   0          56s
   ```
   
2. 执行以下命令，进入容器内部。
   ```
   kubectl exec -it coredump -- /bin/sh
   ```
   进入容器后，执行以下命令触发当前shell终端的段错误。
   ```
   kill -s SIGSEGV $$
   ```
   回显结果如下：
   ```
   command terminated with exit code 139
   ```
   
3. 登录节点，在/home/coredump路径下查看core文件是否生成。
   ```
   ls /home/coredump
   ```
   回显结果如下，则说明已经生成core文件。
   ```
   core.coredump.bash.18.1650438992
   ```
   
 
