gmi*_*ile 11 google-cloud-storage google-cloud-platform kubernetes google-kubernetes-engine
TL; DR.关于如何在删除PVC后访问数据,以及为什么PV在删除PVC后不会消失,我很遗憾.
我正在采取的步骤:
手动在GCE中创建了一个磁盘:
gcloud compute disks create --size 5Gi disk-for-rabbitmq --zone europe-west1-b
Run Code Online (Sandbox Code Playgroud)跑:
kubectl apply -f /tmp/pv-and-pvc.yaml
Run Code Online (Sandbox Code Playgroud)
使用以下配置:
# /tmp/pv-and-pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-for-rabbitmq
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 5Gi
gcePersistentDisk:
fsType: ext4
pdName: disk-for-rabbitmq
persistentVolumeReclaimPolicy: Delete
storageClassName: standard
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-for-rabbitmq
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard
volumeName: pv-for-rabbitmq
Run Code Online (Sandbox Code Playgroud)手动删除了一个PVC(在高级别:我在这里模拟一个灾难性的场景,比如意外删除或错误配置一个helm
版本):
kubectl delete pvc pvc-for-rabbitmq
Run Code Online (Sandbox Code Playgroud)此时我看到以下内容:
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-for-rabbitmq 5Gi RWO Delete Released staging/pvc-for-rabbitmq standard 8m
$
Run Code Online (Sandbox Code Playgroud)
一个附带问题,只是提高我的理解:为什么PV仍然在那里,即使它有一个回收政策设置
Delete
?这不是文档对Delete
回收政策的说法吗?
现在,如果我尝试重新创建PVC以重新获得对PV中数据的访问权限:
$ kubectl apply -f /tmp/pv-and-pvc.yaml
persistentvolume "pv-for-rabbitmq" configured
persistentvolumeclaim "pvc-for-rabbitmq" created
$
Run Code Online (Sandbox Code Playgroud)
我仍然得到这个pv
,例如PV陷入Released
状态:
$
kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-for-rabbitmq 5Gi RWO Delete Released staging/pvc-for-rabbitmq standard 15m
$
Run Code Online (Sandbox Code Playgroud)
......我得到的是pvc
s:
$
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-for-rabbitmq Pending pv-for-rabbitmq 0 standard 1m
$
Run Code Online (Sandbox Code Playgroud)
看起来我的PV处于停滞Released
状态,并且PVC无法访问未处于Available
状态的PV .
那么,为什么同样的PV和PVC再也不能成为朋友呢?如何让PVC重新获得对现有PV中数据的访问权限?
Bha*_*bra 39
kubectl patch pv pv-for-rabbitmq -p '{"spec":{"claimRef": null}}'
Run Code Online (Sandbox Code Playgroud)
这对我有用。
小智 9
关于PV的官方文档有这样的答案:
\n回收Retain
策略允许手动回收资源。PersistentVolumeClaim
删除后,PersistentVolume
仍然存在,并且该卷被视为 \xe2\x80\x9creleased\xe2\x80\x9d。但它还不能用于其他声明,因为之前的声明者\xe2\x80\x99s 数据仍保留在该卷上。管理员可以通过以下步骤手动回收卷。
PersistentVolume
. 删除 PV 后,\n外部基础设施(例如 AWS EBS、GCE PD、Azure 磁盘或 Cinder 卷)中的关联存储资产仍然存在。PersistentVolume
存储资产定义创建一个新资产。“Pod 消耗节点资源,PVC 消耗 PV 资源”这句话可能有助于充分理解 PV 和 PVC 之间的理论和友谊。
我尝试完全重现使用提供的 YAML 文件记录的行为,但失败了,并且返回了预期结果。因此,在提供任何进一步的细节之前,这里是我的复制品的演练。
第 1 步:在 Europe-west1 区域创建 PD
sunny@dev-lab:~$ gcloud compute disks create --size 5Gi disk-for-rabbitmq --zone europe-west1-b
WARNING: You have selected a disk size of under [200GB]. This may result in poor I/O
performance. For more information, see:
NAME ZONE SIZE_GB TYPE STATUS
disk-for-rabbitmq europe-west1-b 5 pd-standard READY
Run Code Online (Sandbox Code Playgroud)
步骤2:使用项目YAML文件创建PV和PVC
sunny@dev-lab:~$ kubectl apply -f pv-and-pvc.yaml
persistentvolume "pv-for-rabbitmq" created
persistentvolumeclaim "pvc-for-rabbitmq" created
Run Code Online (Sandbox Code Playgroud)
步骤3:列出所有可用的PVC
sunny@dev-lab:~$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-for-rabbitmq Bound pv-for-rabbitmq 5Gi RWO standard 16s
Run Code Online (Sandbox Code Playgroud)
步骤 4:列出所有可用的 PV
sunny@dev-lab:~$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-for-rabbitmq 5Gi RWO Delete Bound default/pvc-for-rabbitmq standard 28s
Run Code Online (Sandbox Code Playgroud)
步骤5:删除PVC并验证结果
sunny@dev-lab:~$ kubectl delete pvc pvc-for-rabbitmq
persistentvolumeclaim "pvc-for-rabbitmq" deleted
sunny@dev-lab:~$ kubectl get pv
Run Code Online (Sandbox Code Playgroud)
没有找到资源。
sunny@dev-lab:~$ kubectl get pvc
Run Code Online (Sandbox Code Playgroud)
没有找到资源。
sunny@dev-lab:~$ kubectl describe pvc-for-rabbitmq
Run Code Online (Sandbox Code Playgroud)
服务器没有资源类型“pvc-for-rabbitmq”
根据你的问题
一个附带问题,只是提高我的理解:为什么 PV 仍然存在,即使它的回收策略设置为“删除”?这不是文档中所说的删除回收策略吗?
您是完全正确的,根据文档,当用户完成其卷时,他们可以从 API 中删除 PVC 对象,从而允许回收资源。PersistentVolume的回收策略告诉集群在释放其声明后如何处理该卷。在您的 YAML 中,它被设置为:
Reclaim Policy: Delete
Run Code Online (Sandbox Code Playgroud)
这意味着它应该被立即删除。目前,卷可以是Retained、Recycled或Deleted。
为什么没有被删除?我唯一能想到的是,PV 可能仍以某种方式被声明,这可能是由于 PVC 未成功删除,因为其容量显示为“0”,要解决此问题,您将需要删除 POD。或者,您可以使用该$ kubectl describe pvc
命令查看 PVC 仍处于挂起状态的原因。
对于问题,如何制作 PVC 来重新访问现有 PV 中的数据?
由于回收策略的状态,这是不可能的,即Reclaim Policy: Delete
要使之成为可能,您需要根据文档使用“保留”选项
要验证可以删除 PVC 并保留磁盘的理论,请执行以下操作:
然后验证磁盘是否被保留。
就像 @Bharat Chhabra 的答案,但它会将所有已发布的持久卷的状态修改为可用:
kubectl get pv | tail -n+2 | awk '$5 == "Released" {print $1}' | xargs -I{} kubectl patch pv {} --type='merge' -p '{"spec":{"claimRef": null}}'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7939 次 |
最近记录: |