kubernetes 将 PVC 从 ReadWriteOnce 更改为 ReadWriteMany

Mar*_*ark 8 kubernetes

是否可以将现有 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)

当使用持久卷的所有工作负载都缩减到零时,您应该会看到它的状态从 更改BoundReleased。但我们还没有完成。

删除现有的持久卷声明以便能够释放持久卷

注意:您是否备份了清单以防万一?

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

将持久卷访问模式更改为 ReadWriteMany

只需运行这个命令:

kubectl patch pv grafana-pv -n grafana -p '{"spec":{"accessModes":["ReadWriteMany"]}}'
Run Code Online (Sandbox Code Playgroud)

使用访问模式 ReadWriteMany 重新创建持久卷声明

在这里,您可以使用现有代码来创建具有访问模式的 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)

就是这样。全做完了。我已经执行了这个并且有效。如果有任何错误 - 请告诉我,我会修改答案。


Jan*_*art 3

您可以在不更改 PVC 的情况下执行此操作。Once in 与访问 PVC 的 Pod 数量无关,而是与访问 PVC 的 Node 数量有关ReadWriteOnce

创建另一个挂载相同 PVC 的 Pod 并设置nodeSelector(使用主机名),以便它在现在挂载 PVC 的同一节点上进行调度。

或者,通过 SSH 连接到已为 Pod 安装 PVC 的节点。kubectl describe ...如果您有很多坐骑,则会为您提供您正在寻找的 ID。