pvc:資源需要指定:
1.accessMode:訪問模型;對象列表:
ReadWriteOnce – the volume can be mounted as read-write by a single node: RWO - ReadWriteOnce一人讀寫
ReadOnlyMany – the volume can be mounted read-only by many nodes: ROX - ReadOnlyMany 多人只讀
ReadWriteMany – the volume can be mounted as read-write by many nodes: RWX - ReadWriteMany多人讀寫
2.resource:資源限制(比如:定義5GB空間,我們期望對應的存儲空間至少5GB。)
3.selector:標簽選擇器。不加標簽,就會在所有PV找最佳匹配。
4.storageClassName:存儲類名稱:
5.volumeMode:指后端存儲卷的模式。可以用於做類型限制,哪種類型的PV可以被當前claim所使用。
6.volumeName:卷名稱,指定后端PVC(相當於綁定)
PV和PVC是一一對應關系,當有PV被某個PVC所占用時,會顯示banding,其它PVC不能再使用綁定過的PV。
PVC一旦綁定PV,就相當於是一個存儲卷,此時PVC可以被多個Pod所使用。(PVC支不支持被多個Pod訪問,取決於訪問模型accessMode的定義)。
PVC若沒有找到合適的PV時,則會處於pending狀態。
PV是屬於集群級別的,不能定義在名稱空間中。
PVC時屬於名稱空間級別的。
PV的reclaim policy選項:
默認是Retain保留,保留生成的數據。
可以改為recycle回收,刪除生成的數據,回收pv
delete,刪除,pvc解除綁定后,pv也就自動刪除。
例:在nfs服務器上,使用nfs創建多個數據卷,在k8s集群中定義PV/PVC,讓pod關聯PVC
1.在/data/volumes/創建多個目錄:v1,v2,v3,v4,v5,修改/etc/exports文件,使數據卷單獨輸出。
1 /data/volumes/v1 192.168.1.0/24(rw,no_root_squash) 2 /data/volumes/v2 192.168.1.0/24(rw,no_root_squash) 3 /data/volumes/v3 192.168.1.0/24(rw,no_root_squash) 4 /data/volumes/v4 192.168.1.0/24(rw,no_root_squash) 5 /data/volumes/v5 192.168.1.0/24(rw,no_root_squash)
exportfs -arv:顯示nfs當前輸出的可以掛載的數據卷。
showmount -e :顯示nfs導出的數據卷
2.在k8s集群中定義pv:
1 vim pv-demo.yaml 2 apiVersion: v1 3 kind: PersistentVolume 4 metadata: 5 name: pv001 6 labels: 7 name: pv001 8 spec: 9 nfs: 10 path: /data/volumes/v1 11 server: k8s-node2 12 accessModes: ["ReadWriteMany","ReadWriteOnce","ReadOnlyMany"] 13 capacity: 14 storage: 2Gi 15 --- 16 ...pv002 17 --- 18 ...pv003 19 ...創建5個以上內容,修改name和path等參數
應用:kubectl apply -f pv-demo.yaml
查看:kubectl get pv
1 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE 2 pv001 2Gi RWO,ROX,RWX Retain Available 56m 3 pv002 5Gi RWO,ROX Retain Available 56m 4 pv003 3Gi ROX,RWX Retain Available 56m 5 pv004 10Gi RWO Retain Available 56m 6 pv005 15Gi ROX Retain Available 56m
3.創建PVC和pod
1 vim pod-pvc.yaml 2 apiVersion: v1 3 kind: PersistentVolumeClaim 4 metadata: 5 name: mypvc 6 namespace: default 7 spec: 8 accessModes: ["ReadWriteOnce"] ##注:這個訪問模型必須是PV中存在的訪問模型的子集,否則會找不到合適的PV,會一直Pending。 9 resources: 10 requests: 11 storage: 6Gi 12 --- 13 apiVersion: v1 14 kind: Pod 15 metadata: 16 name: myapp-pv 17 namespace: default 18 spec: 19 containers: 20 - name: myapp 21 image: ikubernetes/myapp:v1 22 imagePullPolicy: IfNotPresent 23 ports: 24 - name: html 25 containerPort: 80 26 volumeMounts: 27 - name: nfs 28 mountPath: "/usr/share/nginx/html" 29 volumes: 30 - name: nfs 31 persistentVolumeClaim: 32 claimName: mypvc
應用:kubectl apply -f pod-pvc.yaml
1 查看pvc:kubectl get pvc 2 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE 3 mypvc Bound pv004 10Gi RWO 4s 4 查看pv:kubectl get pv 5 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE 6 pv001 2Gi RWO,ROX,RWX Retain Available 56m 7 pv002 5Gi RWO,ROX Retain Available 56m 8 pv003 3Gi ROX,RWX Retain Available 56m 9 pv004 10Gi RWO Retain Bound default/mypvc 56m 10 pv005 15Gi ROX Retain Available 56m 、
如此pvc就綁定在合適的pv上了。綁定的pv是pv004,說明pod的/usr/share/nginx/html掛載在nfs服務器/data/volumes/v4目錄下。
4.查看pod:kubectl get pods -owide
1 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 2 myapp-pv 1/1 Running 0 24s 10.244.1.141 k8s-node2 <none> <none>
5.在nfs服務器上,找到/data/volumes/v4目錄,寫個測試文件:
1 vi /data/volumes/v4/index.html 2 <h1>Smbands</h1>
測試:訪問podIP
1 curl 10.244.1.141 2 <h1>Smbands</h1>