是否可以将现有 PVC 从 ReadWriteOnce 更改为 ReadWriteMany,而无需重新创建它?我有一个现有的数据库 Pod,并且文件系统由于某种原因已变为只读。我想将另一个 pod 连接到 PVC 来查看它。
小智 6
虽然不可能在不破坏持久卷声明(它们是不可变的)的情况下将持久卷声明从 ReadWriteOnce 更改为 ReadWriteMany ,但有一个过程。
我在这里写这篇文章,是因为和其他人一样,我也来到这里,并且写下这个问题时没有提到避免 PVC 的重新创建。
这是 kubernetes 本身的文档:https://kubernetes.io/blog/2021/09/13/read-write-once-pod-access-mode-alpha/
文档中的示例是将访问模式更改为,ReadWriteOncePod但原理是相同的。
ReadWriteOnce下面是我自己将访问模式从转换为 时偶然发现的示例和详细信息ReadWriteMany。
我正在为 grafana 命名空间中的 grafana helm 版本转换 PersistentVolume 和 PersistentVolumeClaim。
持久卷名称:grafana-pv
PersistentVolumeClaim 名称:grafana-pvc
命名空间:grafana
请根据您的用例调整命令。
以防万一发生任何超级糟糕的情况,至少对现有的持久卷声明进行备份。我们需要删除它,这是最佳实践。
即使您有生成原始 PVC 的代码,也要进行备份。
如果您无法找到生成它的实际清单,您可以轻松地从备份中重新创建它(一旦更改访问模式)。
kubectl get pvc grafana-pvc -n grafana -o yaml > grafana_pvc_backup.yaml
Run Code Online (Sandbox Code Playgroud)
Retain这是必须的!!!在删除持久卷之前声明以避免数据被擦除的意外情况。默认的回收策略是Delete,我们不希望这种情况发生。
kubectl patch pv grafana-pv -n grafana -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
Run Code Online (Sandbox Code Playgroud)
在此步骤中,您将删除与持久卷的绑定。检查正在使用它的内容并将其缩小到 0。无需删除部署,只需将其缩小到没有 pod 运行即可。
kubectl scale --replicas=0 -n grafana deployment grafana
Run Code Online (Sandbox Code Playgroud)
当使用持久卷的所有工作负载都缩减到零时,您应该会看到它的状态从 更改Bound为Released。但我们还没有完成。
注意:您是否备份了清单以防万一?
kubectl delete pvc grafana-pvc -n grafana
Run Code Online (Sandbox Code Playgroud)
Available这里,我们只是从持久卷中删除对已删除的持久卷声明的引用,以便可以设置新的持久卷声明。
kubectl patch pv grafana-pv -n grafana -p '{"spec":{"claimRef":{"uid":""}}}'
Run Code Online (Sandbox Code Playgroud)
您应该看到持久卷的状态更改为Available
只需运行这个命令:
kubectl patch pv grafana-pv -n grafana -p '{"spec":{"accessModes":["ReadWriteMany"]}}'
Run Code Online (Sandbox Code Playgroud)
在这里,您可以使用现有代码来创建具有访问模式的 kubernetes 资源ReadWriteMany,或者仅使用我们在第一步中所做的备份,编辑其 spec.accessModes 并应用它。
我只是展示spec我们感兴趣的部分应该是什么,如果您正在编辑现有清单或备份,您将很容易找到更改它的地方。
spec:
accessModes:
- ReadWriteMany
Run Code Online (Sandbox Code Playgroud)
应用新的持久卷声明清单(假设我们将其保存到名为的文件中persistent_volume_claim_read_write_many.yaml:
kubectl -n grafana apply -f persistent_volume_claim_read_write_many.yaml
Run Code Online (Sandbox Code Playgroud)
将副本数量调整为工作负载清单实际指定的数量。
kubectl scale --replicas=1 -n grafana deployment grafana
Run Code Online (Sandbox Code Playgroud)
您的持久卷的状态应该变为Bound现在。
现在,所有工作负载都应该开始在ReadWriteMany访问模式下使用您的持久卷。
检查所有容器并确保它们确实能够正确连接卷。
如果您希望它回到原来的状态(假设的Delete)并且其状态是Bound(意味着有东西正在使用它,并且如果回收策略更改为 ,它不会被擦除Delete)。
kubectl patch pv grafana-pv -n grafana -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'
Run Code Online (Sandbox Code Playgroud)
就是这样。全做完了。我已经执行了这个并且有效。如果有任何错误 - 请告诉我,我会修改答案。
| 归档时间: |
|
| 查看次数: |
4079 次 |
| 最近记录: |