我在Kubernetes上运行MySQL部署,但似乎我的分配空间不够了。一开始我添加了一个持久卷为50GB
,现在我想将其扩展到100GB
。
我已经知道,一旦创建后,持久卷声明是不可变的,但我是否可以通过某种方式来调整持久卷大小,然后重新创建声明?
我在Kubernetes上运行MySQL部署,但似乎我的分配空间不够了。一开始我添加了一个持久卷为50GB
,现在我想将其扩展到100GB
。
我已经知道,一旦创建后,持久卷声明是不可变的,但我是否可以通过某种方式来调整持久卷大小,然后重新创建声明?
是的,在1.11版本中,持久卷可以在某些云提供商上调整大小。要增加卷大小:
kubectl edit pvc $your_pvc
)以指定新大小。要编辑的关键是spec.resources.requests.storage
:PersistentVolumeClaimResize
准入插件,并设置allowVolumeExpansion
字段为true的存储类。
请参阅官方文档:https://kubernetes.io/docs/concepts/storage/persistent-volumes/#expanding-persistent-volumes-claims。更新: 从Kubernetes v1.11开始,针对内置卷插件,扩容功能作为beta功能可用。自Kubernetes v1.16起,也可用于由CSI驱动程序支持的卷的beta功能。
如果您的卷的卷插件或CSI驱动程序支持卷扩展,则可以通过Kubernetes API调整卷大小:
allowVolumeExpansion: true
)。spec.resources.requests
)请求更改卷容量。有关更多信息,请参见:
不,目前Kubernetes不支持自动调整卷大小。
目前磁盘调整完全是手动的过程。
假设您创建了一个具有给定容量的Kubernetes PV对象,并且该PV绑定到PVC,然后附加/挂载到节点以供Pod使用。如果您增加了卷的大小,Pod将继续能够正常使用磁盘,但是它们将无法访问额外的空间。
要在卷上启用额外的空间,您必须手动调整分区。您可以按照此处的说明进行操作。您需要首先删除引用该卷的Pod,等待其分离,然后手动将卷附加/挂载到您可以访问的某个VM实例,并执行所需的调整步骤。
打开问题#35941以跟踪功能请求。
持久化卷索取(persistent volume claim)
和持久化卷(persistent volume)
已经指定了大小,我是否应该在不指定大小的情况下创建它们?这可能吗?感谢您的回复。 - perrohunterStatefulSet
来实现这个?如果我删除了Pod,它只会被重新创建。将其缩小到0
是唯一的方法吗? - Dmitry Minkovsky在1.8及以上版本中,对于某些卷类型(包括gcePersistentDisk
和awsBlockStore
),如果集群上启用了某些实验功能,则可以提供一些支持。
对于其他卷类型,目前必须手动完成。此外,自动执行此操作而不影响Pods在线(很好!)将在未来版本(目前计划在1.11中发布)中推出:
目前,这是我手动使用AzureDisk
卷类型(用于托管磁盘),它目前不支持持久磁盘调整大小(但也会有支持)所采取的步骤:
e2fsck
和resize2fs
来调整PV上的文件系统大小(假设是ext3 / 4 FS)。卸载磁盘。spec.capacity.storage
中指定新的卷大小,spec.claimref
uid
和resourceVersion
字段,以及status.phase
。metadata.resourceVersion
字段,pv.kubernetes.io/bind-completed
和pv.kubernetes.io/bound-by-controller
注释,并spec.resources.requests.storage
字段更改为更新后的PV大小,并status
内的所有字段。allowVolumeExpansion
设置为“true”。如果是,则只需使用所请求的卷更新 PVC,并检查 PVC 中的状态。AWS
用户):
awsElasticBlockStore
下 -> `volume`)。lsblk
列出已连接的卷resize2fs
或xfs_growfs
df -h
,然后检查卷kubectl describe pv <name-of-pv>
(在稍后创建 PV 清单时很有用)"gcePersistentDisk: pdName: <name-of-pd>"
,以及其他我在步骤 3 中获取的细节。 确保更新 spec.capacity.storage 以使 PV 具有新容量 (虽然不是必要的,在这里没有影响,但您可能希望为后世更新 PVC 清单中的存储容量/值)kubectl apply
(或等效命令)重新创建部署/ pod、PVC 和 PVkubectl get storageclass
首先,删除StatefulSet。这是必需的,因为:
稍后我们将创建一个新的具有更高存储卷大小的STS。如果您的repo中没有它,请不要忘记备份STS YAML文件。
删除STS后,请等待一段时间,以便k8s可以将存储卷从节点分离。
接下来,将PVC修改为更高的存储卷大小值。
此时,如果卷仍然附加,则您将在 PVC 事件下面看到以下警告消息。 “无论是卷仍然挂载到 Pod 上,还是您需要等待并给 k8s 一些时间。”kubectl describe pvc app-master-volume-app-master-0
在之前的步骤中,我们已经删除了 StatefulSet。现在我们需要创建并应用一个新的 StatefulSet,容量大小比之前更大。这应该与之前在 PVC 规范中修改的值相匹配。
当新的 Pod 创建时,您将看到如下所示的 Pod 事件,表明卷大小调整成功。
k get sts <sts-name> -o yaml > sts.yaml
kubectl delete sts --cascade=orphan <sts-name>
然后删除一个PVC无法调整大小的Pod
kubectl delete pod <pod-name>
等待PVC调整大小
kubectl get pvc -w
kubectl apply -f sts.yaml
等待 pod 回来
重复执行,直到所有的 PVC 调整大小为止!
我有一个带有自己创建的StorageClass(allowVolumeExpansion:true)的持久卷。
PV spec: accessMode: readWriteOnce
PVC spec: same
当我升级PV时,PVC中的更改没有反映出来。
1.15
起,调整正在使用的 PVC 功能处于beta
阶段。 - Dominikkubectl rollout restart
(K8s 版本>= 1.15
) 或kubectl patch deployment NAME -p \ "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"
date +'%s'\"}}}}}"
- Dominik