首页 > 解决方案 > Pod 重启后 Kubenetes Mongo 部署丢失数据

问题描述

最近,我在 GKE 上的 mongo 部署中的托管 pod 被自动删除,并在其位置创建了一个新 pod。结果,我所有的数据库数据都丢失了。

我为部署指定了一个 PV,PVC 也被绑定,并且我使用了标准存储类(谷歌永久磁盘)。Persistent Volume Claim 也没有被删除。

这是来自以下结果的图像kubectl get pvpvc

我的 mongo 部署以及持久卷声明和服务部署都是使用 docker kompose-compose.yml 中的 kubernets 工具创建的,用于prisma 1 + mongodb部署。

这是我的yamls:

mongo-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose -f docker-compose.yml convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: mongo
  name: mongo
  namespace: dbmode
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: mongo
  strategy:
    type: Recreate
  template:
    metadata:
      annotations:
        kompose.cmd: kompose -f docker-compose.yml convert
        kompose.version: 1.21.0 (992df58d8)
      creationTimestamp: null
      labels:
        io.kompose.service: mongo
    spec:
      containers:
      - env:
        - name: MONGO_INITDB_ROOT_PASSWORD
          value: prisma
        - name: MONGO_INITDB_ROOT_USERNAME
          value: prisma
        image: mongo:3.6
        imagePullPolicy: ""
        name: mongo
        ports:
        - containerPort: 27017
        resources: {}
        volumeMounts:
        - mountPath: /var/lib/mongo
          name: mongo
      restartPolicy: Always
      serviceAccountName: ""
      volumes:
      - name: mongo
        persistentVolumeClaim:
          claimName: mongo
status: {}

mongo-persistentvolumeclaim.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: mongo
  name: mongo
  namespace: dbmode
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
status: {}

mongo-service.yaml

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: kompose -f docker-compose.yml convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: mongo
  name: mongo
  namespace: dbmode
spec:
  ports:
  - name: "27017"
    port: 27017
    targetPort: 27017
  selector:
    io.kompose.service: mongo
status:
  loadBalancer: {}

我已经尝试检查安装的内容/var/lib/mongo,但我得到的只是一个空lost+found/文件夹,我尝试搜索 Google Persistent Disks,但根目录中没有任何内容,我不知道该去哪里找。

我想由于某种原因,mongo 部署在启动新 pod 时没有从持久卷中提取旧数据,这非常令人困惑。

我还有另一个 kubernetes 项目发生了同样的事情,除了旧的 pod 仍然显示但有一个evicted状态。

标签: mongodbkubernetesgoogle-kubernetes-enginekubernetes-podpersistent-volumes

解决方案


我试过检查安装在 /var/lib/mongo 中的内容,我得到的只是一个空的 lost+found/ 文件夹,

好的,但是您是否检查过它实际上是在Pod重新启动和数据丢失之前在那里保存数据?我猜它从未在该目录中保存任何数据。

我通过运行一个简单的命令检查了您使用的图像Pod

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-pod
    image: mongo:3.6

当您通过运行连接到它时:

kubectl exec -ti my-pod -- /bin/bash

并检查默认的 mongo 配置文件:

root@my-pod:/var/lib# cat /etc/mongod.conf.orig
# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb # 
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

您可以看到dbPath实际设置为/var/lib/mongodb设置为的其他内容/var/lib/mongo

所以很有可能你的 mongo 实际上并没有将任何数据保存到你的PVie 到/var/lib/mongo它的安装目录,而是/var/lib/mongodb按照其配置文件中的说明保存。

kubectl exec您应该可以通过正在运行的 mongo pod轻松检查它:

kubectl exec -ti <mongo-pod-name> -- /bin/bash

并验证数据的保存位置。

如果您没有以任何方式覆盖原始配置文件(例如通过提供ConfigMap),mongo则应将其数据保存到/var/lib/mongodb该目录,而不是卷的挂载点,它是Pod文件系统及其临时文件的一部分。

更新:

以上/etc/mongod.conf.orig只是一个模板,并不反映实际应用的配置。

如果你运行:

kubectl logs your-mongo-pod

它将显示数据目录的位置:

$ kubectl logs my-pod 
2020-12-16T22:20:47.472+0000 I CONTROL  [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=my-pod
2020-12-16T22:20:47.473+0000 I CONTROL  [initandlisten] db version v3.6.21
...

如我们所见,数据保存在/data/db

dbpath=/data/db

推荐阅读