从VolumeSnapshot还原的Kubernetes PVC为空

问题描述

我正尝试使用VolumeSnapshot中从kubernetes升级beta的{​​{1}}备份mechanism

这是我的情况:

创建Nginx部署及其使用的PVC

1.17
apiVersion: apps/v1
kind: Deployment
Metadata:
  name: Nginx-deployment
spec:
  selector:
    matchLabels:
      app: Nginx
  replicas: 1
  template:
    Metadata:
      labels:
        app: Nginx
    spec:
      containers:
      - name: Nginx
        image: Nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - name: my-pvc
          mountPath: /root/test
      volumes:
        - name: my-pvc
          persistentVolumeClaim:
            claimName: Nginx-pvc

执行到正在运行的apiVersion: v1 kind: PersistentVolumeClaim Metadata: finalizers: null labels: name: Nginx-pvc name: Nginx-pvc namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 8Gi storageClassName: premium-rwo 容器中,cd进入PVC安装路径并创建一些文件

Nginx

使用▶ k exec -it Nginx-deployment-84765795c-7hz5n bash root@Nginx-deployment-84765795c-7hz5n:/# cd /root/test root@Nginx-deployment-84765795c-7hz5n:~/test# touch {1..10}.txt root@Nginx-deployment-84765795c-7hz5n:~/test# ls 1.txt 10.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt lost+found root@Nginx-deployment-84765795c-7hz5n:~/test# 作为源创建以下VolumeSnapshot

Nginx-pvc

使用的apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot Metadata: namespace: default name: Nginx-volume-snapshot spec: volumeSnapshotClassName: pd-retain-vsc source: persistentVolumeClaimName: Nginx-pvc 是以下

VolumeSnapshotClass

,直到它变成apiVersion: snapshot.storage.k8s.io/v1beta1 deletionPolicy: Retain driver: pd.csi.storage.gke.io kind: VolumeSnapshotClass Metadata: creationTimestamp: "2020-09-25T09:10:16Z" generation: 1 name: pd-retain-vsc

readyToUse: true

删除apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot Metadata: creationTimestamp: "2020-11-04T09:38:00Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection generation: 1 name: Nginx-volume-snapshot namespace: default resourceVersion: "34170857" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/Nginx-volume-snapshot uid: ce1991f8-a44c-456f-8b2a-2e12f8df28fc spec: source: persistentVolumeClaimName: Nginx-pvc volumeSnapshotClassName: pd-retain-vsc status: boundVolumeSnapshotContentName: snapcontent-ce1991f8-a44c-456f-8b2a-2e12f8df28fc creationTime: "2020-11-04T09:38:02Z" readyToUse: true restoreSize: 8Gi kind: List Metadata: resourceVersion: "" selfLink: "" 部署和初始PVC

Nginx

使用先前创建的▶ k delete pvc,deploy --all persistentvolumeclaim "Nginx-pvc" deleted deployment.apps "Nginx-deployment" deleted 作为其VolumeSnapshot

,创建一个新的PVC。
dataSource
apiVersion: v1
kind: PersistentVolumeClaim
Metadata:
  finalizers: null
  labels:
    name: Nginx-pvc-restored
  name: Nginx-pvc-restored
  namespace: default
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  dataSource:
    name: Nginx-volume-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io

将新的(还原的)PVC的名称设置为Nginx部署

▶ k create -f Nginx-pvc-restored.yaml
persistentvolumeclaim/Nginx-pvc-restored created

▶ k get pvc
NAME                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
Nginx-pvc-restored   Bound    pvc-56d0a898-9f65-464f-8abf-90fa0a58a048   8Gi        RWO            standard       39s

并再次创建apiVersion: apps/v1 kind: Deployment Metadata: name: Nginx-deployment spec: selector: matchLabels: app: Nginx replicas: 1 template: Metadata: labels: app: Nginx spec: containers: - name: Nginx image: Nginx:1.14.2 ports: - containerPort: 80 volumeMounts: - name: my-pvc mountPath: /root/test volumes: - name: my-pvc persistentVolumeClaim: claimName: Nginx-pvc-restored

Deployment

▶ k create -f Nginx-deployment-restored.yaml deployment.apps/Nginx-deployment created 进入PVC挂载目录。它应包含先前创建的文件,但其为空

cd
▶ k exec -it Nginx-deployment-67c7584d4b-l7qrq bash
root@Nginx-deployment-67c7584d4b-l7qrq:/# cd /root/test
root@Nginx-deployment-67c7584d4b-l7qrq:~/test# ls
lost+found
root@Nginx-deployment-67c7584d4b-l7qrq:~/test#

解决方法

这是发布的社区Wiki答案,用于更清晰地解决当前问题。随时扩展。

正如@pkaramol所提到的,这是在以下线程下注册的一个持续存在的问题:

Creating an intree PVC with datasource should fail #96225

发生了什么:在将intree驱动程序作为默认驱动程序的群集中 storageclass,如果您尝试使用快照数据源创建PVC,并且 忘记将csi storageclass放进去,那么一个空的PVC将是 使用默认的存储类进行配置。

您期望发生的事情:PVC的创建不应继续进行, 而是有一个带有不兼容错误的事件,类似于我们 在csi设置程序中检查正确的csi驱动程序。

在撰写此答案时,尚未解决此问题。