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



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

我为部署指定了一个PV,PVC也被绑定了,我使用了标准存储类(谷歌持久磁盘(。持久卷声明也未被删除。

以下是kubectl get pv的结果图像:聚氯乙烯

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

这是我的山芋:

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/文件夹,我试着搜索谷歌持久磁盘,但根目录中没有任何内容,我不知道还能在哪里找。

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

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

我已经尝试检查安装在/var/lib/mongo中的内容得到的是一个空的丢失+找到/文件夹,

好,但在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,而NOT被设置为/var/lib/mongo

因此,很可能您的mongo实际上并没有将任何数据保存到PV,即安装它的/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

最新更新