可以调整持久卷的大小吗?

Can a Persistent Volume be resized?

我 运行 在 Kubernetes 上进行了 MySQL 部署,但似乎我分配的 space 还不够,最初我添加了一个 50GB 的持久卷,现在我想将其扩展为 100GB.

我已经看到持久卷声明在创建后是不可变的,但我能否以某种方式调整持久卷的大小然后重新创建我的声明?

更新: 卷扩展作为 beta 功能提供,从 Kubernetes v1.11 开始用于树内卷插件。从 Kubernetes v1.16 开始,它还可以作为由 CSI 驱动程序支持的卷的测试版功能提供。

如果您的卷的卷插件或 CSI 驱动程序支持卷扩展,您可以通过 Kubernetes 调整卷的大小 API:

  1. 确保为与您的 PVC 关联的 StorageClass(allowVolumeExpansion: true 在 StorageClass 上设置)启用卷扩展。
  2. 通过编辑您的 PVC (spec.resources.requests) 请求更改卷容量。

有关详细信息,请参阅:


不,Kubernetes 还不支持自动调整卷大小。

磁盘大小调整目前完全是手动过程。

假设您创建了一个具有给定容量的 Kubernetes PV 对象,并且该 PV 绑定到一个 PVC,然后 attached/mounted 到一个节点以供 pod 使用。如果您增加卷大小,pods 将继续能够毫无问题地使用磁盘,但是他们将无法访问额外的 space.

要在卷上启用额外的 space,您必须手动调整分区大小。您可以按照说明 here 进行操作。您必须先删除引用该卷的 pods,等待它分离,然后手动 attach/mount 将卷删除到您有权访问的某个 VM 实例,然后 运行 通过所需的调整大小的步骤。

打开问题 #35941 以跟踪功能请求。

就 PVC/PV 'resizing' 而言,k8s 仍然不支持它,但我相信它可能会在 1.9

中出现

通过处理 PVC/PV 和(例如)GCE PD 可以获得相同的最终结果..

例如,我有一个 gitlab 部署,带有一个 PVC 和一个通过 StorageClass 资源动态配置的 PV。以下是我 运行 通过的步骤:

  1. 对 PD 进行快照(前提是您关心数据)
  2. 确保 PV 的 ReclaimPolicy 是 "Retain",如有必要请按此处详细说明进行修补:https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/
  3. kubectl describe pv <name-of-pv>(稍后创建 PV 清单时有用)
  4. 删除 deployment/pod(可能不是必需的,但看起来更干净)
  5. 删除 PVC 和 PV
  6. 确保 PD 被识别为未被任何东西使用(例如 google 控制台,compute/disks 页面)
  7. 使用云提供商调整 PD 大小(例如,使用 GCE,这实际上可以在早期阶段完成,即使磁盘正在使用中)
  8. 创建 k8s PersistentVolume 清单(这之前是通过使用 StorageClass 资源动态完成的)。在 PersistentVolume yaml 规范中,我定义了 "gcePersistentDisk: pdName: <name-of-pd>" 以及我在第 3 步中获取的其他详细信息。确保将 spec.capacity.storage 更新为您想要的新容量PV要有 (虽然不是必需的,在这里没有影响,你可能想更新你的PVC清单中的存储capacity/value,为了后代)
  9. kubectl apply(或等效)以重新创建您的 deployment/pod、PVC 和 PV

注意:有些步骤可能不是必需的,例如删除一些现有的 deployment/pod.. 资源,但我个人更喜欢删除它们,因为我知道 ReclaimPolicy 是 Retain,而且我有快照。

可以的,1.8版本以后,看看体积扩展here

Volume expansion was introduced in v1.8 as an Alpha feature

对于某些卷类型,在 Kubernetes 1.9(1.8 中的 alpha)中是可能的:gcePersistentDisk、awsElasticBlockStore、Cinder、glusterfs、rbd

需要启用 PersistentVolumeClaimResize 准入插件和存储 类 allowVolumeExpansion 字段设置为 true。

查看官方文档 https://kubernetes.io/docs/concepts/storage/persistent-volumes/#expanding-persistent-volumes-claims

在 1.8 及更高版本中有 some support,对于某些卷类型,包括 gcePersistentDiskawsBlockStore,如果在集群上启用了某些实验性功能。

对于其他卷类型,目前必须手动完成。此外,支持在 pods 在线时自动执行此操作(太好了!)即将推出 in a future version (currently slated for 1.11)

