Kubernetes 1.11 版本中,PVC 的扩容功能进入了 Beta 阶段,一般来说,Kubernetes 功能进入 Beta 阶段就意味着基本可以用于生产了。这里就做几个小测试,看看这一功能的使用方法。
首先当然是要有一个 Kubernetes 1.11 版本的集群。并且提供了支持 Auto provision 的存储。下面的实验是基于 Azure 的 ACS-Engine 集群。
接下来准备两个 Storage Class 对象,分别命名为 common
和 expend
,二者主体基本一致,文件名分别为 sc-common.yaml
以及 sc-exp.yaml
:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: exp # sc-common.yaml 中这里的值为 common
parameters:
cachingmode: None
kind: Managed
storageaccounttype: Standard_LRS
provisioner: kubernetes.io/azure-disk
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true # sc-common.yaml 中删掉这一行
$ kubectl apply -f common.yaml
storageclass.storage.k8s.io/common created
$ kubectl apply -f exp.yaml
storageclass.storage.k8s.io/exp created
我们接下来创建一个 PVC,初始首先测试一下 common
这个 Storageclass,后续的 PVC 操作都从这一个 YAML 中修改而来。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 2Gi
storageClassName: common
同样使用 kubectl
创建这个 PVC:
$ kubectl apply -f pvc.yaml
persistentvolumeclaim/myclaim created
$ kubectl get pvc -w
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myclaim Pending common 9s
myclaim Pending common 10s
myclaim Pending pvc-e3f8e886-8776-11e8-b82d-000d3aa2ebc3 0 common 11s
myclaim Bound pvc-e3f8e886-8776-11e8-b82d-000d3aa2ebc3 2Gi RWO common 11s
PVC 进入 Bound
状态之后,我们编辑 pvc.yaml
,将容量改成 3Gi,并重新 Apply:
$ cat pvc.yaml | sed "s/2Gi/3Gi/" | kubectl apply -f -
Error from server (Forbidden): error when applying patch:
...
for: "STDIN": persistentvolumeclaims "myclaim" is forbidden: only dynamically provisioned pvc can be resized and the storageclass that provisions the pvc must support resize
结果表明,这次扩容失败了,失败的原因是 Storageclass 不支持扩容
接下来我们将这个 PVC 删除,使用 exp 这个 Storageclass 重建 PVC:
$ kubectl delete -f pvc.yaml
persistentvolumeclaim "myclaim" deleted
$ sed -i .bak s/common/exp/ pvc.yaml
$ kubectl apply -f pvc.yaml
persistentvolumeclaim/myclaim created
$ kubectl get pvc -w
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myclaim Bound pvc-37eb6014-8778-11e8-b82d-000d3aa2ebc3 2Gi RWO exp 11s
创建之后,我们可以再次尝试对 PVC 进行扩容:
$ cat pvc.yaml | sed "s/2Gi/1Gi/" | kubectl apply -f -
The PersistentVolumeClaim "myclaim" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value
$ cat pvc.yaml | sed "s/2Gi/3Gi/" | kubectl apply -f -
persistentvolumeclaim/myclaim configured
这里两次执行命令:
接下来我们再次获取 PVC 信息:
$ kubectl describe pvc myclaim
Name: myclaim
Namespace: default
StorageClass: exp
Status: Bound
Volume: pvc-37eb6014-8778-11e8-b82d-000d3aa2ebc3
...
Capacity: 2Gi
Access Modes: RWO
Conditions:
...
FileSystemResizePending
...
Waiting for user to (re-)start a pod to finish file system resize of volume on node.
这里会看到,虽然没出错,但是容量还是原有的 2G,他的 Condition 中提示,需要进行一个 Pod 绑定才能真正生效。
新建一个 Deployment 来使用前面创建的 PVC:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: sleep
spec:
replicas: 1
template:
metadata:
labels:
app: sleep
version: v1
spec:
containers:
- name: sleep
image: dustise/sleep:v0.5
imagePullPolicy: IfNotPresent
volumeMounts:
- name: data
mountPath: "/data"
volumes:
- name: data
persistentVolumeClaim:
claimName: myclaim
再次查看 PVC 的情况:
$ kubectl describe pvc myclaim
...
Capacity: 3Gi
容量的修改的确生效了。
再次对这个 PVC 进行扩容,我们这次从 3Gi 扩容到 4Gi:
$ cat pvc.yaml | sed "s/2Gi/4Gi/" | kubectl apply -f -
persistentvolumeclaim/myclaim configured
然后获取一下 PVC 的情况:
$ kubectl describe pvc myclaim
...
Capacity: 3Gi
...
Events:
Warning VolumeResizeFailed 31s (x2 over 56s) volume_expand
Original Error: failed request: autorest/azure: Service returned an error. Status=<nil> Code="OperationNotAllowed" Message="Cannot resize disk k8s-5b49c85f-dynamic-pvc-37eb6014-8778-11e8-b82d-000d3aa2ebc3 while it is attached to running VM /subscriptions/6d9be255-d214-4502-a51d-08e1d9c4a7fb/resourceGroups/k8s/providers/Microsoft.Compute/virtualMachines/k8s-agentpool1-17067717-0."
这一情况看来,这次扩容仍然没有生效,错误信息中有提示,无法在已经成功挂载的卷上进行扩容,因此我们清除所有 Pod:
$ kubectl scale deployment sleep --replicas 0
deployment.extensions/sleep scaled
在相关 Pod 消失之后,我们可以再次 describe pvc myclaim
,发现这个 PVC 又一次处于等待绑定的状态中。使用 scale 指令恢复 Deployment 运行:
$ kubectl scale deployment sleep --replicas 1
deployment.extensions/sleep scaled
$ kubectl describe pvc myclaim
...
Capacity: 4Gi
...
PVC 的扩容再次成功了。