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


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

    问题复现

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

    1. apiVersion: apps/v1
    2. kind: StatefulSet
    3. metadata:
    4. name: mongo
    5. namespace: default
    6. spec:
    7. podManagementPolicy: OrderedReady
    8. replicas: 3
    9. revisionHistoryLimit: 10
    10. selector:
    11. matchLabels:
    12. k8s-app: mongo
    13. serviceName: mongo
    14. template:
    15. metadata:
    16. labels:
    17. k8s-app: mongo
    18. spec:
    19. containers:
    20. - command:
    21. - mongod
    22. - --bind_ip
    23. - 0.0.0.0
    24. - --replSet
    25. - config
    26. - --configsvr
    27. image: mongo:3.6
    28. imagePullPolicy: IfNotPresent
    29. name: mongo
    30. resources: {}
    31. securityContext:
    32. privileged: false
    33. terminationMessagePath: /dev/termination-log
    34. terminationMessagePolicy: File
    35. volumeMounts:
    36. - mountPath: /data
    37. name: mongo-pvc
    38. dnsPolicy: ClusterFirst
    39. restartPolicy: Always
    40. schedulerName: default-scheduler
    41. securityContext: {}
    42. terminationGracePeriodSeconds: 30
    43. updateStrategy:
    44. rollingUpdate:
    45. partition: 0
    46. type: RollingUpdate
    47. volumeClaimTemplates:
    48. - apiVersion: v1
    49. kind: PersistentVolumeClaim
    50. metadata:
    51. name: mongo-pvc
    52. spec:
    53. accessModes:
    54. - ReadWriteOnce
    55. resources:
    56. requests:
    57. storage: 10Gi
    58. storageClassName: cbs
    59. 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的挂载点同名,将其覆盖,类似这样

    1. spec:
    2. template:
    3. spec:
    4. volumeMounts:
    5. - mountPath: /data/db
    6. name: mongo-pvc
    7. volumeClaimTemplates:
    8. - apiVersion: v1
    9. kind: PersistentVolumeClaim
    10. metadata:
    11. creationTimestamp: null
    12. name: mongo-pvc
    13. spec:
    14. accessModes:
    15. - ReadWriteOnce
    16. resources:
    17. requests:
    18. storage: 10Gi
    19. storageClassName: cbs
    20. volumeMode: Filesystem

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

  • 相关阅读:
    Python3 语法简明教程
    德国金融监管机构网站遭遇大规模DDoS攻击后“瘫痪”
    【Spark】Spark 高频面试题英语版(1)
    Verilog刷题[hdlbits] :Always if2
    【BUG】记录使用PageHelper分页工具出现的问题?全是细节~
    OLED透明屏交互技术:开创未来科技的新篇章
    国庆要闻回顾 | OpenAI 拟研发 AI 手机;9月以太坊上NFT销售量创2021年2月以来最低记录...
    node+websocket数据通信(发送和接收数据)
    【Linux】了解文件的inode元信息,以及日志分析
    二维码智慧门牌管理系统升级解决方案:地图展示
  • 原文地址:https://blog.csdn.net/qq_19734597/article/details/126423757