Kubernetes Mongo 部署在 Pod 重启后丢失数据

Kubenetes Mongo Deployment Loses Data After Pod Restart

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

我为部署指定了一个 PV,也绑定了 PVC,我使用的是标准存储 class(google 永久磁盘)。 Persistent Volume Claim 也没有被删除。

这是 kubectl get pv 结果的图片: pvc

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

这是我的 yaml:

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 永久磁盘但是那里根目录中什么也没有,我不知道还能去哪里找。

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

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

I've tried checking the contents mounted in /var/lib/mongo and all I got was an empty lost+found/ folder,

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

我检查了你使用的图像 运行ning 一个简单的 Pod:

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

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

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 并且 NOT 设置为 /var/lib/mongo

所以很可能您的 mongo 实际上并没有将任何数据保存到您的 PV,即保存到 /var/lib/mongo 目录,它被挂载到 /var/lib/mongodb如其配置文件中所述。

您应该可以通过 kubectl exec 到您的 运行ning mongo 播客轻松查看它:

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