最近更新时间:2024-04-23 16:44:05
容器有时会在发生异常后无法正常工作,业务日志中若无足够的信息来定位问题原因,则需要结合 coredump 来进一步分析,本文将介绍如何使容器实例产生 coredump 并保存到外部存储。
容器实例默认关闭coredump,避免磁盘占用过多而导致业务不可用。您可以通过Annotation开启coredump:
Annotation Key | Annotation Value示例 | 是否必填 | 描述 |
---|---|---|---|
k8s.ksyun.com/kci-core-pattern | “/tmp/cores/core.%h.%e.%p.%t” | 否 | 设置容器实例的Core dump文件保存目录 |
主要参数信息如下:
%h:主机名(在 Pod 内主机名即 Pod 的名称),推荐。
%e:程序文件名,推荐。
%p:进程 ID,可选。
%t:coredump 的时间,可选。
最终生成的 core 文件完整路径如下所示:
/tmp/cores/core.nginx-7855fc5b44-p2rzt.bash.36.1602488967
coredump文件一般用于离线分析问题,因此设置coredump文件的保存路径时,一般采用外挂存储,而不是保存在容器本地路径,避免容器退出而丢失coredump文件。容器实例支持自定义设置coredump文件保存路径,设置后将自动开启coredump。
以使用KFS作为外挂存储为例,操作步骤如下:
1.按如下配置示例,创建容器实例
apiVersion: v1
kind: Pod
metadata:
name: nfs-pod
labels:
app: nginx
annotations:
k8s.ksyun.com/kci-core-pattern: "/tmp/cores/core.%h.%e.%p.%t" # 设置coredump文件保存路径
spec:
hostname: nfs-test
volumes:
- nfs: # 替换成您真实的server地址和path路径
server: 10.0.*.**
path: /cfs-eHhkjGSJHK
name: test
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: test
mountPath: /tmp/cores
nodeName: rbkci-virtual-kubelet
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- virtual-kubelet
tolerations:
- key: rbkci-virtual-kubelet.io/provider
value: kingsoftcloud
effect: NoSchedule
2.触发coredump
连接容器实例,在在容器内执行sleep 100
命令后按Ctrl
+\
键,触发coredump,生成的coredump文件将自动保存到KFS中。
支持通过kubectl edit pod <pod_name>
的方式对运行中的pod进行coredump文件保存路径的更新,以及关闭coredump:
更新k8s.ksyun.com/kci-core-pattern
注解的值,修改coredump文件保存路径
删除k8s.ksyun.com/kci-core-pattern
注解,关闭coredump
纯净模式
鼠标选中内容,快速反馈问题