使用coredump分析实例程序异常
更新时间:2024-09-25
功能概述
coredump是指在程序运行过程中发生异常终止或崩溃时,操作系统将程序的内存内容转储到一个特殊的文件(即coredump文件)中,以便于后续的调试和分析。BCI容器实例支持例开启coredump运维任务,以便在容器异常终止时可以查看分析coredump生成的文件,从而定位问题原因,修复程序异常。 BCI支持将coredump文件存入CFS中或者对象存储BOS中。
使用流程
BCI默认关闭coredump,避免磁盘占用过多而导致业务不可用。您可以根据需要选择以下方式开启coredump运维任务。
方式一:支持指定Pod Annotation创建Pod开启coredump运维任务 此种形式开启的coredump运维任务在容器运行异常终止或者退出时,触发coredump生成的core文件,该core文件保存在容器/tmp/cores目录中,该目录实际由同地域CFS挂载。
方式二:支持手动开启coredump运维任务 手动通过OpenAPI开启coredump后,BCI将生成一个coredump运维任务,在容器运行异常终止或者退出时,触发coredump生成的core文件将自动保存到对象存储BOS中。
指定Pod Annotation创建Pod开启coredump运维任务
操作步骤如下:
- 创建BCI 容器实例, 需要注意如下两点:
- 指定并添加如下Pod CorePattern Annotation。需要保证完全一致 bci.virtual-kubelet.io/core-pattern: /tmp/cores
- Pod的远程存储需挂载在容器内/tmp/cores路径,示例如下。
示例example如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: coredump-pv-cfs
namespace: default
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 1Gi
mountOptions:
- nfsvers=4.2
nfs:
path: / #这里指定远程存储cfs内部路径
server: cfs-xxxxxxxxx.cfs.gz.baidubce.com #这里指定远程存储cfs地址
persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: coredump-pvc-cfs
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
volumeMode: Filesystem
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: core-dump-deployment
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: core-dump-deployment
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
annotations:
bci.virtual-kubelet.io/core-pattern: /tmp/cores ## 必须指定这个annotation, 必须完全一致不能更改。
myannotation: "myannotation"
labels:
app: core-dump-deployment
mylabel: "mylabel"
spec:
containers:
- image: hub.baidubce.com/cce/nginx-alpine-go
imagePullPolicy: IfNotPresent
name: c01
workingDir: /work
ports:
- containerPort: 8080
protocol: TCP
resources:
limits:
cpu: 0.25
memory: 512Mi
requests:
cpu: 0.25
memory: 512Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /tmp/cores ##这里需要将远程存储挂载到容器内/tmp/cores路径,该路径不支持自定义
name: coredump
enableServiceLinks: true
nodeName: bci-virtual-kubelet-0
nodeSelector:
type: virtual-kubelet
preemptionPolicy: PreemptLowerPriority
priority: 0
dnsPolicy: ClusterFirst
enableServiceLinks: false
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoSchedule
key: virtual-kubelet.io/provider
operator: Equal
value: baidu
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: coredump
persistentVolumeClaim:
claimName: coredump-pvc-cfs
- 触发coredump。连接BCI实例,在容器内执行sleep 100命令后按Ctrl+\键,可触发coredump,生成的core文件将自动保存到CFS中。
- 查看并下载core文件。可登陆CFS相关路径获取core文件
手动开启coredump运维任务
当前BCI仅支持通过OpenAPI开启运维任务。步骤如下
- 确保BCI实例成功创建并处于Running状态,获取到podID
- 为BCI实例开启coredump运维任务。调用OpenAPI创建coredump运维任务,接口需指定目标BCI实例,然后将OpsType设为coredump,OpsValue设为enable,设置保存coredump文件的BOS bucket地址,即可开启coredump运维任务。一个注意事项是指定BCI实例时,需确保目标BCI实例在创建时没有设置CorePattern Annotation。
POST http://{{endpoint_bci}}/v2/opstask
示例request body:
{
"podId":"pod-xxxx",
"opsType":"coredump",
"opsValue":"enable",
"bucket":"xxxbucket"
}
- 触发coredump。连接BCI实例,在容器内执行sleep 100命令后按Ctrl+\键,可触发coredump,生成的core文件将自动保存到BOS中。
- 下载Core文件。调用OpenAPI查询运维任务接口,指定BCI实例podId和运维任务类型OpsType为coredump查询参数,查看运维任务的结果,从返回信息的result中,可以获取core文件是否已保存到BOS中,可到BOS相关bucket下载core文件。
GET http://{{endpoint_bci}}/v2/opsrecord?podId=xxx&opsType=coredump
示例reponse
{
"result": [
{
"opsType": "coredump",
"opsStatus": "success",
"storageType": "bos",
"~~~~storageContent": "please goto bos page to download file core.p-ysappvy3.sh.8.1713786425 .",
"createTime": 1713786437000
}
]
}