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
最近,我在 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