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

  • 相关阅读:
    老生常谈的商城系统(Asp.Net+uniapp)
    1208. 翻硬币
    jmeter-9-断言之JsonSchema(超推荐)
    影响MySql 服务性能最重要的两个参数。
    vivo鲁班RocketMQ平台的消息灰度方案
    Java核心篇,二十三种设计模式(十七),行为型——中介者模式
    Mockito单元测试
    LeetCode 刷题 [C++] 第236题.二叉树的最近公共祖先
    MySQL复制,约束条件,查询与安全控制
    FreeROTS 任务通知和实操 详解
  • 原文地址:https://blog.csdn.net/qq_19734597/article/details/126423757