docker - Kubernetes GCP 上的持久磁盘问题
问题描述
我在 GCP 的 Kubernetes 中工作,我遇到了卷和永久磁盘的问题。
我正在使用 Directus 7 (CMS Headless),它将大部分信息保存在数据库中,除了上传的文件,这些文件位于/var/www/html/public/uploads文件夹中(使用 docker-compose 在本地测试并且工作正常),并且该文件夹是我要保存在永久磁盘上的文件夹。
没有发生错误,但是当重新启动 Kubernetes Pod 时,我丢失了上传的图像(它们没有保存在磁盘上)。
这是我的配置:
apiVersion: v1
kind: PersistentVolume
metadata:
name: directus-pv
namespace: default
spec:
storageClassName: ""
capacity:
storage: 100G
accessModes:
- ReadWriteOnce
gcePersistentDisk:
pdName: directus-disk
fsType: ext4
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: directus-pvc
namespace: default
labels:
app: .....
spec:
storageClassName: ""
volumeName: directus-pv
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100G
在 deploy.yaml 中:
volumeMounts:
- name: api-disk
mountPath: /var/www/html/public/uploads
readOnly: false
volumes:
- name: api-disk
persistentVolumeClaim:
claimName: directus-pvc
谢谢您的帮助
解决方案
我假设您手动配置的持久性卷directus-pv是使用 PersistentVolumeReclaimPolicy=* Recycle创建的。这是每次 POD 重新启动时可能导致数据擦除的唯一可能原因。
我无法使用提供的清单文件重现您的案例,但我尝试了以下测试:
- 创建 gcePersistentDisk
- 创建持久卷
- 创建 PersistentVolumeClaim
- 像这样创建 ReplicaSet (replicas=1)
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: busybox-list-uploads
spec:
replicas: 1
template:
metadata:
labels:
app: busybox-list-uploads
version: "2"
spec:
containers:
- image: busybox
args: [/bin/sh, -c, 'sleep 9999' ]
volumeMounts:
- mountPath: /var/www/html/public/uploads
name: api-disk
name: busybox
volumes:
- name: api-disk
persistentVolumeClaim:
claimName: directus-pvc
- 将一些文件写入已安装的文件夹 /var/www/html/public/uploads
- 通过将副本大小调整为 0 然后再调整为 1 来重新启动 POD(=杀死 POD)
- 列出新创建的 POD 上 /var/www/html/public/uploads 的内容
对于我在busybox-list-uploads-dgfbc;做 kubectl exec -it $i -- ls /var/www/html/public/uploads; 完毕; 丢失+找到图片_from_busybox-list-uploads-ng4t6.png
如您所见,输出清楚地表明,数据在 POD 重启后仍然存在
* 您可以使用 cmd 进行验证:kubectl get pv/directus-pv -o yaml
推荐阅读
- javascript - 文件阅读器很慢并且没有在 React 上设置状态
- python - PySpark - 基于开始/结束日期的行数
- django - 让 Docker 访问容器外的 db 文件
- spring - maven wrapper (mvnw) 提供热交换?
- javascript - 消息事件中的回调突变
- regex - 正则表达式查找带有 0 的单词
- docker - 以 root 身份运行代理 docker 时 Jenkins Build Pipeline deleteDIR() 问题
- python - 用模数对 numpy 数组求和
- python - 将列表中的项目写入不同的文件Python
- java - Optional 的什么等价于 Optional.empty()?或者,一个更好的方式来写这个