Hob*_*-42 9 kubernetes persistent-volumes
意外地试图删除群集中的所有PV,但幸运的是他们仍然拥有绑定到它们的PVC,因此所有PV都被困在Status:Terminating中.
如何让PV从"终止"状态恢复到健康状态,在那里它被"绑定"到pvc并且完全正常工作?
这里的关键是我不想丢失任何数据,我想确保卷功能正常,并且如果声明消失则不会有被终止的风险.
以下是kubectl describe
PV上的一些细节.
$ 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 绑定到它,一切都很好。
细节:
kubectl get pv
Run Code Online (Sandbox Code Playgroud)
kubectl patch pv <your-pv-name-goes-here> -p "{\"spec\":{\"persistentVolumeReclaimPolicy\":\"Retain\"}}"
Run Code Online (Sandbox Code Playgroud)
kubectl edit pv <your-pv-name-goes-here>
Run Code Online (Sandbox Code Playgroud)
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)
这是,实际上,可以将数据从存储PersistentVolume
与Status: Terminating
和RetainPolicy
设定为默认值(删除).我们在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)
不幸的是,在这种情况下您无法保存 PV 和数据。\n您所能做的就是重新创建 PV Reclaim Policy: Retain
- 这将防止将来数据丢失。\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
归档时间: |
|
查看次数: |
4242 次 |
最近记录: |