首页 > 解决方案 > 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

谢谢您的帮助

标签: dockerkubernetesgoogle-cloud-platformpersistent-storagedirectus

解决方案


我假设您手动配置的持久性卷directus-pv是使用 PersistentVolumeReclaimPolicy=* Recycle创建的。这是每次 POD 重新启动时可能导致数据擦除的唯一可能原因。

我无法使用提供的清单文件重现您的案例,但我尝试了以下测试:

  1. 创建 gcePersistentDisk
  2. 创建持久卷
  3. 创建 PersistentVolumeClaim
  4. 像这样创建 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

  1. 将一些文件写入已安装的文件夹 /var/www/html/public/uploads
  2. 通过将副本大小调整为 0 然后再调整为 1 来重新启动 POD(=杀死 POD)
  3. 列出新创建的 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


推荐阅读