【问题标题】:MongoDB not persistent in kubernetesMongoDB 在 Kubernetes 中不持久
【发布时间】:2020-04-17 17:21:25
【问题描述】:

我正在尝试在 k8s 世界中配置 mongodb 部署。 我的 mongo 部署文件如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: panel-admin-mongo-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      component: panel-admin-mongo
  template:
    metadata:
      labels:
        component: panel-admin-mongo
    spec:
      volumes:
        - name: panel-admin-mongo-storage
          persistentVolumeClaim:
            claimName: database-persistent-volume-claim
      containers:
        - name: panel-admin-mongo
          image: mongo
          ports:
            - containerPort: 27017
          volumeMounts:
            - name: panel-admin-mongo-storage
              mountPath: /data/db

Mongo 服务文件:

apiVersion: v1
kind: Service
metadata:
  name: panel-admin-mongo-cluster-ip-service
spec:
  type: ClusterIP
  selector:
    component: panel-admin-mongo
  ports:
    - port: 27017
      targetPort: 27017

还有我的持久音量声明:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: database-persistent-volume-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

当我使用以下方法进入 mongodb 容器时: kubectl exec -it panel-admin-mongo-deployment-6dcfc5b8c7-mk8d5 sh 我在集合中保存了一些用户的电子邮件和密码(例如用户),一切正常。但是当我击落其中的 pod 和容器时,再次启动,数据就消失了。不应该独立于 pod 的生命周期吗?如果是,我错过了什么?

【问题讨论】:

  • 我已经在 Minikube 和 GKE 上复制了您的 yaml 文件,它按预期工作。您能否添加有关如何重现此问题的信息?您如何将这些数据注入数据库?
  • 据我了解,您可以删除 mongo 部署文件并再次启动它,数据会在那里吗?我将使用kubectl exec -it [pod-name] shmongouse [mydbname] 和 f.ex 注入进入 pod 的数据。 db.users.save({ email: "test@test.com" })
  • 是的,对我来说它工作正常。我正在部署你的PersistentVolumeClaim,而不是你的Deployment。我没有更改任何内容,复制并粘贴。

标签: mongodb docker kubernetes


【解决方案1】:

我不是 k8s 专家,但你的问题是你没有使用 Kubernetes statfulsets,看看这里 https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

AFAIK,对于任何持久部署,您都需要使用 statefulsets 制作您的 pod。

【讨论】:

  • 如果使用 PVC,则不需要。
【解决方案2】:

首先,确保你的 pod 成功使用 PVC:

kubectl describe po/${POD_NAME}

并检查Volumes 部分:

Volumes:
  prometheus-operator-db:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  prometheus-operator-db-0
    ReadOnly:   false

如果你成功使用PVC,需要为你检查reclaim-policyPV,这个值应该是persistentVolumeReclaimPolicy":"Retain"

【讨论】:

  • 当我检查回收政策时,它显示delete 的状态为terminating,它就像这样卡住了。当我想删除 pvc 时,它也会卡住
  • 尝试使用标志--force --grace-period=0删除它
  • 我终于用第一个答案stackoverflow.com/questions/51358856/…删除了它
  • 我已将回收政策更改为 retainkubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}',但在检查 pv 时确实不是 retain。但是同样的故事又发生了:我在数据库中保存了一些数据,然后我删除了 mongo 部署和 mongo pod,我再次启动了 mongo 部署,当我进入 pod 内的数据库时,我看不到那里的数据。当我删除 mu mongo 部署时,我可以看到 pv 存在并且它确实有 retain policy
猜你喜欢
  • 2021-04-22
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
相关资源
最近更新 更多