VCI 支持获取进程的 coredump 文件,您可以使用 coredump 文件分析和定位容器异常问题。本文主要描述 VCI 容器 coredump 持久化方法。
coredump 又叫核心转储,当程序运行过程中发生异常,程序异常退出时,由操作系统把程序当前的内存状况存储在一个 core 文件中,该步骤叫 coredump。在 VCI 容器异常终止情况下,如果业务日志中没有足够的信息来定位问题原因,则需要结合 coredump 文件来进一步分析和定位问题原因。本文将介绍如何使容器产生 coredump 文件并保存到外部存储。
VCI 实例默认关闭 coredump,避免磁盘占用过多而导致业务不可用。您可以在创建 VCI 实例时通过 Pod Annotation 开启 coredump。
Annotation Key | Annotation Value 示例值 | 说明 | 是否必填 |
---|---|---|---|
vci.vke.volcengine.com/core-pattern | "/data/coredump/core.%h.%e.%p.%t" | 设置 VCI 实例的 coredump 文件保存路径。配置路径后自动开启实例的 coredump 能力。
注意 配置的路径不能以 | 本场景必填 |
最终生成的 core 文件完整路径示例如下所示:
/data/coredump/core.nginx-7855fc5b44-p2rzt.bash.36.1602488967
已创建 VPC-CNI 集群。详细操作,请参见 创建 VPC-CNI 容器网络模型的集群。
coredump 文件一般用于离线分析问题,因此设置 coredump 文件的保存路径时采用外挂存储,而不是内置存储(容器本地路径),从而避免容器退出而丢失 coredump 文件的问题。
下文以文件存储(NAS)作为外挂存储,创建 VCI Deployment 启用 coredump 能力为例,通过存储卷(PV)方式,将 NAS 挂载到 VCI Deployment。详细操作及 YAML 字段说明,请参见 使用 NAS 文件存储静态存储卷。
连接 VPC-CNI 集群。
具体操作说明,请参见 连接集群。
创建 NAS 类型的 PV。
vci-nas-pv.yaml
代码如下:apiVersion: v1 kind: PersistentVolume metadata: name: vci-nas-pv # PV 名称。 spec: accessModes: - ReadWriteMany capacity: storage: 100Gi # NAS 存储容量。 csi: driver: nas.csi.volcengine.com volumeAttributes: fsId: enas-cnbj1b9f******** # NAS 文件系统 ID,仅当文件系统类型为极速型时需要配置。 fsType: Extreme # 文件系统类型,Extreme:极速型;Cache:缓存型;Capcity:容量型。 path: /enas-cnbj1b9f********/temp # NAS 文件系统挂载子目录。 server: cnbj1b9f********.r*********.nas.ivolces.com # NAS 文件系统挂载点地址。 volumeAs: subpath # 创建的子目录类型。subpath:子路径;filesystem:文件系统。 volumeHandle: vci-nas-pv # PV 的唯一标识符,与 PV 名称保持一致。 mountOptions: - nolock,proto=tcp,noresvport - vers=3 persistentVolumeReclaimPolicy: Retain volumeMode: Filesystem
kubectl create -f vci-nas-pv.yaml
创建存储卷声明(PVC)。
vci-nas-pvc.yaml
代码如下:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: vci-nas-pvc # PVC 名称。 namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 100Gi volumeMode: Filesystem volumeName: vci-nas-pv # 绑定到该 PVC 的 PV 名称。
kubectl create -f vci-nas-pvc.yaml
创建 VCI 实例,配置 coredump 文件的保存路径,开启实例的 coredump。
下文以创建 VCI Deployment 为例。创建 VCI 实例相关说明,请参见 创建实例。
vci-nas-coredump-deployment.yaml
代码如下:apiVersion: apps/v1 kind: Deployment metadata: name: vci-nas-coredump-deployment # Deployment 名称。 namespace: default # Deployment 所属命名空间。 labels: app: vci-nas-coredump-deployment spec: replicas: 2 selector: matchLabels: app: vci-nas-coredump-deployment template: metadata: annotations: vke.volcengine.com/burst-to-vci: enforce #强制使用 VCI。 vci.vke.volcengine.com/preferred-instance-family: vci.u1 #指定 VCI 的规格族。 vci.vke.volcengine.com/core-pattern: "/data/coredump/core.%h.%e.%p.%t" #设置 coredump 文件保存路径。 labels: app: vci-nas-coredump-deployment spec: containers: - image: cr-cn-beijing.volces.com/tw/nginx:1.0 # 容器镜像的地址和版本,请配置为您自己的镜像地址。 imagePullPolicy: IfNotPresent name: nginx volumeMounts: - mountPath: /data/coredump/ # NAS 在容器中挂载的位置。本文中需与 coredump 文件保存路径保持一致。 name: vci-nas-volume # 设置卷名称。 volumes: - name: vci-nas-volume # 挂载卷。 persistentVolumeClaim: claimName: vci-nas-pvc # 上一步创建的 PVC 名称。
kubectl create -f vci-nas-coredump-deployment.yaml
您可以在已配置了coredump 文件保存目录的 VCI 实例中触发 coredump。
kubectl get pods -l app=vci-nas-coredump-deployment
kubectl exec -it <已获取的 VCI Pod 名称>
sleep 100
命令后按Ctrl + \
键,触发 coredump。生成的 coredump 文件将自动保存到 NAS 中。