管理员在创建PV时需要指定,PV的大小、访问模式、实际存储类型、路径等。
# pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: mypv spec: capacity: storage: 10Mi # 定义大小 accessModes: # 支持单个客户端挂在为读写模式或者多个客户端只读模式 - ReadWriteOnce - ReadOnlyMany persistentVolumeReclaimPolicy: Retain # 当声明被释放后,PV将被保留 hostPath: path: /tmp/pv条件有限,所以存储类型只能先选hostPath用着,接下来创建pv并查看
-> [root@kube0.vm] [~] k create -f pv.yaml persistentvolume/volume-pv created -> [root@kube0.vm] [~] k get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE mypv 10Mi RWO,ROX Retain Available 4s 创建PVC假设要部署一个需要持久化存储的Pod,将要用到持久卷,但是不能在Pod中直接使用,需要先声明一个。
# pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mypvc spec: resources: requests: storage: 10Mi accessModes: - ReadWriteOnce storageClassName: ""PVC创建好后,Kubernetes会寻找适当的PV将其绑定到PVC。持久卷必须要足够大,并且包含声明中指定的访问模式。
-> [root@kube0.vm] [~] k create -f pvc.yaml persistentvolumeclaim/mypvc created -> [root@kube0.vm] [~] k get pv,pvc NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/mypv 10Mi RWO,ROX Retain Bound default/mypvc 7m11s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/mypvc Bound mypv 10Mi RWO,ROX 9s可以看到持久卷被绑定到default/mypvc声明上,default是mypvc的命名空间。PV不存在命名空间的概念,但是PVC只能在特定命名空间创建。
Pod中使用PVC # use-pvc-pod.yaml apiVersion: v1 kind: Pod metadata: name: use-pvc spec: containers: # 这里的内容与volume-share.yaml的一样,所以功能不再赘叙, - image: alpine name: html-generator volumeMounts: - name: html mountPath: /var/html command: ["sh","-c","mkdir /var/html; while :; do echo $(date) > /var/html/index.html;sleep 1;done"] volumes: - name: html persistentVolumeClaim: # 这里使用了PVC类型,制定了PVC的名字 claimName: mypvc创建Pod
-> [root@kube0.vm] [~] k create -f use-pvc-pod.yaml pod/use-pvc created -> [root@kube0.vm] [~] k get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES use-pvc 1/1 Running 0 4m1s 10.244.1.12 kube1.vm <none> <none>与kube1.vm查看是否写入了内容
-> [root@kube1.vm] [~] cat /tmp/pv/index.html Sun May 24 06:43:02 UTC 2020 回收PV删除PVC后,查看PV,可以看到此时的状态是Released,而不是之前的Available。
-> [root@kube0.vm] [~] k delete pvc mypvc persistentvolumeclaim "mypvc" deleted -> [root@kube0.vm] [~] k get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE mypv 10Mi RWO,ROX Retain Released default/mypvc 35s这时候在创建PVC,会发现mypvc的状态一直是Pending,因为没有可用的PV。所以,persistentVolumeReclaimPolicy设置为Retain的PV需要手动删除重建才能恢复可用。
-> [root@kube0.vm] [~] k create -f pvc.yaml persistentvolumeclaim/mypvc created -> [root@kube0.vm] [~] k get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mypvc Pending 16spersistentVolumeReclaimPolicy用来设置回收策略,其他两种是Recycle和Delete。可以在现有的PV上更改卷回收策略,比如开始设置为Delete,可以改为Retain。
PV与PVC的声明周期,以及在Pod中的使用 StorageClass使用PV与PVC可以使开发人员不用关心实际的存储技术,但是仍然需要集群管理人员来支持实际的存储。可以通过创建StorageClass资源解决此问题。
StorageClass的作用是:为引用它的PVC在创建的时候通过置备程序创建一个PV。
工作流程简介:
集群管理员根据不同性能及特性创建若干个StorageClass
开发人员创建一个引用StorageClass的PVC
Kubernetes查找引用的StorageClass置备程序,并按照PVC的访问模式和存储大小置备新的PV