最近,我在mongo部署到GKE上的托管Pod被自动删除,并在其位置创建了一个新Pod。结果,我所有的数据库数据都丢失了。
我为部署指定了PV,并且PVC也已绑定,并且我使用了标准存储类(google永久磁盘)。永久数量声明也未删除。
以下是kubectl get pv
的结果图像:
pvc
我的mongo部署以及持久的批量声明和服务部署都是通过使用kubernets的kompose
工具从docker-compose.yml进行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永久磁盘,但根目录中没有任何内容我不知道还能去哪里。
我猜测由于某种原因,mongo部署在启动新的pod时并没有从持久卷中提取旧数据,这非常令人困惑。
我还有另一个kubernetes项目,发生了同样的事情,除了旧的pod仍然显示但状态为evicted
。
答案 0 :(得分:0)
我尝试检查/ 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可能实际上并没有将任何数据保存到您的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