一.概念

PersistentVolumes 可以有多种回收策略,包括 "Retain"、"Recycle" 和 "Delete"。对于动态配置的 PersistentVolumes 来说,默认回收策略为 "Delete"。这表示当用户删除对应的 PersistentVolumeClaim 时,动态配置的 volume 将被自动删除。 如果 volume 包含重要数据时,这种自动行为可能是不合适的。 那种情况下,更适合使用 "Retain" 策略。使用 "Retain" 时,如果用户删除 PersistentVolumeClaim,对应的 PersistentVolume 不会被删除。相反,它将变为 Released 状态,表示所有的数据可以被手动恢复

二.恢复数据(基于aws efs)

1.全局配置文件

[bpmdev@bpm static]$ cat busybox_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: busybox
  name: busybox
  namespace: test-persistentvolume
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox
        command: ["/bin/sh"]
        args: ["-c","while true;do echo $(date -u) >> /data/out1.txt;sleep 5;done"]
        volumeMounts:
        - name: busybox-storage
          mountPath: /data
          subPath: busybox
      volumes:
      - name: busybox-storage
        persistentVolumeClaim:
          claimName: busybox-efs-claim

---
deployment-recovery 作用:每隔5秒打印时间戳到/data/out2.txt
[bpmdev@bpm static]$ cat busybox_deployment-recovery.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: busybox-recovery
  name: busybox-recovery
  namespace: test-persistentvolume
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox-recovery
  template:
    metadata:
      labels:
        app: busybox-recovery
    spec:
      containers:
      - name: busybox-recovery
        image: busybox
        command: ["/bin/sh"]
        args: ["-c","while true;do echo $(date -u) >> /data/out2.txt;sleep 5;done"]
        volumeMounts:
        - name: busybox-storage
          mountPath: /data
          subPath: busybox
      volumes:
      - name: busybox-storage
        persistentVolumeClaim:
          claimName: busybox-efs-claim
---
pvc
[bpmdev@bpm static]$ cat busybox_pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: busybox-efs-claim
  namespace: test-persistentvolume
spec:
  accessModes:
  - ReadWriteMany
  storageClassName: efs-sc
  resources:
    requests:
      storage: 5Gi

---
pv
[bpmdev@bpm static]$ cat busybox_pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: busybox-efs-pv
  namespace: test-persistentvolume
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteMany
  storageClassName: efs-sc
  #persistentVolumeReclaimPolicy: Recycle
  persistentVolumeReclaimPolicy: Retain
    #persistentVolumeReclaimPolicy: Delete
  csi:
    driver: efs.csi.aws.com
    volumeHandle: xxxxxxxx

2.依次创建:pv,pvc,deployment,然后再删除pvc,deployment,此时pv的状态为Released

3.编辑当前pv的内存文件,删除claimRef字段值并将STATUS值由Release修改为Available

kubectl edit pv/busybox-efs-pv -n test-persistentvolume
```
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"labels":{"pv":"test001"},"name":"busybox-efs-pv"},"spec":{"accessModes":["ReadWriteMany"],"capacity":{"storage":"5Gi"},"csi":{"driver":"efs.csi.aws.com","volumeHandle":"fs-0651fbb10903bddf7"},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"efs-sc","volumeMode":"Filesystem"}}
    pv.kubernetes.io/bound-by-controller: "yes"
  creationTimestamp: "2024-05-23T05:41:33Z"
  finalizers:
  - kubernetes.io/pv-protection
  labels:
    pv: test001
  name: busybox-efs-pv
  resourceVersion: "42501918"
  uid: 67142a43-480f-48fc-893a-da668d752e06
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 5Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: busybox-efs-claim
    namespace: test-persistentvolume
    resourceVersion: "42501030"
    uid: 45ba88d4-009a-4f87-afd8-59d62d8997d7
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-0651fbb10903bddf7
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  volumeMode: Filesystem
status:
  phase: Released
```

4.此时pv变为可用,创建挂载pvc,就可以绑定了pv了,可以看到数据已恢复

[bpmdev@bpm static]$ kubectl get pv,pvc,deployment -n test-persistentvolume
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                          STORAGECLASS   REASON   AGE
persistentvolume/busybox-efs-pv                             5Gi        RWX            Retain           Available                                  efs-sc
```
重新应用pvc文件,并部署新的deployment-recovery,该文件会写out2.txt日志文件
```
[bpmdev@bpm static]$ kubectl apply -f busybox_pvc.yaml
persistentvolumeclaim/busybox-efs-claim created
[bpmdev@bpm static]$ kubectl get pv,pvc,deployment -n test-persistentvolume
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                     STORAGECLASS   REASON   AGE
persistentvolume/busybox-efs-pv                             5Gi        RWX            Retain           Bound    test-persistentvolume/busybox-efs-claim   efs-sc
[bpmdev@bpm static]$ kubectl apply -f busybox_deployment-recovery.yaml
deployment.apps/busybox-recovery created
### 已恢复数据
[bpmdev@bpm static]$ kubectl exec -it deployment/busybox-recovery -n test-persistentvolume sh
/ # ls /data/
out1.txt  out2.txt