kubectl patch pv 手动更新 PV 的容量信息

客户有个服务的PV需要扩容容量,由于服务刚初始化还没有正式上线,并且存储卷使用的是云盘,支持动态调整大小,评估后决定使用kubectl patch pv手动更新pv的容量信息,当然前提需要云盘先扩容到指定容量。生产中这种方法非常危险,请评估好风险!

操作步骤:

1.找到pod使用的存储卷,登陆云厂商控制台找到对应的存储卷扩容到指定容量

kubectl get pvc -A | grep pod-name
kubectl get pv -A | grep pod-name
kubectl describe pv <pv-name>

2.使用 kubectl patch pv 手动更新 pv 的容量信息

虽然可以使用 kubectl patch 命令修改 PV 对象中的容量信息,但并不会真正改变底层存储资源的大小。这只会导致 Kubernetes 集群中的 PV 容量信息与实际底层存储资源的大小不一致,从而导致各种问题,例如数据丢失或应用无法正常工作。如果已经通过其他方式调整了底层存储资源的大小,并且需要更新 PV 的容量信息,才可以使用以下命令:

kubectl patch pv <pv-name> -p '{"spec":{"capacity":{"storage":"<new-size>"}}}'

将 <pv-name> 替换为你的 PV 名称,<new-size> 替换为新的容量大小 (例如 500Gi)。

确认容量变更完成后,进入pod,在挂载目录中使用 dd 命令测试文件是否能正常创建,命令如下,测试完成后记得删除测试文件。

dd if=/dev/zero of=./file-test bs=4M count=10

以下是一些间接调整 PV 容量的方法,以及它们的风险和限制,请谨慎选择使用,可能会导致数据丢失或应用无法正常工作

  1. 直接修改底层存储资源的大小:

    • 适用场景: hostPath、NFS、本地存储等类型的 PV。

    • 方法: 登录到宿主机或存储服务器,使用相应的工具 (例如 resize2fs、云厂商提供的工具) 调整底层存储资源的大小。然后,需要手动更新 PV 的容量信息,使其与底层存储资源的大小匹配。

    • 风险: 非常高。直接操作底层存储资源可能会导致数据丢失或损坏。如果操作不当,可能会导致 Kubernetes 集群出现故障。

    • 限制: 并非所有存储类型都支持在线调整大小。

  2. 使用存储厂商提供的工具:

    • 适用场景: 云厂商提供的存储服务 (例如 AWS EBS、Azure Disk、GCP Persistent Disk)。

    • 方法: 使用云厂商提供的工具 (例如 AWS CLI、Azure PowerShell、GCP gcloud) 调整存储卷的大小。然后,需要手动更新 PV 的容量信息,使其与新的卷大小匹配。

    • 风险: 中等。使用云厂商提供的工具通常比直接操作底层存储资源更安全,但仍然存在一定的风险。

    • 限制: 并非所有云厂商都支持在线调整存储卷的大小。

  3. 使用 Volume Expansion 功能 (如果支持):

    • 适用场景: 某些 CSI 驱动程序和存储插件支持 Volume Expansion 功能。

    • 方法: 编辑 PVC 的 spec.resources.requests.storage 字段,将其值修改为新的容量大小。如果存储驱动程序和文件系统支持在线扩容,则 PV 的容量会自动调整。

    • 风险: 低。这是最安全的方法,但需要存储驱动程序和文件系统支持 Volume Expansion 功能。

    • 限制: 并非所有存储驱动程序和文件系统都支持 Volume Expansion 功能。

虽然技术上可以使用 kubectl patch 命令修改 PV 的某些字段,例如标签或注解,但这通常不会改变 PV 的底层存储资源,例如容量、访问模式和回收策略,这些属性在 PV 创建后通常是不可变的

可以修改的字段:

  • Labels (标签): 可以使用 kubectl patch 添加、修改或删除 PV 的标签。

kubectl patch pv <pv-name> -p '{"metadata":{"labels":{"key":"value"}}}'
  • Annotations (注解): 可以使用 kubectl patch 添加、修改或删除 PV 的注解。

kubectl patch pv <pv-name> -p '{"metadata":{"annotations":{"key":"value"}}}'

不能修改的字段 (通常):

  • Capacity (容量): PV 的容量在创建后无法更改。

  • Access Modes (访问模式): PV 的访问模式在创建后无法更改。

  • Reclaim Policy (回收策略): PV 的回收策略在创建后通常无法更改,但有些云厂商的存储插件可能允许修改。

kubectl patch pv <pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'
  • Storage Class (存储类): PV 的存储类在创建后无法更改。

  • 底层存储资源: kubectl patch 不会修改 PV 对应的底层存储资源。

如果必须使用这些方法,请务必在操作之前备份数据,并在非生产环境中进行测试。


再次强调,以上方法都存在一定的风险,不推荐在生产环境中使用。 最安全和推荐的方法是创建新的 PV 和 PVC,并将应用迁移到新的 PVC,操作步骤如下:

  1. 创建新的 PV: 根据新的容量需求创建一个新的 PV。

  2. 创建新的 PVC: 创建一个新的 PVC,并将其绑定到新的 PV。

  3. 将应用迁移到新的 PVC: 将应用配置为使用新的 PVC。

以下是如何调整 PVC 容量大小的步骤:

  1. 确认 StorageClass 支持扩容:

    使用 kubectl describe sc <storageclass-name> 命令查看 StorageClass 的详细信息。确认 allowVolumeExpansion 字段设置为 true。 如果 StorageClass 不支持扩容,需要创建一个新的支持扩容的 StorageClass。

  2. 使用 kubectl patch 或 kubectl edit 调整 PVC 容量:

    可以使用以下两种方法之一来修改 PVC 的容量:

    • kubectl patch:

    kubectl patch pvc <pvc-name> -p '{"spec":{"resources":{"requests":{"storage":"<new-size>"}}}}'

    将 <pvc-name> 替换为你的 PVC 名称,<new-size> 替换为新的容量大小 (例如 20Gi、500Mi)。

    • kubectl edit:

    kubectl edit pvc <pvc-name>

    找到 spec.resources.requests.storage 字段,并将其值修改为新的容量大小。保存并关闭文件。

  3. 验证 PVC 容量是否已更改:

    使用 kubectl get pvc <pvc-name> 或 kubectl describe pvc <pvc-name> 命令查看 PVC 的详细信息,确认容量是否已更新。

  4. (如果需要) 重启 Pod:

    有些存储驱动程序和文件系统需要重启 Pod 才能识别新的容量大小。如果应用没有自动识别新的容量,请重启使用该 PVC 的 Pod。

注意:

  • 并非所有存储驱动程序都支持在线扩容。

  • 缩小 PVC 容量通常不被支持,并且可能导致数据丢失。

  • 确保应用能够处理存储容量的变化。

如果使用的是云厂商提供的 Kubernetes 服务,请参考其文档了解如何调整 PV 容量大小,因为具体步骤可能会有所不同。 一些云厂商的存储插件可能提供更安全的方法来调整 PV 容量。


参考 :Kubernetes 命令备忘清单

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6229.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注