Kubernetes 使用 PVC 持久卷后,持久卷内数据丢失问题

Posted 张志翔 ̮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes 使用 PVC 持久卷后,持久卷内数据丢失问题相关的知识,希望对你有一定的参考价值。

        背景:使用dockerhub官方的mongodb 3.6部署了3副本的workload,但是每次重启pod,都会发现原本该pod写入持久卷的数据丢失,经过排查,找到了问题所在。

问题复现

        用户使用如下yaml文件创建了workload

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongo
  namespace: default
spec:
  podManagementPolicy: OrderedReady
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: mongo
  serviceName: mongo
  template:
    metadata:
      labels:
         k8s-app: mongo
    spec:
      containers:
      - command:
        - mongod
        - --bind_ip
        - 0.0.0.0
        - --replSet
        - config
        - --configsvr
        image: mongo:3.6
        imagePullPolicy: IfNotPresent
        name: mongo
        resources: 
        securityContext:
          privileged: false
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /data
          name: mongo-pvc
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: 
      terminationGracePeriodSeconds: 30
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate
  volumeClaimTemplates:
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mongo-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: cbs
      volumeMode: Filesystem

        因根据dockerhub页面所描述,默认存放db数据的路径为/data/db:

        故将数据卷挂载至pod内的/data目录看似并无问题,创建后也正常启动,并写入数据,一切看似都再正常不过。

        但是当pod发生重启后,pod内的数据就会全部丢失。

原因分析

        通过findmnt命令查询,发现/data/db/data/configdb并未出现在所挂载pvc对应的/data下,而是被挂载至了/dev/vda1

        这就是问题的关键了,那么是什么原因造成此问题的呢?

        通过docker history --no-trunc mongo:3.6查看镜像的构建历史发现,此dockerfile在构建时有使用VOLUME命令,手工挂载了/data/db/data/configdb

        dockerfile构建后的镜像中,VOLUME中的操作并不会被kubernetes忽略,而是会继续挂载,如需要将其覆盖,必须要手工指定pvc的挂载点同名,将其覆盖,类似这样

spec:
  template:
    spec:
        volumeMounts:
        - mountPath: /data/db
          name: mongo-pvc
  volumeClaimTemplates:
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      creationTimestamp: null
      name: mongo-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: cbs
      volumeMode: Filesystem

        调整挂载点为/data/db/data/configdb后,再次测试,数据丢失的问题已经解决。

以上是关于Kubernetes 使用 PVC 持久卷后,持久卷内数据丢失问题的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes PV与PVC 持久卷应用

Kubernetes PV与PVC 持久卷应用

Kubernetes PV与PVC 持久卷应用

Kubernetes 系列:持久化存储 PV与PVC

[kubernetes] 持久化存储之静态PV/PVC

云原生 | kubernetes 资源对象 - 持久化存储PV,PVC