k8s高級(jí)存儲(chǔ)(PV、PVC)
高級(jí)存儲(chǔ)
前面已經(jīng)學(xué)習(xí)了使用NFS提供存儲(chǔ),此時(shí)就要求用戶會(huì)搭建NFS系統(tǒng),并且會(huì)在yaml配置nfs。由于kubernetes支持的存儲(chǔ)系統(tǒng)有很多,要求客戶全都掌握,顯然不現(xiàn)實(shí)。
為了能夠屏蔽底層存儲(chǔ)實(shí)現(xiàn)的細(xì)節(jié),方便用戶使用, kubernetes引入PV和PVC兩種資源對(duì)象。
- PV(Persistent Volume)是持久化卷的意思,是對(duì)底層的共享存儲(chǔ)的一種抽象。一般情況下PV由kubernetes管理員進(jìn)行創(chuàng)建和配置,它與底層具體的共享存儲(chǔ)技術(shù)有關(guān),并通過插件完成與共享存儲(chǔ)的對(duì)接。 - PVC(Persistent Volume Claim)是持久卷聲明的意思,是用戶對(duì)于存儲(chǔ)需求的一種聲明。換句話說,PVC其實(shí)就是用戶向kubernetes系統(tǒng)發(fā)出的一種資源需求申請(qǐng)。

