Kubernetes v1.11 中,持久卷扩容能力升级为 Beta 阶段。这个功能让用户可以轻松的通过编辑 PVC 对象的方式修改现有卷的容量。没有这一功能之前,要对卷容量进行修改,需要要和存储后端进行手工交互,或者对 PV 以及 PVC 进行删除重建操作。持久卷不支持缩容操作。
v1.8 中卷扩展功能就已经进入 Alpha 阶段,v1.11 之前需要在 feature gate 中开启 ExpandPersistentVolumes
,以及 admission 控制器 PersistentVolumeClaimResize
(防止在底层存储不支持扩容的情况下对 PVC 进行扩容)。在 Kubernetes v1.11 中,这两个项目都会被缺省激活。
虽然功能已经被激活,但是集群管理员还是需要进行操作,让用户能够对自己的卷进行扩容。Kubernetes 1.11 内置了对部分卷插件的扩容支持:AWS-EBS、GCE-PD、Azure Disk、Azure File、Glusterfs、Cinder、Portworx、以及 Ceph RBD。管理员确定底层存储能够支持卷扩展之后,就可以在 StorageClass
对象中设置 allowVolumeExpansion
为 true
来启用这一功能了。只有从 StorageClass
中创建的 PVC 才允许使用卷扩展:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
parameters:
type: pd-standard
provisioner: kubernetes.io/gce-pd
allowVolumeExpansion: true
reclaimPolicy: Delete
任何从这一 StorageClass
中创建的 PVC 都能够通过编辑的方式来申请更多空间。Kubernetes 会处理 Storage 字段的变更,据此申请空间,触发卷的扩容。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi #更新这一字段,修改 PVC 容量
文件系统扩展
GCE-PD、AWS-EBS、Azure Disk、Cinder 以及 Ceph RBD 这些块存储卷通常需要首先进行文件系统的扩展,然后被扩展的卷的额外空间才能为 Pod 所用。引用这些卷的 Pod 重启时,Kubernetes 会自动完成这些任务。
网络挂载的文件系统,例如 Glusterfs 和 Azure File,因为不需要进行文件系统扩展,因此可以在不重启 Pod 的情况下直接进行扩展。
只有终止引用卷的 Pod,才会触发对应文件系统的扩展,更确切地说:
- 编辑 PVC,申请更多空间。
- 底层存储对底层卷进行了扩展之后,PV 对象就会响应这一变化,PVC 会进入
FileSystemResizePending
状态。
可以运行 kubectl get pvc <pvc_name> -o yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
namespace: default
uid: 02d4aa83-83cd-11e8-909d-42010af00004
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 14Gi
storageClassName: standard
volumeName: pvc-xxx
status:
capacity:
storage: 9G
conditions:
- lastProbeTime: null
lastTransitionTime: 2018-07-11T14:51:10Z
message: Waiting for user to (re-)start a pod to finish file system resize of
volume on node.
status: "True"
type: FileSystemResizePending
phase: Bound
- PVC 进入
FileSystemResizePending
状态,引用 PVC 的 Pod 就可以重新启动来结束文件系统在 Node 上的扩展过程了。可以通过删除和重建 Pod 的方式进行重启,也可以通过对 Deployment 的伸缩来完成这一过程。 - 文件系统的扩展操作完成之后,PVC 会自动更新,设置为新的容量。
文件系统扩展过程中遇到任何错误,都会在 Pod 中以 Event 的形式表现出来。
在线文件系统扩展
Kubernetes v1.11 还引入了一个 Alpha 功能,叫做在线文件系统扩展。这个功能可以对一个正在被 Pod 使用的卷进行文件系统的扩展。这个功能还处于 Alpha 阶段,因此需要通过 Feature gate 启用 ExpandInUsePersistentVolumes
。目前支持的有 GCE-PD、AWS-EBS、Cinder 以及 Ceph RBD。当激活这个功能后,引用被扩展的卷的 Pod 无需重启。文件系统会随着卷扩展的步骤进行扩展。文件系统的扩展只有在 Pod 引用被扩展的卷的时候才会发生,所以如果没有 Pod 引用这个卷,那么就不会进行文件系统扩展。