You need to enable JavaScript to run this app.
导航

容器 coredump 持久化

最近更新时间2024.02.04 16:13:22

首次发布时间2024.01.30 10:58:46

VCI 支持获取进程的 coredump 文件,您可以使用 coredump 文件分析和定位容器异常问题。本文主要描述 VCI 容器 coredump 持久化方法。

背景信息

coredump 又叫核心转储,当程序运行过程中发生异常,程序异常退出时,由操作系统把程序当前的内存状况存储在一个 core 文件中,该步骤叫 coredump。在 VCI 容器异常终止情况下,如果业务日志中没有足够的信息来定位问题原因,则需要结合 coredump 文件来进一步分析和定位问题原因。本文将介绍如何使容器产生 coredump 文件并保存到外部存储。

功能介绍

VCI 实例默认关闭 coredump,避免磁盘占用过多而导致业务不可用。您可以在创建 VCI 实例时通过 Pod Annotation 开启 coredump。

Annotation KeyAnnotation Value 示例值说明是否必填

vci.vke.volcengine.com/core-pattern

"/data/coredump/core.%h.%e.%p.%t"

设置 VCI 实例的 coredump 文件保存路径。配置路径后自动开启实例的 coredump 能力。
取值格式示例:/data/coredump/core.%h.%e.%p.%t。取值说明如下:

  • /data/coredump/:coredump 文件保存目录,请配置为您自己的目录。
  • core.%h.%e.%p.%t:coredump 文件名称。%h%e%p%t均表示占位符,可按需配置。占位符说明如下:
    • %h:VCI Pod 的名称(主机名),建议配置。
    • %e:程序文件名,建议配置。
    • %p:进程 ID,可选配置。
    • %t: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 文件存储静态存储卷

  1. 连接 VPC-CNI 集群。
    具体操作说明,请参见 连接集群

  2. 创建 NAS 类型的 PV。

    1. 创建 PV 的 YAML 文件。示例 YAML 文件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:缓存型;Common:通用型。
            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 
      
    2. 执行以下命令,创建 PV。
      kubectl create -f vci-nas-pv.yaml
      
  3. 创建存储卷声明(PVC)。

    1. 创建 PVC 的 YAML 文件。示例 YAML 文件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 名称。
      
    2. 执行以下命令,创建 PVC。
      kubectl create -f vci-nas-pvc.yaml
      
  4. 创建 VCI 实例,配置 coredump 文件的保存路径,开启实例的 coredump。
    下文以创建 VCI Deployment 为例。创建 VCI 实例相关说明,请参见 创建实例

    1. 创建 VCI Deployment 的 YAML 文件。示例 YAML 文件vci-nas-pvc.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 名称。
    
    1. 执行以下命令,创建 Deployment。
      kubectl create -f vci-nas-coredump-deployment.yaml
      

验证结果

您可以在已配置了coredump 文件保存目录的 VCI 实例中触发 coredump。

  1. 执行以下命令获取 VCI Deployment 下 Pod 的名称。
    kubectl get pods -l app=vci-nas-coredump-deployment
    
  2. 执行以下命令登录 VCI Pod。
    kubectl exec -it <已获取的 VCI Pod 名称>
    
  3. 在容器内执行sleep 100命令后按Ctrl + \键,触发 coredump。生成的 coredump 文件将自动保存到 NAS 中。
    预期返回结果如下:
    alt