使用了PV和PVC之后,工作可以得到進(jìn)一步的細(xì)分:
- 存儲(chǔ):存儲(chǔ)工程師維護(hù)
- PV: kubernetes管理員維護(hù)
- PVC:kubernetes用戶維護(hù)
PV
資源清單文件
PV是存儲(chǔ)資源的抽象,下面是資源清單文件:
apiVersion: v1 kind: PersistentVolume metadata: name: pv2 #注:這里沒有寫命名空間NS,因?yàn)?span style="color: rgba(255, 0, 0, 1)">PV是集群級(jí)別的資源,跨NS使用 spec: nfs: # 存儲(chǔ)類型(nfs、cifs、glusterfs),與底層真正存儲(chǔ)對(duì)應(yīng) capacity: # 存儲(chǔ)能力,目前只支持存儲(chǔ)空間的設(shè)置 storage: 2Gi accessModes: # 訪問模式 storageClassName: # 存儲(chǔ)類別 persistentVolumeReclaimPolicy: # 回收策略
PV 的關(guān)鍵配置參數(shù)說明:
- 存儲(chǔ)類型
底層實(shí)際存儲(chǔ)的類型,kubernetes支持多種存儲(chǔ)類型,每種存儲(chǔ)類型的配置都有所差異
- 存儲(chǔ)能力(capacity)
目前只支持存儲(chǔ)空間的設(shè)置( storage=1Gi ),不過未來可能會(huì)加入IOPS、吞吐量等指標(biāo)的配置
- 訪問模式(accessModes)
用于描述用戶應(yīng)用對(duì)存儲(chǔ)資源的訪問權(quán)限,訪問權(quán)限包括下面幾種方式:
- ReadWriteOnce(RWO):讀寫權(quán)限,但是只能被單個(gè)節(jié)點(diǎn)掛載 - ReadOnlyMany(ROX): 只讀權(quán)限,可以被多個(gè)節(jié)點(diǎn)掛載 - ReadWriteMany(RWX):讀寫權(quán)限,可以被多個(gè)節(jié)點(diǎn)掛載
`需要注意的是,底層不同的存儲(chǔ)類型可能支持的訪問模式不同`
- 回收策略(persistentVolumeReclaimPolicy)
當(dāng)PV不再被使用了之后,對(duì)其的處理方式。目前支持三種策略:
- Retain (保留) 保留數(shù)據(jù),需要管理員手工清理數(shù)據(jù) - Recycle(回收) 清除 PV 中的數(shù)據(jù),效果相當(dāng)于執(zhí)行 rm -rf /thevolume/* - Delete (刪除) 與 PV 相連的后端存儲(chǔ)完成 volume 的刪除操作,當(dāng)然這常見于云服務(wù)商的存儲(chǔ)服務(wù)
`需要注意的是,底層不同的存儲(chǔ)類型可能支持的回收策略不同`
- 存儲(chǔ)類別
PV可以通過storageClassName參數(shù)指定一個(gè)存儲(chǔ)類別
- 具有特定類別的PV只能與請(qǐng)求了該類別的PVC進(jìn)行綁定
- 未設(shè)定類別的PV則只能與不請(qǐng)求任何類別的PVC進(jìn)行綁定
- 狀態(tài)(status)
一個(gè) PV 的生命周期中,可能會(huì)處于4中不同的階段:
- Available(可用): 表示可用狀態(tài),還未被任何 PVC 綁定 - Bound(已綁定): 表示 PV 已經(jīng)被 PVC 綁定 - Released(已釋放): 表示 PVC 被刪除,但是資源還未被集群重新聲明 - Failed(失敗): 表示該 PV 的自動(dòng)回收失敗
案例
使用NFS作為存儲(chǔ),來演示PV的使用,創(chuàng)建3個(gè)PV,對(duì)應(yīng)NFS中的3個(gè)暴露的路徑。
1) 準(zhǔn)備NFS環(huán)境
# 創(chuàng)建目錄 [root@master ~]# mkdir -p /root/data/{pv1,pv2,pv3} # 暴露服務(wù) [root@master ~]# vim /etc/exports [root@master ~]# cat /etc/exports /root/data/pv1 192.168.1.0/24(rw,no_root_squash) /root/data/pv2 192.168.1.0/24(rw,no_root_squash) /root/data/pv3 192.168.1.0/24(rw,no_root_squash) # 重啟服務(wù) [root@master ~]# systemctl restart nfs
2) 創(chuàng)建pv
apiVersion: v1 kind: PersistentVolume metadata: name: pv1 spec: capacity: storage: 1Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain nfs: path: /root/data/pv1 server: 192.168.1.50 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv2 spec: capacity: storage: 2Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain nfs: path: /root/data/pv2 server: 192.168.1.50 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv3 spec: capacity: storage: 3Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain nfs: path: /root/data/pv3 server: 192.168.1.50
創(chuàng)建并查看
# 創(chuàng)建 pv [root@master ~]# kubectl create -f pv.yaml # 查看pv [root@master ~]# kubectl get pv -o wide

PVC
PVC是資源的申請(qǐng),用來聲明對(duì)存儲(chǔ)空間、訪問模式、存儲(chǔ)類別需求信息。下面是資源清單文件:
資源清單文件
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
namespace: dev #有命名空間NS
spec:
accessModes: # 訪問模式
selector: # 采用標(biāo)簽對(duì)PV選擇
storageClassName: # 存儲(chǔ)類別
resources: # 請(qǐng)求空間
requests:
storage: 5Gi
PVC 的關(guān)鍵配置參數(shù)說明:
- 訪問模式(accessModes) 用于描述用戶應(yīng)用對(duì)存儲(chǔ)資源的訪問權(quán)限 - 選擇條件(selector) 通過Label Selector的設(shè)置,可使PVC對(duì)于系統(tǒng)中己存在的PV進(jìn)行篩選 - 存儲(chǔ)類別(storageClassName) PVC在定義時(shí)可以設(shè)定需要的后端存儲(chǔ)的類別,只有設(shè)置了該class的pv才能被系統(tǒng)選出 - 資源請(qǐng)求(Resources ) 描述對(duì)存儲(chǔ)資源的請(qǐng)求
案例
1) 創(chuàng)建pvc.yaml,申請(qǐng)pv
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc1 namespace: dev spec: accessModes: - ReadWriteMany #訪問模式要對(duì)應(yīng) resources: requests: storage: 1Gi #若申請(qǐng)超過PV的限制,如申請(qǐng)5Gi,則會(huì)匹配不上,狀態(tài)會(huì)變成Pending --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc2 namespace: dev spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc3 namespace: dev spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi
創(chuàng)建并查看
# 創(chuàng)建pvc [root@master ~]# kubectl create -f pvc.yaml # 查看pvc [root@master ~]# kubectl get pvc -n dev -o wide # 查看pv [root@master ~]# kubectl get pv -o wide

2) 創(chuàng)建pods.yaml, 使用pv
apiVersion: v1 kind: Pod metadata: name: pod1 namespace: dev spec: containers: - name: busybox image: busybox:1.30 command: ["/bin/sh","-c","while true;do echo pod1 >> /root/out.txt; sleep 10; done;"] volumeMounts: - name: volume mountPath: /root/ volumes: - name: volume persistentVolumeClaim: claimName: pvc1 readOnly: false #可讀可寫 --- apiVersion: v1 kind: Pod metadata: name: pod2 namespace: dev spec: containers: - name: busybox image: busybox:1.30 command: ["/bin/sh","-c","while true;do echo pod2 >> /root/out.txt; sleep 10; done;"] volumeMounts: - name: volume mountPath: /root/ volumes: - name: volume persistentVolumeClaim: claimName: pvc2 readOnly: false
創(chuàng)建并查看
# 創(chuàng)建pod [root@master ~]# kubectl create -f pods.yaml # 查看pod [root@master ~]# kubectl get pods -n dev -o wide # 查看pvc [root@master ~]# kubectl get pvc -n dev -o wide # 查看pv [root@master ~]# kubectl get pv -n dev -o wide # 查看nfs中的文件存儲(chǔ) [root@master ~]# tail -f /root/data/pv1/out.txt [root@master ~]# tail -f /root/data/pv2/out.txt [root@master ~]# tail -f /root/data/pv3/out.txt
生命周期
PVC和PV是一一對(duì)應(yīng)的,PV和PVC之間的相互作用遵循以下生命周期:
- 資源供應(yīng):管理員手動(dòng)創(chuàng)建底層存儲(chǔ)和PV
- 資源綁定:用戶創(chuàng)建PVC,kubernetes負(fù)責(zé)根據(jù)PVC的聲明去尋找PV,并綁定
在用戶定義好PVC之后,系統(tǒng)將根據(jù)PVC對(duì)存儲(chǔ)資源的請(qǐng)求在已存在的PV中選擇一個(gè)滿足條件的
- 一旦找到,就將該P(yáng)V與用戶定義的PVC進(jìn)行綁定,用戶的應(yīng)用就可以使用這個(gè)PVC了
- 如果找不到,PVC則會(huì)無限期處于Pending狀態(tài),直到等到系統(tǒng)管理員創(chuàng)建了一個(gè)符合其要求的PV
PV一旦綁定到某個(gè)PVC上,就會(huì)被這個(gè)PVC獨(dú)占,不能再與其他PVC進(jìn)行綁定了
- 資源使用:用戶可在pod中像volume一樣使用pvc Pod使用Volume的定義,將PVC掛載到容器內(nèi)的某個(gè)路徑進(jìn)行使用。 - 資源釋放:用戶刪除pvc來釋放pv 當(dāng)存儲(chǔ)資源使用完畢后,用戶可以刪除PVC,與該P(yáng)VC綁定的PV將會(huì)被標(biāo)記為“已釋放”,但還不能立刻與其他PVC進(jìn)行綁定。通過之前PVC寫入的數(shù)據(jù)可能還被留在存儲(chǔ)設(shè)備上,只有在清除之后該P(yáng)V才能再次使用。 - 資源回收:kubernetes根據(jù)pv設(shè)置的回收策略進(jìn)行資源的回收 對(duì)于PV,管理員可以設(shè)定回收策略,用于設(shè)置與之綁定的PVC釋放資源之后如何處理遺留數(shù)據(jù)的問題。只有PV的存儲(chǔ)空間完成回收,才能供新的PVC綁定和使用

參考
黑馬B站k8s課程https://www.bilibili.com/video/BV1Qv41167ck/
https://gitee.com/yooome/golang/blob/main/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B-%E8%B0%83%E6%95%B4%E7%89%88/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B.md
https://www.yuque.com/fairy-era/yg511q/xyqxge
浙公網(wǎng)安備 33010602011771號(hào)