是否可以调整持久卷的大小?

时间:2016-10-31 00:40:15

标签: kubernetes google-kubernetes-engine

我正在Kubernetes上运行MySQL部署,但似乎我的分配空间不够,最初我添加了50GB的持久量,现在我想将其扩展为100GB

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

8 个答案:

答案 0 :(得分:15)

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

需要启用PersistentVolumeClaimResize许可插件和存储类,其allowVolumeExpansion字段设置为true。

请参阅https://kubernetes.io/docs/concepts/storage/persistent-volumes/#expanding-persistent-volumes-claims

上的官方文档

答案 1 :(得分:9)

是的,从1.11开始,persistent volumes can be resized在某些云提供商上。要增加音量,请执行以下操作:

  1. 使用PVC编辑kubectl edit pvc $your_pvc大小
  2. 使用音量终止Pod。

使用该卷的Pod终止后,文件系统将扩展,PV的大小也会增加。有关详细信息,请参见上面的链接。

答案 2 :(得分:8)

不,Kubernetes尚不支持自动音量调整。

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

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

要在卷上启用其他空间,必须手动调整分区大小。您可以按照here说明执行此操作。您必须首先删除引用卷的pod,等待它分离,然后将卷手动附加/装入您有权访问的某个VM实例,并运行所需的步骤以调整其大小。

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

答案 3 :(得分:4)

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

通过处理PVC / PV和(例如)GCE PD,可以达到相同的最终结果。

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

  1. 拍摄PD的快照(假设您关心数据)
  2. 确保PV的ReclaimPolicy为"保留",如有必要,请按照此处详细说明进行修补:https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/
  3. kubectl describe pv <name-of-pv>(稍后创建PV清单时很有用)
  4. 删除部署/窗格(可能不是必需的,但看起来更干净)
  5. 删除PVC和PV
  6. 确保PD被识别为未被任何人使用(例如谷歌控制台,计算/磁盘页面)
  7. 使用云提供商调整PD的大小(例如,使用GCE,即使磁盘正在使用,实际上也可以在较早阶段完成)
  8. 创建k8s PersistentVolume清单(之前已通过使用StorageClass资源动态完成)。在PersistentVolume yaml规范中,我定义了"gcePersistentDisk: pdName: <name-of-pd>"以及我在步骤3中获取的其他详细信息。确保将spec.capacity.storage更新为您想要的新容量PV要 (虽然不是必需的,但在此处没有效果,您可能希望更新PVC清单中的存储容量/值,为子孙后代)
  9. kubectl apply(或等效)重新创建部署/窗格,PVC和PV
  10. 注意:某些步骤可能不是必需的,例如删除一些现有的部署/ pod ..资源,但我个人更喜欢删除它们,因为我知道ReclaimPolicy是Retain,我有一个快照。 / p>

答案 4 :(得分:3)

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

对于其他卷类型,必须立即手动完成。此外,当pod在线时(不错!)支持自动执行此操作in a future version (currently slated for 1.11)

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

  1. Ensure PV已经收回政策&#34;保留&#34;集。
  2. 删除有状态集。 Kubernetes应该释放PV。特别注意由运营商管理的有状态集,例如Prometheus - 可能需要暂时禁用运营商。也可以使用Scale一次执行一个窗格。
  3. 使用Azure API或门户网站调整PV的基础存储空间。
  4. 将基础存储添加到VM(例如Kubernetes主服务器)上,方法是将它们添加为&#34;磁盘&#34;在VM设置中。在VM中,使用e2fsckresize2fs来调整PV上的文件系统的大小(假设为ext3 / 4 FS)。卸载磁盘。
  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内的所有字段。
  9. 使用已编辑的PVC配置创建新资源。 PVC应该从Pending状态开始,但PV和PVC都应该相对快速地转换到Bound
  10. 重新创建StatefulSet和/或更改有状态集配置以重新启动pod。

答案 5 :(得分:0)

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

如果这对您不起作用,请尝试此操作(适用于 AWS 位用户)。

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

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

答案 6 :(得分:0)

<块引用>

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

尽管这个答案对我的 statefulset 的一个 pvc 效果很好,但其他人没有设法调整大小。我想这是因为 pod 重新启动太快,由于退避而没有时间开始调整大小过程。事实上,Pod 启动很快,但需要一些时间才能被视为准备就绪(增加退避)。

这是我的解决方法:

更新 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

等待豆荚回来

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

答案 7 :(得分:-1)

是的,在版本1.8之后,可以查看卷扩展here

  

v1.8中引入了卷扩展作为Alpha功能