前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用pvc持久卷后,持久卷内数据丢失问题

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

原创
作者头像
铜锣烧
修改2022-06-19 08:55:58
9820
修改2022-06-19 08:55:58
举报

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

问题复现

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

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:

/images/pvc-data-lose/1.png
/images/pvc-data-lose/1.png

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

/images/pvc-data-lose/2.png
/images/pvc-data-lose/2.png

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

原因分析

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

/images/pvc-data-lose/3.png
/images/pvc-data-lose/3.png

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

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

/images/pvc-data-lose/4.png
/images/pvc-data-lose/4.png

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

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后,再次测试,数据丢失的问题已经解决。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题复现
  • 原因分析
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档