简单使用

1、创建local-storage

  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4. name: local-storage
  5. provisioner: kubernetes.io/no-provisioner
  6. reclaimPolicy: Delete
  7. volumeBindingMode: WaitForFirstConsumer

查看storageclass的状态

  1. kubectl get sc
  2. NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
  3. local-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 2m1s

2、创建pv,这里的pv是local pv

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: local-pv-sdc
  5. spec:
  6. capacity:
  7. storage: 4Gi
  8. accessModes:
  9. - ReadWriteOnce
  10. persistentVolumeReclaimPolicy: Retain
  11. storageClassName: local-storage
  12. local:
  13. path: /data/pv
  14. nodeAffinity:
  15. required:
  16. nodeSelectorTerms:
  17. - matchExpressions:
  18. - key: node
  19. operator: In
  20. values:
  21. - middleware

查看pv状态

  1. # kubectl get pv
  2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  3. local-pv-sdc 2Gi RWO Retain Available local-storage 7s

3、创建一个statefuleset应用测试

  1. apiVersion: apps/v1
  2. kind: StatefulSet
  3. metadata:
  4. name: web
  5. spec:
  6. serviceName: "nginx"
  7. replicas: 2
  8. selector:
  9. matchLabels:
  10. app: nginx
  11. template:
  12. metadata:
  13. labels:
  14. app: nginx
  15. role: stateful
  16. spec:
  17. containers:
  18. - name: nginx
  19. image: cnych/nginx-slim:0.8
  20. ports:
  21. - containerPort: 80
  22. name: web
  23. volumeMounts:
  24. - name: www
  25. mountPath: /usr/share/nginx/html
  26. volumeClaimTemplates:
  27. - metadata:
  28. name: www
  29. spec:
  30. accessModes: [ "ReadWriteOnce" ]
  31. storageClassName: local-storage
  32. resources:
  33. requests:
  34. storage: 1Gi

查看pvc,pv,storageclass状态

  1. # kubectl get pvc
  2. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  3. www-web-0 Bound local-pv-sdc 2Gi RWO local-storage 86s
  4. # kubectl get pv
  5. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  6. local-pv-sdc 2Gi RWO Retain Bound default/www-web-0 local-storage 6m21s

4、扩容测试

  1. # kubectl edit pvc www-web-0
  2. ...
  3. spec:
  4. accessModes:
  5. - ReadWriteOnce
  6. resources:
  7. requests:
  8. storage: 2Gi
  9. storageClassName: local-storage
  10. volumeMode: Filesystem
  11. volumeName: local-pv-sdc
  12. ...

将storage修改为2Gi,保存退出,报错如下。

  1. error: persistentvolumeclaims "www-web-0" could not be patched: persistentvolumeclaims "www-web-0" is forbidden: only dynamically provisioned pvc can be resized and the storageclass that provisions the pvc must support resize

这是说pvc必须支持修改大小,我们先修改storageclass,让其支持扩展,如下加allowVolumeExpansion: true

  1. kind: StorageClass
  2. apiVersion: storage.k8s.io/v1
  3. metadata:
  4. name: local-storage
  5. provisioner: kubernetes.io/no-provisioner
  6. volumeBindingMode: WaitForFirstConsumer
  7. allowVolumeExpansion: true

然后我们再修改pvc,提示改成功如下:

  1. # kubectl edit pvc www-web-0
  2. persistentvolumeclaim/www-web-0 edited

我们再修改pv的大小,修改为3G,修改后的状态如下:

  1. # kubectl get pv
  2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  3. local-pv-sdc 3Gi RWO Retain Bound default/www-web-0 local-storage 28m

然后我们再扩容pvc,查看pvc的event如下:

  1. Ignoring the PVC: didn't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.

报错信息为:没有找到可扩展的插件。
我上官方网站一看,原来人家已经说的很清楚了:Although the feature is enabled by default, a cluster admin must opt-in to allow users to resize their volumes. Kubernetes v1.11 ships with volume expansion support for the following in-tree volume plugins: AWS-EBS, GCE-PD, Azure Disk, Azure File, Glusterfs, Cinder, Portworx, and Ceph RBD.