云原生技術(shù)持久化存儲(chǔ)PV與PVC
1.PV與PVC
PV:
持久卷(PersistentVolume)簡(jiǎn)稱(chēng)PV,是集群中的一塊存儲(chǔ),可以由管理員事先供應(yīng)。
可以配置NFS、Ceph等常用存儲(chǔ)配置,相對(duì)于volumes,提供了更多的功能,如生命周期管理、大小的限制。
PV 卷的供應(yīng)有兩種方式:靜態(tài)供應(yīng)或動(dòng)態(tài)供應(yīng)。
靜態(tài):
集群管理員預(yù)先創(chuàng)建許多PV,在PV的定義中能夠體現(xiàn)存儲(chǔ)資源的特性。
動(dòng)態(tài):
集群管理員無(wú)須預(yù)先創(chuàng)建PV,而是通過(guò)StorageClass的設(shè)置對(duì)后端存儲(chǔ)資源進(jìn)行描述,標(biāo)記存儲(chǔ)的類(lèi)型和特性。用戶(hù)通過(guò)創(chuàng)建PVC對(duì)存儲(chǔ)類(lèi)型進(jìn)行申請(qǐng),系統(tǒng)將自動(dòng)完成PV的創(chuàng)建及與PVC的綁定。如果PVC聲明的Class為空"",則說(shuō)明PVC不使用動(dòng)態(tài)模式。
PVC:
持久卷申領(lǐng)(PersistentVolumeClaim,PVC)表達(dá)的是用戶(hù)對(duì)存儲(chǔ)的請(qǐng)求。就像Pod消耗Node的資源一樣,PVC消耗PV資源。PVC可以申請(qǐng)存儲(chǔ)空間的大?。╯ize)和訪問(wèn)模式。
由管理員創(chuàng)建PV連接到后端存儲(chǔ),使用人員或管理員創(chuàng)建PVC使用PV資源。
2.PV資源回收
當(dāng)用戶(hù)不再使用其存儲(chǔ)卷時(shí),他們可以從 API 中將 PVC 對(duì)象刪除,從而允許 該資源被回收再利用。PV 對(duì)象的回收策略告訴集群,當(dāng)其被 從申領(lǐng)中釋放時(shí)如何處理該數(shù)據(jù)卷。 目前,數(shù)據(jù)卷可以被 Retained(保留)、Recycled(回收)或 Deleted(刪除)。
Retain:保留資源
保留策略可以管理員手動(dòng)回收資源,當(dāng)PVC被刪除后,PV仍然存在,對(duì)應(yīng)的數(shù)據(jù)卷被視為"已釋放(released)",管理員可以手動(dòng)回收資源。
Delete:刪除數(shù)據(jù)
需要插件支持,如果支持,那么刪除PVC時(shí)也會(huì)自動(dòng)刪除PV和相關(guān)的后端存儲(chǔ)資源;動(dòng)態(tài)卷默認(rèn)為delete。
Recycle:回收(棄用)
回收策略已被棄用,代替者為動(dòng)態(tài)供應(yīng)。如果下層的卷插件支持,回收策略 Recycle 會(huì)在卷上執(zhí)行一些基本的 擦除(rm -rf /thevolume/*)操作,之后允許該卷用于新的 PVC 申領(lǐng)。
3.訪問(wèn)模式
ReadWriteOnce
:
卷可以被一個(gè)節(jié)點(diǎn)以讀寫(xiě)方式掛載。 ReadWriteOnce 訪問(wèn)模式也允許運(yùn)行在同一節(jié)點(diǎn)上的多個(gè) Pod 訪問(wèn)卷,縮寫(xiě)為RWO。
ReadOnlyMany
:
卷可以被多個(gè)節(jié)點(diǎn)以只讀方式掛載,縮寫(xiě)為ROX。
ReadWriteMany
:
卷可以被多個(gè)節(jié)點(diǎn)以讀寫(xiě)方式掛載,縮寫(xiě)為RWX。
ReadWriteOncePod
:
卷可以被單個(gè) Pod 以讀寫(xiě)方式掛載。 如果你想確保整個(gè)集群中只有一個(gè) Pod 可以讀取或?qū)懭朐?PVC, 請(qǐng)使用ReadWriteOncePod 訪問(wèn)模式。這只支持 CSI 卷以及需要 Kubernetes 1.22 以上版本,縮寫(xiě)為RWOP。
注意: 你的存儲(chǔ)支不支持這種訪問(wèn)模式,具體情況查看:官方文檔
4.存儲(chǔ)分類(lèi)
文件存儲(chǔ)(Filesystem):
一些數(shù)據(jù)可能需要多個(gè)節(jié)點(diǎn)使用,比如用戶(hù)頭像、用戶(hù)上傳文件等,實(shí)現(xiàn)方式:NFS、NAS、FTP等;NFS和FTP不推薦。
塊存儲(chǔ)(block):
一些數(shù)據(jù)只能被一個(gè)節(jié)點(diǎn)使用,或者是一塊裸盤(pán)整個(gè)掛載使用,比如數(shù)據(jù)庫(kù)、redis等,實(shí)現(xiàn)方式是Ceph、GlusterFS、公有云等。
對(duì)象存儲(chǔ):
由程序代碼直接實(shí)現(xiàn)的一種存儲(chǔ)方式,云原生應(yīng)用無(wú)狀態(tài)化常用的實(shí)現(xiàn)方式;實(shí)現(xiàn)方式:一般是符合53標(biāo)準(zhǔn)的云存儲(chǔ),比如AWS的53存儲(chǔ)、Minio等。
5.創(chuàng)建PV卷
列舉兩個(gè)實(shí)例,其他類(lèi)型可參考官網(wǎng),因?yàn)槲疫@資源有限。
5.1.實(shí)例:創(chuàng)建NAS/NFS類(lèi)型的PV
生產(chǎn)不推薦NFS??梢允褂肗AS。
準(zhǔn)備一臺(tái)NFS服務(wù)器
第一步:準(zhǔn)備一臺(tái)NFS服務(wù)器,我這個(gè)裝的有點(diǎn)多,你也可以只安裝nfs服務(wù)器
[root@localhost ~]# yum -y install nfs* rpcbind
第二步:所有節(jié)點(diǎn)安裝nfs客戶(hù)端,不然不能識(shí)別,每一個(gè)需要掛載nfs的節(jié)點(diǎn)都需要裝
[root@k8s-master01 ~]# yum -y install nfs-utils
第三步:在服務(wù)端創(chuàng)建共享目錄
[root@k8s-master01 ~]# yum -y install nfs-utils
第四步:服務(wù)端配置共享目錄
[root@localhost ~]# cat /etc/exports /data/k8s/ *(rw,sync,no_subtree_check,no_root_squash) [root@localhost ~]# exportfs -r [root@localhost ~]# systemctl restart nfs rpcbind
第五步:有另外一臺(tái)機(jī)器掛載共享目錄測(cè)試是否成功
[root@k8s-master01 hgfs]# mount -t nfs 192.168.10.6:/data/k8s /mnt [root@k8s-master01 mnt]# mkdir hah [root@k8s-master01 mnt]# ls 111.txt hah # 在nfs服務(wù)端查看 [root@localhost k8s]# ls 111.txt hah
創(chuàng)建一個(gè)PV
第一步:編寫(xiě)一個(gè)PV的yaml文件
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs spec: capacity: storage: 2Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: nfs-slow nfs: path: /data/k8s server: 192.168.10.6
對(duì)上面的yaml文件做一下說(shuō)明:
通用的開(kāi)頭就不說(shuō)了
capacity
:容量配置,這個(gè)pv使用多大容量,當(dāng)然需要后端存儲(chǔ)支持才行
volumeMode
:卷的模式,目錄4有說(shuō)明
accessModes:PV
的訪問(wèn)模式,目錄3有說(shuō)明
accessClassName:PV
的類(lèi),特定的PV只能綁定特定的PVC
persistentVolumeReclaimPolicy
:回收策略,目錄2有說(shuō)明
nfs
:NFS服務(wù)配置,里面包含共享目錄和服務(wù)端IP
第二步:執(zhí)行yaml文件創(chuàng)建此PV;注意PV的成功跟后端存儲(chǔ)正不正常沒(méi)什么關(guān)系。
[root@k8s-master01 ~]# kubectl create -f pv-nfs.yaml persistentvolume/pv-nfs created [root@k8s-master01 ~]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-nfs 2Gi RWO Recycle Available nfs-slow 54s
第三步:說(shuō)一下PV的狀態(tài)(STATUS)
Available
:可用,沒(méi)有被PVC綁定的空閑資源
Bound
:已綁定,已經(jīng)被PVC綁定
Released
:已釋放,PVC被刪除,資源未被重新使用
Failed
:失敗,自動(dòng)回收失敗
5.2.實(shí)例:創(chuàng)建一個(gè)hostPath類(lèi)型的PV
當(dāng)你沒(méi)有一個(gè)可靠的存儲(chǔ),但是數(shù)據(jù)又不能丟失,可以?huà)燧d到宿主機(jī)的路徑,即使重啟數(shù)據(jù)還在。
第一步:創(chuàng)建一個(gè)pv-host.yaml文件
apiVersion: v1 kind: PersistentVolume metadata: name: host-pv-volume labels: type: local spec: storageClassName: hostpath capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: "/mnt/data" # 宿主機(jī)路徑
第二步:執(zhí)行yaml文件創(chuàng)建PV
[root@k8s-master01 ~]# kubectl create -f pv-host.yaml persistentvolume/host-pv-volume created 您在 /var/spool/mail/root 中有新郵件 [root@k8s-master01 ~]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE host-pv-volume 1Gi RWO Retain Available hostpath 9s pv-nfs 2Gi RWO Recycle Available nfs-slow 30m
6.PVC
6.1.Pod與PVC與PV的關(guān)系
由一張圖說(shuō)一下PV與PVC的綁定,Pod又是怎么掛載PVC
首先創(chuàng)建一個(gè)PV,它的名字是pv-nfs,storageClassName名字是nfs-slow(這個(gè)名字不唯一,就是說(shuō)其他PV也可以叫這個(gè)名字)
然后創(chuàng)建一個(gè)PVC,它的名字是test-pv-claim,storageClassName名字是nfs-slow(PVC綁定PV也是根據(jù)這個(gè)名字判斷,根據(jù)上一點(diǎn)說(shuō)的特性也就是說(shuō)一個(gè)PVC可以綁定多個(gè)storageClassName名字是nfs-slow的PV)注意PVC設(shè)置的資源大小要等于小于PV。
最后Pod使用的時(shí)候創(chuàng)建一個(gè)volumes,這個(gè)名字是test-pv-storage,這個(gè)volumes使用的PVC資源要寫(xiě)PVC的name,也就是test-pv-claim;等Pod中的容器掛載資源的時(shí)候掛載的名字是volumes的name,也就是test-pv-storage。
6.2.創(chuàng)建一個(gè)PVC掛載到Pod
注意:pvc要和Pod在同一個(gè)命名空間,而pv不需要;因?yàn)槎际窃谀J(rèn)空間,就沒(méi)指定,需要注意。
第一步:編寫(xiě)一個(gè)PVC的yaml文件
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-pv-claim spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 2Gi # 小于等于pv storageClassName: nfs-slow
第二步:執(zhí)行yaml文件創(chuàng)建PVC;從下面這個(gè)狀態(tài)來(lái)看已經(jīng)綁定成功了,綁定了pv-nfs,類(lèi)型為nfs-slow,都是前面指定的。
[root@k8s-master01 ~]# kubectl create -f pvc-nfs.yaml persistentvolumeclaim/test-pv-claim created [root@k8s-master01 ~]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE test-pv-claim Bound pv-nfs 2Gi RWO nfs-slow 20s
第三步:創(chuàng)建Pod掛載PVC
apiVersion: apps/v1 kind: Deployment metadata: labels: app: dp-nginx name: dp-nginx spec: replicas: 1 selector: matchLabels: app: dp-nginx strategy: {} template: metadata: labels: app: dp-nginx spec: volumes: - name: test-pv-storage persistentVolumeClaim: claimName: test-pv-claim containers: - image: nginx name: nginx volumeMounts: - mountPath: "/usr/share/nginx/html" name: test-pv-storage
第四步:創(chuàng)建Pod,進(jìn)入Pod查看掛載情況
[root@k8s-master01 ~]# kubectl replace -f dp-nginx.yaml deployment.apps/dp-nginx replaced [root@k8s-master01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE dp-nginx-fcd88d6f8-prxcd 1/1 Running 0 22s [root@k8s-master01 ~]# kubectl exec -ti dp-nginx-fcd88d6f8-prxcd -- bash root@dp-nginx-fcd88d6f8-prxcd:/# df -Th Filesystem Type Size Used Avail Use% Mounted on overlay overlay 17G 5.2G 12G 31% / tmpfs tmpfs 64M 0 64M 0% /dev tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup shm tmpfs 64M 0 64M 0% /dev/shm /dev/mapper/centos-root xfs 17G 5.2G 12G 31% /etc/hosts 192.168.10.6:/data/k8s nfs4 17G 2.4G 15G 14% /usr/share/nginx/html tmpfs tmpfs 3.8G 12K 3.8G 1% /run/secrets/kubernetes.io/serviceaccount tmpfs tmpfs 2.0G 0 2.0G 0% /proc/acpi tmpfs tmpfs 2.0G 0 2.0G 0% /proc/scsi tmpfs tmpfs 2.0G 0 2.0G 0% /sys/firmware # 可以看到10.6的共享目錄已經(jīng)掛載到了/nginx/html下
第五步:測(cè)試,在nfs服務(wù)器共享目錄下創(chuàng)建資源,進(jìn)入Pod容器內(nèi)查看是否存在
# nfs服務(wù)器中創(chuàng)建資源 [root@localhost k8s]# ls 111.txt hah # 在Pod的nginx容器中查看 root@dp-nginx-fcd88d6f8-prxcd:/# cd /usr/share/nginx/html/ root@dp-nginx-fcd88d6f8-prxcd:/usr/share/nginx/html# ls 111.txt hah # 內(nèi)容存在,說(shuō)明創(chuàng)建成功
以上就是云原生技術(shù)持久化存儲(chǔ)PV與PVC的詳細(xì)內(nèi)容,更多關(guān)于云原生持久化存儲(chǔ)PV與PVC的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Google?Kubernetes?Engine?集群實(shí)戰(zhàn)詳解
這篇文章主要為大家介紹了Google?Kubernetes?Engine?集群實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08阿里云kubernetes查找鏡像中jar包的方法(docker查看鏡像中的jar)
這篇文章主要給大家介紹了關(guān)于阿里云kubernetes查找鏡像中jar包的方法,也就是在docker查看鏡像中的jar,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09Kubernetes中使用PersistentVolume掛載云盤(pán)方式
這篇文章主要介紹了Kubernetes中使用PersistentVolume掛載云盤(pán)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02Kubernetes有狀態(tài)應(yīng)用管理StatefulSet使用詳解
這篇文章主要為大家介紹了Kubernetes有狀態(tài)應(yīng)用管理StatefulSet使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11在K8S中實(shí)現(xiàn)會(huì)話(huà)保持的兩種方案
這篇文章主要介紹了在K8S中實(shí)現(xiàn)會(huì)話(huà)保持的兩種方案,每種方案結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03k8s自動(dòng)化安裝腳本(二進(jìn)制)的操作步驟
Kubernetes?k8s安裝腳本,非常好用,下面這篇文章主要給大家介紹了關(guān)于k8s自動(dòng)化安裝腳本(二進(jìn)制)的操作步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09