取消或撤消kubernetes集群中持久卷的删除

Hob*_*-42 9 kubernetes persistent-volumes

意外地试图删除群集中的所有PV,但幸运的是他们仍然拥有绑定到它们的PVC,因此所有PV都被困在Status:Terminating中.

如何让PV从"终止"状态恢复到健康状态,在那里它被"绑定"到pvc并且完全正常工作?

这里的关键是我不想丢失任何数据,我想确保卷功能正常,并且如果声明消失则不会有被终止的风险.

以下是kubectl describePV上的一些细节.

$ kubectl describe pv persistent-vol-1
Finalizers:      [kubernetes.io/pv-protection foregroundDeletion]
Status:          Terminating (lasts 1h)
Claim:           ns/application
Reclaim Policy:  Delete
Run Code Online (Sandbox Code Playgroud)

这是对索赔的描述.

$ kubectl describe pvc application
Name:          application
Namespace:     ns
StorageClass:  standard
Status:        Bound
Volume:        persistent-vol-1
Run Code Online (Sandbox Code Playgroud)

Joh*_*ohn 11

编辑:这仅适用于您删除了 PVC 而不是 PV 的情况。如果您删除了 PV 本身或磁盘可能会被删除,请不要按照这些说明操作!

由于一个粗心的错误,我发现自己处于同样的情况。它是在 Google Cloud/GKE 上使用 statefulset。我的 PVC 说终止,因为引用它的 pod 仍在运行,并且 PV 配置了已删除的保留策略。我最终找到了一种更简单的方法来理顺所有内容,同时保留所有额外的 Google/Kubernetes 元数据和名称。

首先,我会按照另一个答案的建议制作磁盘快照。您不需要它,但如果出现问题,则可以使用此处的另一个答案从中重新创建磁盘。

简短的版本是您只需要将 PV 重新配置为“保留”,允许删除 PVC,然后从 PV 中删除先前的声明。然后可以将新的 PVC 绑定到它,一切都很好。

细节:

  1. 查找 PV 的全名:
    kubectl get pv
Run Code Online (Sandbox Code Playgroud)
  1. 重新配置您的 PV 以将回收策略设置为“保留”:(我在 Windows 上执行此操作,因此您可能需要根据操作系统以不同方式处理引号)
    kubectl patch pv <your-pv-name-goes-here> -p "{\"spec\":{\"persistentVolumeReclaimPolicy\":\"Retain\"}}"
Run Code Online (Sandbox Code Playgroud)
  1. 验证 PV 的状态现在是否为 Retain。
  2. 关闭您的 pod/statefulset(并且不允许它重新启动)。完成后,您的 PVC 将被删除,PV(及其引用的磁盘!)将保持不变。
  3. 编辑PV:
    kubectl edit pv <your-pv-name-goes-here>
Run Code Online (Sandbox Code Playgroud)
  1. 在编辑器中,删除整个“claimRef”部分。从(并包括)“claimRef:”中删除所有行,直到下一个具有相同缩进级别的标记。要删除的行应该或多或少像这样:
      claimRef:
        apiVersion: v1
        kind: PersistentVolumeClaim
        name: my-app-pvc-my-app-0
        namespace: default
        resourceVersion: "1234567"
        uid: 12345678-1234-1234-1234-1234567890ab
Run Code Online (Sandbox Code Playgroud)
  1. 保存更改并关闭编辑器。检查 PV 的状态,它现在应该显示“可用”。
  2. 现在,您可以完全按照最初的方式重新创建 PVC。然后应该找到现在“可用”的 PV 并将其自身绑定到它。就我而言,我将 PVC 与我的 statefulset 定义为 volumeClaimTemplate,所以我所要做的就是“kubectl apply”我的 statefulset。


Uro*_* T. 8

这是,实际上,可以将数据从存储PersistentVolumeStatus: TerminatingRetainPolicy设定为默认值(删除).我们在GKE上这样做了,不确定AWS或Azure,但我猜它们是相似的

我们有同样的问题,我会在这里发布我们的解决方案,以防其他人有这样的问题.

PersistenVolumes在存在pod,部署或更具体的情况下,您将不会被终止 - PersistentVolumeClaim使用它.

我们采取的措施来纠正我们破碎的状态:

一旦你处于OP状态,你要做的第一件事就是创建你的快照PersistentVolumes.

在GKE控制台中,转到Compute Engine -> Disks并找到您的卷(使用kubectl get pv | grep pvc-name)并创建卷的快照.

使用快照创建磁盘: gcloud compute disks create name-of-disk --size=10 --source-snapshot=name-of-snapshot --type=pd-standard --zone=your-zone

此时,使用卷停止服务并删除卷和卷声明.

使用磁盘中的数据手动重新创建卷:

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: name-of-pv
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 10Gi
  gcePersistentDisk:
    fsType: ext4
    pdName: name-of-disk
  persistentVolumeReclaimPolicy: Retain
Run Code Online (Sandbox Code Playgroud)

现在只需更新您的卷声明以定位特定卷,即yaml文件的最后一行:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
  namespace: my-namespace
  labels:
    app: my-app
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  volumeName: name-of-pv
Run Code Online (Sandbox Code Playgroud)


Vit*_*Vit 0

不幸的是,在这种情况下您无法保存 PV 和数据。\n您所能做的就是重新创建 PV Reclaim Policy: Retain- 这将防止将来数据丢失。\n您可以在此处此处阅读有关回收策略的更多信息。

\n\n
\n

如果我删除 PersistentVolumeClaim (PVC) 会发生什么?如果卷是动态设置的,则默认回收策略将设置为\n \xe2\x80\x9cdelete\xe2\x80\x9d。这意味着,默认情况下,当 PVC 被删除时,底层的 PV 和存储资产也将被删除。如果要保留卷上存储的数据,则必须在以下时间后将回收策略从 \xe2\x80\x9cdelete\xe2\x80\x9d 更改为 \xe2\x80\x9cretain\xe2\x80\x9d PV 已配置。

\n
\n