Sometimes people don't need advice, they just need someone to listen and care.
Toggle navigation
Home
Archives
Tags
About
kubernetes容器生成core文件
2020-02-05 02:28:49
523
0
0
william
## 基础知识 - core dump 在绝大多数GNU/Linux系统中,当应用程序发生没有捕获的异常信号ARORT/SEGV时,系统会终止当前进程,并生成core dump文件,它一般在程序执行的主目录下,通常命名为core或者core.PID。通常情况下core dump包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等。在实际的开发场景中,这些信息能够对开发人员调试定位问题提供非常大的帮助,所以在特定场合生成并留存core dump是一件必要而有意义的事情。 - ulimit ulimit是GNU/Linux的一个命令行工具,用于显示或设置用户可以使用的资源限制。在本例中,我们主要关注其对core文件大小限制的设置或查看。 使用ulimit -c查看对core文件大小的限制,例如: ``` bash # ulimit -c unlimited ``` **unlimited**表示没有限制,这意味着当应用程序异常时,系统能够输出任意大小的core dump文件,如果结果是非零数字,则表示系统只能输出限制大小的core dump文件,如果结果为零,则系统不会输出core dump文件。 设置对core文件大小的限制,如: ``` bash # ulimit -c unlimited 不限制 # ulimit -c 1024 限制大小为1024 # ulimit -c 0 限制大小为0,即不输出core文件 ``` - docker ulimit 在docker容器中,ulimit的限制由dockerd进程控制,用户可以通过参数--default-ulimit进行配置,默认时,不会限制core文件生成大小,如果用户在dockerd进程启动时,对core文件生成大小进行了限制,用户依然可以在docker run的时候通过--ulimit参数进行修改,docker run中的--ulimit参数会优先生效。 - kubernetes ulimit 在kubernetes中,对容器的ulimit限制,只提供了cpu,memory,storage,alpha.kubernetes.io/nvidia-gpu的限制,core文件生成大小的限制依赖dockerd进程--default-ulimit参数对core文件生成大小的配置。 ## 配置dockerd参数 docker安装完成后,通过systemctl进行管理,修改其参数即修改相应的serivce配置文件。 配置文件位置:/lib/systemd/system/docker.service 修改步骤 - 打开文件,编辑ExecStart项,如限制core文件生成大小为0,则在该项后边添加--default-ulimit core=0:0参数,其他参数保持不变,修改后如下所示: ```bash ExecStart=/usr/bin/dockerd --insecure-registry 172.16.59.153 --live-restore --default-ulimit core=0:0 ``` - 重新加载docker.service配置文件 ```bash # systemctl daemon-reload ``` 重启docker服务 ```bash # systemctl restart docker ``` 查看重启后的配置参数 ```bash # ps -ef | grep dockerd root 8386 1 0 15:47 ? 00:00:29 /usr/bin/dockerd --insecure-registry 172.16.59.153 --live-restore --default-ulimit core=0:0 ``` ## 验证 1、dockerd限制core文件生成大小为0,docker run默认启动容器,容器中限制core文件的大小为0 ```bash # docker run -it --name=core-dump-test ubuntu:12.04 bash # ulimit -c 0 ``` 2、dockerd限制core文件生成大小为0,docker run通过--ulimit修改为不限制,容器中不限制core文件的大小 # docker run -it --name=core-dump-test-2 --ulimit core=-1 ubuntu:12.04 bash # ulimit -c unlimited 1 2 3 3、dockerd限制core文件生成大小为0,kubernetes启动容器,容器限制core文件生成大小为0 编写yaml文件core-test.yaml: apiVersion: v1 kind: Pod metadata: name: core-test spec: nodeSelector: kubernetes.io/hostname: kubetest-2 containers: - name: ubuntu image: ubuntu:12.04 command: ["/bin/sleep","3600"] 1 2 3 4 5 6 7 8 9 10 11 创建pod,并进入容器,并验证core文件大小的限制: # kubectl create -f core-test.yaml pod "core-test" created # kubectl exec -it core-test bash # ulimit -c 0 1 2 3 4 5 4、dockerd不限制core文件生成大小,kubernetes启动容器,容器不限制core文件的大小 修改docker.service文件,将启动命令修改为如下: ExecStart=/usr/bin/dockerd --insecure-registry 172.16.59.153 --live-restore --default-ulimit core=-1 1 重新启动docker,并验证启动参数是否生效: # systemctl daemon-reload # systemctl restart docker # ps -ef | grep docker root 29755 1 3 19:14 ? 00:00:00 /usr/bin/dockerd --insecure-registry 172.16.59.153 --live-restore --default-ulimit core=-1 1 2 3 4 删除刚刚创建的core-test pod,并重新创建: # kubectl delete -f core-test.yaml pod "core-test" deleted # kubectl create -f core-test.yaml pod "core-test" created 1 2 3 4 进入容器并验证core文件大小的限制: # kubectl exec -it core-test bash # ulimit -c unlimited 1 2 3 5、dockerd不限制core文件的大小,docker run默认启动容器,容器中不限制core文件的大小 # docker run -it --name=core-dump-test ubuntu:12.04 bash # ulimit -c unlimited 1 2 3 设置core dump文件的输出路径 默认情况下,core dump文件生成在应用程序的主路径下边,在kubernetes环境下,一般将业务应用程序作为容器主程序,程序崩溃后容器直接退出,且被回收销毁,所以即使应用程序生成了core文件,一般你不容易拿到core文件。你可能会想,通过目录挂载的方式让core文件直接输出到本机磁盘或者网络存储上,然而一般情况下是不会将应用程序的主目录挂载出来的。所以,为了拿到core文件,我们可能需要修改core cump文件的输出路径,并将该输出路径挂载到本地磁盘或者网络存储,从而获取到相应的core文件。 在主机上执行如下命令(示例中在kubetest-2主机上执行): echo "/tmp/cores/core.%p" > /proc/sys/kernel/core_pattern 1 以上,将core dump的输出路径修改为/tmp/cores,后续容器中的应用程序core dump文件也将输出到容器的/tmp/cores文件,因为在容器中读取的/proc/sys/kernel/core_pattern文件实质上就是主机的/proc/sys/kernel/core_pattern文件。 kubernetes容器中获取core文件: 创建core-volume.yaml文件: apiVersion: v1 kind: Pod metadata: name: core-volume spec: nodeSelector: kubernetes.io/hostname: kubetest-2 volumes: - name: core-path hostPath: path: /home/core-dump containers: - name: ubuntu image: ubuntu:12.04 command: ["/bin/sleep","3600"] volumeMounts: - mountPath: /tmp/cores name: core-path 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 创建并进入pod: # kubectl create -f core-volume.yaml pod "core-volume" created # kubectl exec -it core-volume bash 1 2 3 触发当前shell终端的段错误(会自动退出终端): # kill -s SIGSEGV $$ command terminated with exit code 139 1 2 查看/home/core-dump目录下是否生成core文件(容器实际运行的主机上查看,本例中为kubetest-2) # ls /home/core-dump core.5 ———————————————— 原文链接:https://blog.csdn.net/u013774469/article/details/82595988
Pre:
调试 Kubernetes 占用 CPU 过高
Next:
LVS 负载均衡模式
0
likes
523
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Please enable JavaScript to view the
comments powered by Disqus.
comments powered by
Disqus
Table of content