现在,这些是我使用 AzureDisk 卷类型(用于托管磁盘)手动执行此操作所遵循的步骤,该卷类型目前不支持永久性磁盘调整大小(但 support is coming for this too):

  1. Ensure PV 已设置回收策略 "Retain"。
  2. 删除状态集及相关pods。 Kubernetes 应该释放 PV,即使 PV 和 PVC 状态将保持 Bound。请特别注意由操作员(例如 Prometheus)管理的有状态集——操作员可能需要暂时禁用。也可以使用 Scale 一次做一个 pod。这可能需要几分钟时间,请耐心等待。
  3. 使用 Azure API 或门户调整 PV 的底层存储。
  4. 通过在 VM 设置中将它们添加为 "Disk",将底层存储安装到 VM(例如 Kubernetes master)上。在 VM 中,使用 e2fsckresize2fs 调整 PV 上文件系统的大小(假设 FS 为 ext3/4)。卸载磁盘。
  5. 保存关联 PVC 的 JSON/YAML 配置。
  6. 删除关联的 PVC。 PV 应更改为状态 Released.
  7. 编辑PV的YAML配置,之后PV状态应该是Available
    1. spec.capacity.storage
    2. 中指定新的卷大小
    3. 删除 spec.claimref uidresourceVersion 字段,并且
    4. 删除 status.phase.
  8. 编辑保存的 PVC 配置:
    1. 删除metadata.resourceVersion字段,
    2. 删除元数据 pv.kubernetes.io/bind-completedpv.kubernetes.io/bound-by-controller 注释,以及
    3. spec.resources.requests.storage 字段更改为更新后的 PV 大小,并且
    4. 删除 status.
    5. 中的所有字段
  9. 使用编辑后的 ​​PVC 配置创建新资源。 PVC 应以 Pending 状态开始,但 PV 和 PVC 都应相对快速地过渡到 Bound
  10. 重新创建 StatefulSet and/or 更改有状态集配置以重新启动 pods。

是的,从 1.11 开始,persistent volumes can be resized 在某些云提供商上。要增加卷大小:

  1. 编辑 PVC (kubectl edit pvc $your_pvc) 以指定新尺寸。编辑的关键是 spec.resources.requests.storage:

  1. 使用卷终止 pod。

一旦使用该卷的 pod 终止,文件系统就会扩展,PV 的大小也会增加。详见上文link

您可以做的第一件事是,检查您正在使用的存储 class,查看 allowVolumeExpansion 是否设置为 `true。如果是,则只需使用请求的卷更新 PVC 并检查 PVC 中的状态。

如果这对您不起作用,请试试这个(对于 AWS 用户)。

  • 检查 PV 中附加的卷 ID(在 awsElasticBlockStore -> `volume 下)。
  • 转到 AWS 中的卷,并将卷修改为所需的任何值
  • SSH 到当前连接卷的节点(查找节点名称描述 pod 并检查节点密钥)
  • 使用 lsblk 列出附加的卷
  • 运行 resize2fsxfs_growfs 取决于您拥有的音量类型。
  • 执行到 pod 运行 df -h 并检查音量。

注意:您只能在 6 小时内修改一次卷。

Edit the PVC (kubectl edit pvc $your_pvc) to specify the new size. The key to edit is spec.resources.requests.storage:

尽管这个答案对我的 statefulset 中的一个 pvc 非常有效,但其他 pvc 无法调整大小。我猜这是因为 pods 重新启动得太快,由于退避而没有时间让调整大小过程开始。事实上,pods 启动速度很快,但需要一些时间才能被视为准备就绪(增加退避)。

这是我的解决方法:

更新 pvc

备份 sts 规范

k get sts <sts-name> -o yaml > sts.yaml

然后删除cascade=orphan的sts。因此,pods 仍将 运行

kubectl delete sts --cascade=orphan <sts-name>

然后删除其中一个 pvc 不会调整大小的 pod

kubectl delete pod <pod-name>

等待 pvc 调整大小

kubectl get pvc -w

重新应用 sts 以便 pod 返回

kubectl apply -f sts.yaml

等待pod回来

重复直到调整所有 pvc 的大小!

我有自己创建的 StorageClass (allowVolumeExpansion: true) 的持久卷。

PV spec: accessMode: readWriteOnce
PVC spec: same

当我升级 PV 时,更改没有反映在 PVC 中。