回收策略
典型的StorageClass模板如下所示,通过reclaimPolicy 字段定义生成PV的回收策略:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-disk-efficiency
parameters:
type: cloud_efficiency
provisioner: alicloud/disk
reclaimPolicy: Delete
reclaimPolicy两种常用取值:Delete、Retain;
Delete:表示删除PVC的时候,PV也会一起删除,同时也删除PV所指向的实际存储空间;
Retain:表示删除PVC的时候,PV不会一起删除,而是变成Released状态等待管理员手动清理;
这两种配置各有优缺点:
Delete:
优点:实现数据卷的全生命周期管理,应用删除PVC会自动删除后端云盘。能有效避免出现大量闲置云盘没有删除的情况。
缺点:删除PVC时候一起把后端云盘一起删除,如果不小心误删pvc,会出现后端数据丢失;
Retain:
优点:后端云盘需要手动清理,所以出现误删的可能性比较小;
缺点:没有实现数据卷全生命周期管理,常常会造成pvc、pv删除后,后端云盘闲置往清理,长此以往导致大量磁盘浪费。
阿里云容器服务遵循了K8S官方建议,对云盘数据卷StorageClass默认提供的是Delete配置,这样最大程度避免出现大量闲置磁盘,且提供云盘的全生命周期管理,但是需要您对PVC删除操作格外小心。
当然如果您不想使用Delete这种配置,可以自己定义StorageClass,使用Retain模式,例如:
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: alicloud-disk-ssd-retain
provisioner: alicloud/disk
parameters:
type: cloud_ssd
reclaimPolicy: Retain
更新PV模板
通过上述Delete配置的StorageClass创建的PV如下:
apiVersion: v1
kind: PersistentVolume
metadata:
labels:
failure-domain.beta.kubernetes.io/region: cn-zhangjiakou
failure-domain.beta.kubernetes.io/zone: cn-zhangjiakou-a
name: d-8vbidmq57w4df6k84zem
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 20Gi
flexVolume:
driver: alicloud/disk
fsType: ext4
options:
VolumeId: d-8vbidmq57w4df6k84zem
persistentVolumeReclaimPolicy: Delete
storageClassName: alicloud-disk-efficiency
如果您已经创建了上面的pv并且在使用中,现在希望将pv的回收策略变成Retain模式,可以直接修改PV参数值:
执行edit命令,直接修改persistentVolumeReclaimPolicy的值为Retain,然后:wq 保存退出。
# kubectl edit pv d-8vbidmq57w4df6k84zem
...
persistentVolumeReclaimPolicy: Retain
...
此时删除PVC并不会把pv删除;
# kubectl get pv | grep d-8vbidmq57w4df6k84zem
d-8vbidmq57w4df6k84zem 20Gi RWO Retain Released default/datadir-zookeeper-default-zookeeper-2 alicloud-disk-efficiency 7h1m
反之,将Retain类型的PV变成Delete类型也是一个方法。