一个持久化存储卷可以被调整大小吗?

64

我在Kubernetes上运行MySQL部署,但似乎我的分配空间不够了。一开始我添加了一个持久卷为50GB,现在我想将其扩展到100GB

我已经知道,一旦创建后,持久卷声明是不可变的,但我是否可以通过某种方式来调整持久卷大小,然后重新创建声明?

11个回答

81

是的,在1.11版本中,持久卷可以在某些云提供商上调整大小。要增加卷大小:

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

enter image description here

  • 使用卷终止Pod。
  • 一旦使用该卷的Pod被终止,文件系统将会扩展并且PV的大小会增加。详情请参见上述链接。

    很高兴成为这样好的消息的传递者。 - Dmitry Minkovsky
    3
    谢谢提及Pod终止; 现在我明白了,但是我在 Kubernetes 博客上宣布该功能的博文中没有看到这个提及。如果您不使用 PVC 删除任何 Pod,则 Kubernetes 无法调整卷大小! - geerlingguy
    1
    Kubernetes v1.11版本为以下内置卷插件提供了扩容支持:AWS-EBS、GCE-PD、Azure Disk、Azure File、Glusterfs、Cinder、Portworx和Ceph RBD。我使用Azure AKS / Azure Disk,在我的情况下,我遇到了一些在此github问题中提到的问题,https://github.com/kubernetes/kubernetes/issues/68427。它帮助我解决了我的问题,以及这个答案和提到的博客文章。 - PussInBoots
    1
    自 Kubernetes 版本 1.15 起,调整正在使用的 PVC 功能处于 beta 阶段。 - Dominik
    1
    这真是太棒了! - Dean Christian Armada

    18

    12

    更新: 从Kubernetes v1.11开始,针对内置卷插件,扩容功能作为beta功能可用。自Kubernetes v1.16起,也可用于由CSI驱动程序支持的卷的beta功能。

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

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

    有关更多信息,请参见:


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

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

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

    要在卷上启用额外的空间,您必须手动调整分区。您可以按照此处的说明进行操作。您需要首先删除引用该卷的Pod,等待其分离,然后手动将卷附加/挂载到您可以访问的某个VM实例,并执行所需的调整步骤。

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


    但是持久化卷索取(persistent volume claim)持久化卷(persistent volume)已经指定了大小,我是否应该在不指定大小的情况下创建它们?这可能吗?感谢您的回复。 - perrohunter
    3
    PV/PVC 用于存储发现。创建 PVC 时,应满足所需最小存储要求,并将其绑定到可用(未绑定)的符合这些最小要求的 PV 上。PV 对象是真实存储的“表征”,需要定义容量。一旦 PVC/PV 绑定,任一容量大小都无关紧要,因为 PVC 已得到满足。当 pod 引用 PVC 时,pod 仅使用 PV 对象中挂载该卷所需的信息(忽略容量值)。 - Saad Ali
    “容量隔离”(即“限制应用程序可用的存储空间”的能力)正在 https://github.com/kubernetes/features/issues/245 中跟踪(针对1.7的目标alpha版本)。 - Saad Ali
    我该如何使用StatefulSet来实现这个?如果我删除了Pod,它只会被重新创建。将其缩小到0是唯一的方法吗? - Dmitry Minkovsky
    1
    如果您的文件系统支持动态调整大小,例如ext4,则无需删除Pod - 只需在相关的k8s节点上运行resize2fs即可,Pod将立即看到额外的空间。 - Zaar Hai
    显示剩余2条评论

    7

    在1.8及以上版本中,对于某些卷类型(包括gcePersistentDiskawsBlockStore),如果集群上启用了某些实验功能,则可以提供一些支持

    对于其他卷类型,目前必须手动完成。此外,自动执行此操作而不影响Pods在线(很好!)将在未来版本(目前计划在1.11中发布)中推出:

    目前,这是我手动使用AzureDisk卷类型(用于托管磁盘),它目前不支持持久磁盘调整大小(但也会有支持)所采取的步骤:

    1. 确保PV的回收策略设置为“Retain”。
    2. 删除有状态集和相关的Pod。Kubernetes应该释放PV,即使PV和PVC的状态仍然是“Bound”。特别注意由操作员管理的有状态集,例如Prometheus--操作员可能需要暂时禁用它。也可能可以使用“Scale”逐个处理一个Pod。这可能需要几分钟,请耐心等待。
    3. 使用Azure API或门户调整PV的基础存储大小。
    4. 通过在VM设置中将其作为“磁盘”添加到VM(如Kubernetes主节点)上挂载基础存储。在VM中,使用e2fsckresize2fs来调整PV上的文件系统大小(假设是ext3 / 4 FS)。卸载磁盘。
    5. 保存相关PVC的JSON / YAML配置。
    6. 删除相关PVC。PV应更改为状态“Released”。
    7. 编辑PV的YAML配置,之后PV的状态应为“Available”:
      1. spec.capacity.storage中指定新的卷大小,
      2. 删除spec.claimref uidresourceVersion字段,以及
      3. 删除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. 重新创建有状态集和/或更改有状态集配置以重新启动Pod。

    1
    世界级的演示。在这里挽救了局面。 <3 - sshow
    是的,同意,这就是正确的做法。 - R.A. Lucas
    世界级的...棒极了。谢谢! - Tarzan

    4
    首先,您可以检查您正在使用的存储类,并查看是否将allowVolumeExpansion设置为“true”。如果是,则只需使用所请求的卷更新 PVC,并检查 PVC 中的状态。
    如果这种方式不起作用,则尝试以下方法(适用于AWS用户):
    • 在 PV 中检查附加的卷 id(在awsElasticBlockStore下 -> `volume`)。
    • 转到 AWS 的“Volumes”,并将卷修改为所需大小
    • SSH 进入当前连接了该卷的节点(要查找节点名称,请描述 pod 并检查节点键)
    • 使用lsblk列出已连接的卷
    • 根据您拥有的卷类型运行resize2fsxfs_growfs
    • 在 pod 中执行df -h,然后检查卷
    注意:您每 6 小时只能修改一次卷。

    4
    关于 PVC/PV 的“调整大小”,在 k8s 中仍不支持,但我相信它有可能在 1.9 版本中推出。不过,可以通过处理 PVC/PV 和(例如)GCE PD 来实现同样的最终结果。
    例如,我有一个 GitLab 部署,使用 StorageClass 资源动态分配了 PVC 和 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. 删除部署/ pod(可能不是必要的,但看起来更干净)
    5. 删除 PVC 和 PV
    6. 确保 PD 被认为未被任何东西使用(例如 Google 控制台、计算机/磁盘页面)
    7. 使用云提供商调整 PD 的大小(例如,使用 GCE,即使磁盘正在使用中,也可以在早期阶段完成此操作)
    8. 创建 k8s PersistentVolume 清单(之前已通过使用 StorageClass 资源动态完成此操作)。在 PersistentVolume yaml 规范中,我定义了"gcePersistentDisk: pdName: <name-of-pd>",以及其他我在步骤 3 中获取的细节。 确保更新 spec.capacity.storage 以使 PV 具有新容量 (虽然不是必要的,在这里没有影响,但您可能希望为后世更新 PVC 清单中的存储容量/值)
    9. kubectl apply (或等效命令)重新创建部署/ pod、PVC 和 PV
    注意:一些步骤可能不是必要的,例如删除一些现有的部署/ pod 资源,但我个人更喜欢删除它们,因为我知道 ReclaimPolicy 是 Retain,并且我有一个快照。

    2
    以下是当使用存储类时,我们如何扩展挂载在有状态集(STS) pod上的Azure磁盘的容量大小。(AWS EBS和GCP持久卷应该类似)。
    摘要:
    1.删除有状态集。
    2.更新PVC上的卷大小。等待直到条件消息提示启动pod。
    3.应用具有更新卷大小的新有状态集,当pod启动时,您应该看到卷大小被调整。
    完整步骤:
    检查存储类中是否启用了卷调整大小的功能。
    kubectl get storageclass
    

    enter image description here

    首先,删除StatefulSet。这是必需的,因为:
    • 在调整大小之前,需要从节点卸载并分离存储卷
    • STS YAML上的存储卷大小是不可变的(无法更新)

    稍后我们将创建一个新的具有更高存储卷大小的STS。如果您的repo中没有它,请不要忘记备份STS YAML文件。

    删除STS后,请等待一段时间,以便k8s可以将存储卷从节点分离。

    接下来,将PVC修改为更高的存储卷大小值。

    enter image description here

    此时,如果卷仍然附加,则您将在 PVC 事件下面看到以下警告消息。

    enter image description here

    “无论是卷仍然挂载到 Pod 上,还是您需要等待并给 k8s 一些时间。”
    “接下来,在 PVC 上运行 describe 命令,您现在应该会看到一条消息(在条件中)提示您启动 Pod。”
    kubectl describe pvc app-master-volume-app-master-0
    

    enter image description here

    在之前的步骤中,我们已经删除了 StatefulSet。现在我们需要创建并应用一个新的 StatefulSet,容量大小比之前更大。这应该与之前在 PVC 规范中修改的值相匹配。 当新的 Pod 创建时,您将看到如下所示的 Pod 事件,表明卷大小调整成功。

    enter image description here


    1
    编辑PVC(kubectl edit pvc $your_pvc)以指定新的大小。要编辑的关键是spec.resources.requests.storage:
    尽管这个答案对我的一个有状态集合的pvc非常有效,但其他的pvc没有成功调整大小。我猜这是因为pod重新启动得太快了,没有留出时间进行调整大小的过程,因为后退。实际上,pod启动很快,但需要一些时间才能被视为准备就绪(增加后退)。
    这是我的解决方法:
    更新pvc
    备份sts规范
    k get sts <sts-name> -o yaml > sts.yaml
    

    然后使用级联=孤儿删除sts。这样,pod仍将运行。
    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 调整大小为止!


    0

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

    卷扩展作为Alpha功能在v1.8中被引入。


    0

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

    PV spec: accessMode: readWriteOnce
    PVC spec: same
    

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


    目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community
    这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时得到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注。- 来自审核 - Blender Fox

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接