问题描述
我正尝试使用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
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
▶ 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驱动程序。
在撰写此答案时,尚未解决此问题。