可以调整持久卷的大小吗?
Can a Persistent Volume be resized?
我 运行 在 Kubernetes 上进行了 MySQL 部署,但似乎我分配的 space 还不够,最初我添加了一个 50GB
的持久卷,现在我想将其扩展为 100GB
.
我已经看到持久卷声明在创建后是不可变的,但我能否以某种方式调整持久卷的大小然后重新创建我的声明?
更新: 卷扩展作为 beta 功能提供,从 Kubernetes v1.11 开始用于树内卷插件。从 Kubernetes v1.16 开始,它还可以作为由 CSI 驱动程序支持的卷的测试版功能提供。
如果您的卷的卷插件或 CSI 驱动程序支持卷扩展,您可以通过 Kubernetes 调整卷的大小 API:
- 确保为与您的 PVC 关联的 StorageClass(
allowVolumeExpansion: true
在 StorageClass 上设置)启用卷扩展。
- 通过编辑您的 PVC (
spec.resources.requests
) 请求更改卷容量。
有关详细信息,请参阅:
- https://kubernetes.io/docs/concepts/storage/persistent-volumes/#expanding-persistent-volumes-claims
- https://kubernetes-csi.github.io/docs/volume-expansion.html
不,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。以下是我 运行 通过的步骤:
- 对 PD 进行快照(前提是您关心数据)
- 确保 PV 的 ReclaimPolicy 是 "Retain",如有必要请按此处详细说明进行修补:https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/
kubectl describe pv <name-of-pv>
(稍后创建 PV 清单时有用)
- 删除 deployment/pod(可能不是必需的,但看起来更干净)
- 删除 PVC 和 PV
- 确保 PD 被识别为未被任何东西使用(例如 google 控制台,compute/disks 页面)
- 使用云提供商调整 PD 大小(例如,使用 GCE,这实际上可以在早期阶段完成,即使磁盘正在使用中)
- 创建 k8s PersistentVolume 清单(这之前是通过使用 StorageClass 资源动态完成的)。在 PersistentVolume yaml 规范中,我定义了
"gcePersistentDisk: pdName: <name-of-pd>"
以及我在第 3 步中获取的其他详细信息。确保将 spec.capacity.storage 更新为您想要的新容量PV要有 (虽然不是必需的,在这里没有影响,你可能想更新你的PVC清单中的存储capacity/value,为了后代)
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,对于某些卷类型,包括 gcePersistentDisk
和 awsBlockStore
,如果在集群上启用了某些实验性功能。
对于其他卷类型,目前必须手动完成。此外,支持在 pods 在线时自动执行此操作(太好了!)即将推出 in a future version (currently slated for 1.11):
现在,这些是我使用 AzureDisk
卷类型(用于托管磁盘)手动执行此操作所遵循的步骤,该卷类型目前不支持永久性磁盘调整大小(但 support is coming for this too):
- Ensure PV 已设置回收策略 "Retain"。
- 删除状态集及相关pods。 Kubernetes 应该释放 PV,即使 PV 和 PVC 状态将保持
Bound
。请特别注意由操作员(例如 Prometheus)管理的有状态集——操作员可能需要暂时禁用。也可以使用 Scale
一次做一个 pod。这可能需要几分钟时间,请耐心等待。
- 使用 Azure API 或门户调整 PV 的底层存储。
- 通过在 VM 设置中将它们添加为 "Disk",将底层存储安装到 VM(例如 Kubernetes master)上。在 VM 中,使用
e2fsck
和 resize2fs
调整 PV 上文件系统的大小(假设 FS 为 ext3/4)。卸载磁盘。
- 保存关联 PVC 的 JSON/YAML 配置。
- 删除关联的 PVC。 PV 应更改为状态
Released
.
- 编辑PV的YAML配置,之后PV状态应该是
Available
:
- 在
spec.capacity.storage
、 中指定新的卷大小
- 删除
spec.claimref
uid
和 resourceVersion
字段,并且
- 删除
status.phase
.
- 编辑保存的 PVC 配置:
- 删除
metadata.resourceVersion
字段,
- 删除元数据
pv.kubernetes.io/bind-completed
和 pv.kubernetes.io/bound-by-controller
注释,以及
- 将
spec.resources.requests.storage
字段更改为更新后的 PV 大小,并且
- 删除
status
. 中的所有字段
- 使用编辑后的 PVC 配置创建新资源。 PVC 应以
Pending
状态开始,但 PV 和 PVC 都应相对快速地过渡到 Bound
。
- 重新创建 StatefulSet and/or 更改有状态集配置以重新启动 pods。
是的,从 1.11 开始,persistent volumes can be resized 在某些云提供商上。要增加卷大小:
- 编辑 PVC (
kubectl edit pvc $your_pvc
) 以指定新尺寸。编辑的关键是 spec.resources.requests.storage
:
- 使用卷终止 pod。
一旦使用该卷的 pod 终止,文件系统就会扩展,PV
的大小也会增加。详见上文link
您可以做的第一件事是,检查您正在使用的存储 class,查看 allowVolumeExpansion
是否设置为 `true。如果是,则只需使用请求的卷更新 PVC 并检查 PVC 中的状态。
如果这对您不起作用,请试试这个(对于 AWS
用户)。
- 检查 PV 中附加的卷 ID(在
awsElasticBlockStore
-> `volume 下)。
- 转到 AWS 中的卷,并将卷修改为所需的任何值
- SSH 到当前连接卷的节点(查找节点名称描述 pod 并检查节点密钥)
- 使用
lsblk
列出附加的卷
- 运行
resize2fs
或 xfs_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 中。
我 运行 在 Kubernetes 上进行了 MySQL 部署,但似乎我分配的 space 还不够,最初我添加了一个 50GB
的持久卷,现在我想将其扩展为 100GB
.
我已经看到持久卷声明在创建后是不可变的,但我能否以某种方式调整持久卷的大小然后重新创建我的声明?
更新: 卷扩展作为 beta 功能提供,从 Kubernetes v1.11 开始用于树内卷插件。从 Kubernetes v1.16 开始,它还可以作为由 CSI 驱动程序支持的卷的测试版功能提供。
如果您的卷的卷插件或 CSI 驱动程序支持卷扩展,您可以通过 Kubernetes 调整卷的大小 API:
- 确保为与您的 PVC 关联的 StorageClass(
allowVolumeExpansion: true
在 StorageClass 上设置)启用卷扩展。 - 通过编辑您的 PVC (
spec.resources.requests
) 请求更改卷容量。
有关详细信息,请参阅:
- https://kubernetes.io/docs/concepts/storage/persistent-volumes/#expanding-persistent-volumes-claims
- https://kubernetes-csi.github.io/docs/volume-expansion.html
不,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。以下是我 运行 通过的步骤:
- 对 PD 进行快照(前提是您关心数据)
- 确保 PV 的 ReclaimPolicy 是 "Retain",如有必要请按此处详细说明进行修补:https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/
kubectl describe pv <name-of-pv>
(稍后创建 PV 清单时有用)- 删除 deployment/pod(可能不是必需的,但看起来更干净)
- 删除 PVC 和 PV
- 确保 PD 被识别为未被任何东西使用(例如 google 控制台,compute/disks 页面)
- 使用云提供商调整 PD 大小(例如,使用 GCE,这实际上可以在早期阶段完成,即使磁盘正在使用中)
- 创建 k8s PersistentVolume 清单(这之前是通过使用 StorageClass 资源动态完成的)。在 PersistentVolume yaml 规范中,我定义了
"gcePersistentDisk: pdName: <name-of-pd>"
以及我在第 3 步中获取的其他详细信息。确保将 spec.capacity.storage 更新为您想要的新容量PV要有 (虽然不是必需的,在这里没有影响,你可能想更新你的PVC清单中的存储capacity/value,为了后代) 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,对于某些卷类型,包括 gcePersistentDisk
和 awsBlockStore
,如果在集群上启用了某些实验性功能。
对于其他卷类型,目前必须手动完成。此外,支持在 pods 在线时自动执行此操作(太好了!)即将推出 in a future version (currently slated for 1.11):
现在,这些是我使用 AzureDisk
卷类型(用于托管磁盘)手动执行此操作所遵循的步骤,该卷类型目前不支持永久性磁盘调整大小(但 support is coming for this too):
- Ensure PV 已设置回收策略 "Retain"。
- 删除状态集及相关pods。 Kubernetes 应该释放 PV,即使 PV 和 PVC 状态将保持
Bound
。请特别注意由操作员(例如 Prometheus)管理的有状态集——操作员可能需要暂时禁用。也可以使用Scale
一次做一个 pod。这可能需要几分钟时间,请耐心等待。 - 使用 Azure API 或门户调整 PV 的底层存储。
- 通过在 VM 设置中将它们添加为 "Disk",将底层存储安装到 VM(例如 Kubernetes master)上。在 VM 中,使用
e2fsck
和resize2fs
调整 PV 上文件系统的大小(假设 FS 为 ext3/4)。卸载磁盘。 - 保存关联 PVC 的 JSON/YAML 配置。
- 删除关联的 PVC。 PV 应更改为状态
Released
. - 编辑PV的YAML配置,之后PV状态应该是
Available
:- 在
spec.capacity.storage
、 中指定新的卷大小
- 删除
spec.claimref
uid
和resourceVersion
字段,并且 - 删除
status.phase
.
- 在
- 编辑保存的 PVC 配置:
- 删除
metadata.resourceVersion
字段, - 删除元数据
pv.kubernetes.io/bind-completed
和pv.kubernetes.io/bound-by-controller
注释,以及 - 将
spec.resources.requests.storage
字段更改为更新后的 PV 大小,并且 - 删除
status
. 中的所有字段
- 删除
- 使用编辑后的 PVC 配置创建新资源。 PVC 应以
Pending
状态开始,但 PV 和 PVC 都应相对快速地过渡到Bound
。 - 重新创建 StatefulSet and/or 更改有状态集配置以重新启动 pods。
是的,从 1.11 开始,persistent volumes can be resized 在某些云提供商上。要增加卷大小:
- 编辑 PVC (
kubectl edit pvc $your_pvc
) 以指定新尺寸。编辑的关键是spec.resources.requests.storage
:
- 使用卷终止 pod。
一旦使用该卷的 pod 终止,文件系统就会扩展,PV
的大小也会增加。详见上文link
您可以做的第一件事是,检查您正在使用的存储 class,查看 allowVolumeExpansion
是否设置为 `true。如果是,则只需使用请求的卷更新 PVC 并检查 PVC 中的状态。
如果这对您不起作用,请试试这个(对于 AWS
用户)。
- 检查 PV 中附加的卷 ID(在
awsElasticBlockStore
-> `volume 下)。 - 转到 AWS 中的卷,并将卷修改为所需的任何值
- SSH 到当前连接卷的节点(查找节点名称描述 pod 并检查节点密钥)
- 使用
lsblk
列出附加的卷 - 运行
resize2fs
或xfs_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 中。