云原生技術(shù)持久化存儲PV與PVC
1.PV與PVC
PV:
持久卷(PersistentVolume)簡稱PV,是集群中的一塊存儲,可以由管理員事先供應(yīng)。
可以配置NFS、Ceph等常用存儲配置,相對于volumes,提供了更多的功能,如生命周期管理、大小的限制。
PV 卷的供應(yīng)有兩種方式:靜態(tài)供應(yīng)或動態(tài)供應(yīng)。
靜態(tài):
集群管理員預(yù)先創(chuàng)建許多PV,在PV的定義中能夠體現(xiàn)存儲資源的特性。
動態(tài):
集群管理員無須預(yù)先創(chuàng)建PV,而是通過StorageClass的設(shè)置對后端存儲資源進行描述,標記存儲的類型和特性。用戶通過創(chuàng)建PVC對存儲類型進行申請,系統(tǒng)將自動完成PV的創(chuàng)建及與PVC的綁定。如果PVC聲明的Class為空"",則說明PVC不使用動態(tài)模式。
PVC:
持久卷申領(lǐng)(PersistentVolumeClaim,PVC)表達的是用戶對存儲的請求。就像Pod消耗Node的資源一樣,PVC消耗PV資源。PVC可以申請存儲空間的大?。╯ize)和訪問模式。
由管理員創(chuàng)建PV連接到后端存儲,使用人員或管理員創(chuàng)建PVC使用PV資源。
2.PV資源回收
當用戶不再使用其存儲卷時,他們可以從 API 中將 PVC 對象刪除,從而允許 該資源被回收再利用。PV 對象的回收策略告訴集群,當其被 從申領(lǐng)中釋放時如何處理該數(shù)據(jù)卷。 目前,數(shù)據(jù)卷可以被 Retained(保留)、Recycled(回收)或 Deleted(刪除)。
Retain:保留資源
保留策略可以管理員手動回收資源,當PVC被刪除后,PV仍然存在,對應(yīng)的數(shù)據(jù)卷被視為"已釋放(released)",管理員可以手動回收資源。
Delete:刪除數(shù)據(jù)
需要插件支持,如果支持,那么刪除PVC時也會自動刪除PV和相關(guān)的后端存儲資源;動態(tài)卷默認為delete。
Recycle:回收(棄用)
回收策略已被棄用,代替者為動態(tài)供應(yīng)。如果下層的卷插件支持,回收策略 Recycle 會在卷上執(zhí)行一些基本的 擦除(rm -rf /thevolume/*)操作,之后允許該卷用于新的 PVC 申領(lǐng)。
3.訪問模式
ReadWriteOnce
:
卷可以被一個節(jié)點以讀寫方式掛載。 ReadWriteOnce 訪問模式也允許運行在同一節(jié)點上的多個 Pod 訪問卷,縮寫為RWO。
ReadOnlyMany
:
卷可以被多個節(jié)點以只讀方式掛載,縮寫為ROX。
ReadWriteMany
:
卷可以被多個節(jié)點以讀寫方式掛載,縮寫為RWX。
ReadWriteOncePod
:
卷可以被單個 Pod 以讀寫方式掛載。 如果你想確保整個集群中只有一個 Pod 可以讀取或?qū)懭朐?PVC, 請使用ReadWriteOncePod 訪問模式。這只支持 CSI 卷以及需要 Kubernetes 1.22 以上版本,縮寫為RWOP。
注意: 你的存儲支不支持這種訪問模式,具體情況查看:官方文檔
4.存儲分類
文件存儲(Filesystem):
一些數(shù)據(jù)可能需要多個節(jié)點使用,比如用戶頭像、用戶上傳文件等,實現(xiàn)方式:NFS、NAS、FTP等;NFS和FTP不推薦。
塊存儲(block):
一些數(shù)據(jù)只能被一個節(jié)點使用,或者是一塊裸盤整個掛載使用,比如數(shù)據(jù)庫、redis等,實現(xiàn)方式是Ceph、GlusterFS、公有云等。
對象存儲:
由程序代碼直接實現(xiàn)的一種存儲方式,云原生應(yīng)用無狀態(tài)化常用的實現(xiàn)方式;實現(xiàn)方式:一般是符合53標準的云存儲,比如AWS的53存儲、Minio等。
5.創(chuàng)建PV卷
列舉兩個實例,其他類型可參考官網(wǎng),因為我這資源有限。
5.1.實例:創(chuàng)建NAS/NFS類型的PV
生產(chǎn)不推薦NFS??梢允褂肗AS。
準備一臺NFS服務(wù)器
第一步:準備一臺NFS服務(wù)器,我這個裝的有點多,你也可以只安裝nfs服務(wù)器
[root@localhost ~]# yum -y install nfs* rpcbind
第二步:所有節(jié)點安裝nfs客戶端,不然不能識別,每一個需要掛載nfs的節(jié)點都需要裝
[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
第五步:有另外一臺機器掛載共享目錄測試是否成功
[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)建一個PV
第一步:編寫一個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
對上面的yaml文件做一下說明:
通用的開頭就不說了
capacity
:容量配置,這個pv使用多大容量,當然需要后端存儲支持才行
volumeMode
:卷的模式,目錄4有說明
accessModes:PV
的訪問模式,目錄3有說明
accessClassName:PV
的類,特定的PV只能綁定特定的PVC
persistentVolumeReclaimPolicy
:回收策略,目錄2有說明
nfs
:NFS服務(wù)配置,里面包含共享目錄和服務(wù)端IP
第二步:執(zhí)行yaml文件創(chuàng)建此PV;注意PV的成功跟后端存儲正不正常沒什么關(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
第三步:說一下PV的狀態(tài)(STATUS)
Available
:可用,沒有被PVC綁定的空閑資源
Bound
:已綁定,已經(jīng)被PVC綁定
Released
:已釋放,PVC被刪除,資源未被重新使用
Failed
:失敗,自動回收失敗
5.2.實例:創(chuàng)建一個hostPath類型的PV
當你沒有一個可靠的存儲,但是數(shù)據(jù)又不能丟失,可以掛載到宿主機的路徑,即使重啟數(shù)據(jù)還在。
第一步:創(chuàng)建一個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" # 宿主機路徑
第二步:執(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)系
由一張圖說一下PV與PVC的綁定,Pod又是怎么掛載PVC
首先創(chuàng)建一個PV,它的名字是pv-nfs,storageClassName名字是nfs-slow(這個名字不唯一,就是說其他PV也可以叫這個名字)
然后創(chuàng)建一個PVC,它的名字是test-pv-claim,storageClassName名字是nfs-slow(PVC綁定PV也是根據(jù)這個名字判斷,根據(jù)上一點說的特性也就是說一個PVC可以綁定多個storageClassName名字是nfs-slow的PV)注意PVC設(shè)置的資源大小要等于小于PV。
最后Pod使用的時候創(chuàng)建一個volumes,這個名字是test-pv-storage,這個volumes使用的PVC資源要寫PVC的name,也就是test-pv-claim;等Pod中的容器掛載資源的時候掛載的名字是volumes的name,也就是test-pv-storage。
6.2.創(chuàng)建一個PVC掛載到Pod
注意:pvc要和Pod在同一個命名空間,而pv不需要;因為都是在默認空間,就沒指定,需要注意。
第一步:編寫一個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;從下面這個狀態(tài)來看已經(jīng)綁定成功了,綁定了pv-nfs,類型為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,進入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下
第五步:測試,在nfs服務(wù)器共享目錄下創(chuàng)建資源,進入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)容存在,說明創(chuàng)建成功
以上就是云原生技術(shù)持久化存儲PV與PVC的詳細內(nèi)容,更多關(guān)于云原生持久化存儲PV與PVC的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Google?Kubernetes?Engine?集群實戰(zhàn)詳解
這篇文章主要為大家介紹了Google?Kubernetes?Engine?集群實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08阿里云kubernetes查找鏡像中jar包的方法(docker查看鏡像中的jar)
這篇文章主要給大家介紹了關(guān)于阿里云kubernetes查找鏡像中jar包的方法,也就是在docker查看鏡像中的jar,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-09-09Kubernetes中使用PersistentVolume掛載云盤方式
這篇文章主要介紹了Kubernetes中使用PersistentVolume掛載云盤方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02Kubernetes有狀態(tài)應(yīng)用管理StatefulSet使用詳解
這篇文章主要為大家介紹了Kubernetes有狀態(tài)應(yīng)用管理StatefulSet使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11