kubernetes中PV和PVC

目錄

一、PV、PVC簡介

二、PV、PVC關系

三、創建靜態PV

1.配置nfs存儲

2.定義PV

?3.定義PVC

4.測試訪問

四、?搭建 StorageClass + nfs-client-provisioner ,實現 NFS 的動態 PV 創建

1.?配置nfs服務

2.創建 Service Account

3.使用 Deployment 來創建 NFS Provisioner

3.1由于 1.20 版本啟用了 selfLink,所以 k8s 1.20+ 版本通過 nfs provisioner 動態生成pv會報錯,解決方法如下

3.2創建 NFS Provisioner?

4.創建 StorageClass

5.創建 PVC 和 Pod 測試


一、PV、PVC簡介

PV 全稱叫做 Persistent Volume,持久化存儲卷。K8S在指定存儲設備空間中邏輯劃分創建的可持久化的存儲資源對象。

PVC 的全稱是 Persistent Volume Claim,是持久化存儲的請求。是對PV資源對象的請求和綁定,也是Pod能掛載使用的一種存儲卷類型。

PV是集群中的資源。 PVC是對這些資源的請求,也是對資源的索引檢查。?

二、PV、PVC關系

?PV和PVC之間的相互作用遵循生命周期:

Provisioning(配置)---> Binding(綁定)---> Using(使用)---> Releasing(釋放) ---> Recycling(回收)

  • Provisioning,即 PV 的創建,可以直接創建 PV(靜態方式),也可以使用 StorageClass 動態創建
  • Binding,將 PV 分配給 PVC
  • Using,Pod 通過 PVC 使用該 Volume,并可以通過準入控制StorageProtection(1.9及以前版本為PVCProtection) 阻止刪除正在使用的 PVC
  • Releasing,Pod 釋放 Volume 并刪除 PVC
  • Reclaiming,回收 PV,可以保留 PV 以便下次使用,也可以直接從云存儲中刪除

?根據5個階段,PV的狀態有以下4種:

  • Available(可用):表示可用狀態,還未被任何 PVC 綁定
  • Bound(已綁定):表示 PV 已經綁定到 PVC
  • Released(已釋放):表示 PVC 被刪掉,但是資源尚未被集群回收
  • Failed(失敗):表示該 PV 的自動回收失敗

PV從創建到銷毀的具體流程:?

  1. 一個PV創建完后狀態會變成Available,等待被PVC綁定。
  2. 一旦被PVC邦定,PV的狀態會變成Bound,就可以被定義了相應PVC的Pod使用。
  3. Pod使用完后會釋放PV,PV的狀態變成Released。
  4. 變成Released的PV會根據定義的回收策略做相應的回收工作。有三種回收策略,Retain、Delete和Recycle。

PV回收策略:

  • Retain(保留):當用戶刪除與之綁定的PVC時候,這個PV被標記為released(PVC與PV解綁但還沒有執行回收策略)且之前的數據依然保存在該PV上,但是該PV不可用,需要手動來處理這些數據并刪除該PV。
  • Delete(刪除):刪除與PV相連的后端存儲資源。對于動態配置的PV來說,默認回收策略為Delete。表示當用戶刪除對應的PVC時,動態配置的volume將被自動刪除。(只有 AWS EBS, GCE PD, Azure Disk 和 Cinder 支持)
  • Recycle(回收):如果用戶刪除PVC,則刪除卷上的數據,卷不會刪除。(只有 NFS 和 HostPath 支持)

三、創建靜態PV

創建使用 靜態PV

  1. 準備好存儲設備和共享目錄
  2. 手動創建PV資源,配置 存儲卷類型 訪問模式(RWO RWX ROX RWOP) 存儲空間大小 ?回收策略(Retain Recycle Delete)等
  3. 創建PVC資源,配置請求PV資源的訪問模式(必要條件,必須是PV能支持的訪問模式) 存儲空間大小(默認就近選擇大于等于指定大小的PV)來綁定PV
  4. 創建Pod和Pod控制器資源掛載PVC存儲卷,配置存儲卷類型為 persistentVolumeClaim ,并在容器配置中定義存儲卷掛載點目錄??

1.配置nfs存儲

mkdir /data/v{1..5}vim /etc/exports
/data/v1 192.168.88.0/24(rw,no_root_squash,sync)
/data/v2 192.168.88.0/24(rw,no_root_squash,sync)
/data/v3 192.168.88.0/24(rw,no_root_squash,sync)
/data/v4 192.168.88.0/24(rw,no_root_squash,sync)
/data/v5 192.168.88.0/24(rw,no_root_squash,sync)exportfs -arvshowmount -e

2.定義PV

vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:        #由于 PV 是集群級別的資源,即 PV 可以跨 namespace 使用,所以 PV 的 metadata 中不用配置 namespacename: pv01labels:name: pv01
spec:nfs:                        #定義存儲類型path: /data/v1            #定義掛載卷路徑server: 192.168.88.60     #定義服務器名稱或地址accessModes:                #定義訪問模型- ReadWriteOnce- ReadWriteManycapacity:                   #定義存儲能力,一般用于設置存儲空間storage: 1Gi              #指定大小storageClassName: slow      #自定義存儲類名稱,此配置用于綁定具有相同類別的PVC和PVpersistentVolumeReclaimPolicy: Retain  #回收策略(Retain/Delete/Recycle)
--- 
apiVersion: v1
kind: PersistentVolume
metadata:name: pv02labels:name: pv02
spec:nfs:path: /data/v2server: 192.168.88.60accessModes:- ReadWriteOncecapacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv03labels:name: pv03
spec:nfs:path: /data/v3server: 192.168.88.60accessModes:- ReadWriteOnce- ReadWriteManycapacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv04labels:name: pv04
spec:nfs:path: /data/v4server: 192.168.88.60accessModes:- ReadWriteOnce- ReadWriteManycapacity:storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv05labels:name: pv05
spec:nfs:path: /data/v5server: 192.168.88.60accessModes:- ReadWriteOnce- ReadWriteManycapacity:storage: 5Gikubectl apply -f pv.yaml

?3.定義PVC

定義了pvc的訪問模式為多路讀寫,該訪問模式必須在前面pv定義的訪問模式之中。定義PVC申請的大小為2Gi,此時PVC會自動去匹配多路讀寫且大小為2Gi的PV,匹配成功獲取PVC的狀態即為Bound

vim pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim   #定義類型為pvc
metadata:name: mypvc-anamespace: default
spec:accessModes:                #定義pvc的訪問模式- ReadWriteManyresources:requests:storage: 2Gi            #定義請求pv的大小
---
apiVersion: v1
kind: Pod
metadata:name: pod-vol-pvcnamespace: default
spec:containers:- name: myappimage: nginx:1.14volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlpersistentVolumeClaim:    #定義掛載的pvc詳細信息claimName: mypvc-a      #掛載pvc的名稱kubectl apply -f pvc.yaml

4.測試訪問

在存儲服務器上創建index.html,并寫入數據,通過訪問Pod進行查看,可以獲取到相應的頁面。
cd /data/v3/
echo "welcome to use pv3" > index.htmlkubectl get pods -o widecurl  10.244.1.37
welcome to use pv3

四、?搭建 StorageClass + nfs-client-provisioner ,實現 NFS 的動態 PV 創建

Kubernetes 本身支持的動態 PV 創建不包括 NFS,所以需要使用外部存儲卷插件分配PV。詳見:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

卷插件稱為 Provisioner(存儲分配器),NFS 使用的是 nfs-client,這個外部卷插件會使用已經配置好的 NFS 服務器自動創建 PV。
Provisioner:用于指定 Volume 插件的類型,包括內置插件(如 kubernetes.io/aws-ebs)和外部插件(如 external-storage 提供的 ceph.com/cephfs)。

創建使用動態PV

  1. 準備好存儲設備和共享目錄
  2. 如果是外置存儲卷插件,需要先創建serviceaccount賬戶(Pod使用的賬戶)和做RBAC授權(創建角色授予相關資源對象的操作權限,再將賬戶和角色進行綁定),使serviceaccount賬戶具有對PV PVC StorageClass等資源的操作權限
  3. 創建外置存儲卷插件provisioner的Pod,配置中使用serviceaccount賬戶作為Pod的用戶,并設置相關環境變量參數
  4. 創建StorageClass(SC)資源,配置中引用存儲卷插件的插件(PROVISIONER_NAME)
  5. 創建PVC資源,配置中設置 StorageClass資源名稱 訪問模式 存儲空間大小。創建PVC資源會自動創建相關的PV資源。
  6. 創建Pod資源掛載PVC存儲卷,配置存儲卷類型為 persistentVolumeClaim ,并在容器配置中定義存儲卷掛載點目錄
    ?

1.?配置nfs服務

mkdir /opt/k8s
chmod 777 /data/volumesvim /etc/exports
/data/volumes 192.168.88.0/24(rw,no_root_squash,sync)exportfs -arv

2.創建 Service Account

Service Account:用來管理 NFS Provisioner 在 k8s 集群中運行的權限,設置 nfs-client 對 PV,PVC,StorageClass 等的規則

vim nfs-client-rbac.yaml
#創建 Service Account 賬戶,用來管理 NFS Provisioner 在 k8s 集群中運行的權限
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner
---
#創建集群角色
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: nfs-client-provisioner-clusterrole
rules:
- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]resources: ["persistentvolumesclaims"]verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]
- apiGroups: [""]resources: ["events"]verbs: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]resources: ["endpoints"]verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
---
#集群角色綁定
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: nfs-client-provisioner-clusterrolebinding
subjects:
- kind: ServiceAccountname: nfs-client-provisionernamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-clusterroleapiGroup: rbac.authorization.k8s.ioverbs: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]resources: ["endpoints"]kubectl apply -f nfs-client-rbac.yaml

3.使用 Deployment 來創建 NFS Provisioner

NFS Provisioner(即 nfs-client),有兩個功能:一個是在 NFS 共享目錄下創建掛載點(volume),另一個則是將 PV 與 NFS 的掛載點建立關聯。

3.1由于 1.20 版本啟用了 selfLink,所以 k8s 1.20+ 版本通過 nfs provisioner 動態生成pv會報錯,解決方法如下

vim /etc/kubernetes/manifests/kube-apiserver.yaml
spec:containers:- command:- kube-apiserver- --feature-gates=RemoveSelfLink=false   #添加這行- --advertise-address=192.168.88.70kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
kubectl delete pods kube-apiserver -n kube-system 
kubectl get pods -n kube-system | grep apiserver

3.2創建 NFS Provisioner?

vim nfs-client-provisioner.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisioner
spec:replicas: 1selector:matchLabels:app: nfs-client-provisionerstrategy:type: Recreatetemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: quay.io/external_storage/nfs-client-provisioner:latestimagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: nfs-storage       #配置provisioner的Name,確保該名稱與StorageClass資源中的provisioner名稱保持一致- name: NFS_SERVERvalue: 192.168.88.60     #配置綁定的nfs服務器- name: NFS_PATHvalue: /data/volumes     #配置綁定的nfs服務器目錄volumes:                     #申明nfs數據卷- name: nfs-client-rootnfs:server: 192.168.88.60path: /data/volumeskubectl apply -f nfs-client-provisioner.yaml     
kubectl get pod                              

4.創建 StorageClass

StorageClass:負責建立 PVC 并調用 NFS provisioner 進行預定的工作,并讓 PV 與 PVC 建立關聯

vim nfs-client-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client-storageclass
provisioner: nfs-storage      #這里的名稱要和provisioner配置文件中的環境變量PROVISIONER_NAME保持一致
parameters:archiveOnDelete: "false"     #false表示在刪除PVC時不會對數據目錄進行打包存檔,即刪除數據;為ture時就會自動對數據目錄進行打包存檔,存檔文件以archived開頭kubectl apply -f nfs-client-storageclass.yaml
kubectl get storageclass

5.創建 PVC 和 Pod 測試

vim test-pvc-pod.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: test-nfs-pvc#annotations: volume.beta.kubernetes.io/storage-class: "nfs-client-storageclass"     #另一種SC配置方式,(annotations也可表示為注釋字段)
spec:accessModes:- ReadWriteManystorageClassName: nfs-client-storageclass    #關聯StorageClass對象resources:requests:storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:name: test-storageclass-pod
spec:containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand:- "/bin/sh"- "-c"args:- "sleep 3600"volumeMounts:- name: nfs-pvcmountPath: /mntrestartPolicy: Nevervolumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-nfs-pvc      #與PVC名稱保持一致#PVC 通過 StorageClass 自動申請到空間
kubectl get pvc
#查看 NFS 服務器上是否生成對應的目錄,自動創建的 PV 會以 ${namespace}-${pvcName}-${pvName} 的目錄格式放到 NFS 服務器上
ls /data/volumes#進入 Pod 在掛載目錄 /mnt 下寫一個文件,然后查看 NFS 服務器上是否存在該文件
kubectl exec -it test-storageclass-pod sh
/ # cd /mnt/
/mnt # echo 'this is test file' > test.txt#發現 NFS 服務器上存在,說明驗證成功
cat /data/volumes/default-test-nfs-pvc-pvc-bff2245e-990d-4119-a846-06f898f95efb

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36714.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36714.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36714.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Figma中文社區來啦,云端協作設計你準備好了嗎?

Figma是改變產品設計協作方式的重要工具,但由于沒有中文社區,對國內設計師的約束較大。而擁有全中文UI 界面、功能齊全的即時設計資源廣場,恰好彌補了Figma的這一短板,它也將取代Figma成為設計師新寵。 1、UI組件集 Figma中文社區替代即時設計資源廣場,擁有海量豐富的UI設計組…

【BEV Review】論文 Delving into the Devils of Bird’s-eye-view 2022-9 筆記

背景 一般來說,自動駕駛車輛的視覺傳感器(比如攝像頭)安裝在車身上方或者車內后視鏡上。無論哪個位置,攝像頭所得到的都是真實世界在透視視圖(Perspective View)下的投影(世界坐標系到圖像坐標系…

ssm柚子云電子商城java圖書購物電子商務管理jsp源代碼

本項目為前幾天收費幫學妹做的一個項目,Java EE JSP項目,在工作環境中基本使用不到,但是很多學校把這個當作編程入門的項目來做,故分享出本項目供初學者參考。 一、項目描述 ssm柚子云電子商城 系統有2權限:前臺、后…

SpringBoot筆記:SpringBoot 集成 Dataway 多數據源配置(二)

文章目錄 前言核心代碼和配置yml 配置注入多數據源常用Spi實現swagger 配置自定義 Udf指定數據源進行查詢 前言 之前簡單介紹了一下 Dataway 使用,本文繼續介紹一下它的多數據源配置和使用。 核心代碼和配置 yml 配置 # springboot多環境配置 #端口,…

JavaScript應用:五子棋游戲實戰開發

🏆作者簡介,黑夜開發者,全棧領域新星創作者?,CSDN博客專家,阿里云社區專家博主,2023年6月csdn上海賽道top4。 🏆數年電商行業從業經驗,歷任核心研發工程師,項目技術負責…

面試熱題(螺旋矩陣)

給你一個 m 行 n 列的矩陣 matrix ,請按照 順時針螺旋順序 ,返回矩陣中的所有元素 一看到這個大家有沒有想到 就是一個螺旋形狀,那這道題我們應該怎么解決? 我們先來仔細的看,它這種螺旋形狀的遍歷是先【右-下-左-上】…

Docker中Tomcat部署步驟

第一次訪問沒有東西。

為什么我不推薦任何人用C語言作為編程啟蒙第一課?

前言 寫了20多年的代碼,之前做過阿里的高級架構師,在技術這條路上跌跌撞撞了很多,我今天分享一些我個人的自學方法給各位。為什么我會說:不推薦任何人用C語言作為編程啟蒙第一課? 這里有很多同學要站出來說了&#x…

實現CP指令

一、文件的打開創建 #include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags); flags: O_RDONLY 只讀 O_WRONLY 只寫 O_RDWR 可讀可寫 int open(const char *pathname, int flags, mode_t mode); 如果 …

VsCode美化 - VsCode自定義 - VsCode自定義背景圖

VsCode美化 - VsCode自定義 - VsCode自定義背景圖&#xff1a;添加二次元老婆圖到VsCode 前言 作為一個二刺螈&#xff0c;VsCode用久了&#xff0c;總覺得少了些什么。是啊&#xff0c;高效的代碼生產工具中怎么能沒有老婆呢&#xff1f; 那就安裝一個VsCode插件把老婆添加…

章節7:Burp Intruder模塊

章節7&#xff1a;Burp Intruder模塊 參考資料 https://portswigger.net/burp/documentation/desktop/tools/intruder 01 Intruder模塊作用與原理 原理 http://xxx.xx.com/bbs/index.php?namewuyanzu&mottogo 對請求參數進行修改&#xff0c;分析響應內容&#xff0…

Linux 內核第一版 (v0.01) 開源代碼解讀

探索Linux v0.01的內部結構&#xff0c;Linux內核經常被認為是一個龐大的開源軟件。在撰寫本文時&#xff0c;最新版本是v6.5-rc5&#xff0c;包含36M行代碼。不用說&#xff0c;Linux是幾十年來許多貢獻者辛勤工作的成果。 Linux 內核首個開源版本 (v0.01) 的體積非常小&…

四、Dubbo擴展點加載機制

四、Dubbo擴展點加載機制 4.1 加載機制概述 Dubbo良好的擴展性與框架中針對不同場景使用合適設計模式、加載機制密不可分 Dubbo幾乎所有功能組件都是基于擴展機制&#xff08;SPI&#xff09;實現的 Dubbo SPI 沒有直接使用 Java SPI&#xff0c;在它思想上進行改進&#xff…

競賽項目 深度學習的視頻多目標跟蹤實現

文章目錄 1 前言2 先上成果3 多目標跟蹤的兩種方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟蹤過程4.1 存在的問題4.2 基于軌跡預測的跟蹤方式 5 訓練代碼6 最后 1 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 基于深度學習的視頻多目標跟蹤實現 …

全網最牛,Appium自動化測試框架-關鍵字驅動+數據驅動實戰(二)

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 util 包 util 包…

數據可視化工具LightningChart .NET正式發布v10.5.1——擁有全新的3D新功能

LightningChart.NET完全由GPU加速&#xff0c;并且性能經過優化&#xff0c;可用于實時顯示海量數據-超過10億個數據點。 LightningChart包括廣泛的2D&#xff0c;高級3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D餅/甜甜圈&#xff0c;地理地圖和GIS圖表以及適用于科學…

網絡安全專業術語英文縮寫對照表

因在閱讀文獻過程中經常遇到各種專業縮寫&#xff0c;所以把各種縮寫總結了一下。 因能力有限&#xff0c;錯誤在所難免&#xff0c;歡迎進行糾錯與補充&#xff1a;https://github.com/piaolin/CSAbbr 滲透相關 縮寫全稱解釋備注XSSCross Site Script Attack跨站腳本攻擊為…

ResNet創新點總結

ResNet&#xff08;Residual Networks&#xff09;是深度學習中的一個重要架構&#xff0c;其創新點主要體現在解決了深層神經網絡訓練中的梯度消失和梯度爆炸問題&#xff0c;從而使得可以構建更深的神經網絡。以下是 ResNet 的創新點總結&#xff1a; ??1. 殘差連接&#x…

nlohmann json:通過items遍歷object/array

//官方的例子 #include <iostream> #include <nlohmann/json.hpp>using json = nlohmann::json;int main() {// create JSON valuesjson j_object = {{"one", 1}, {"two", 2}};json j_array = {1, 2, 4, 8, 16};// example for an objectfor (…

java畢業設計-智慧食堂管理系統-內容快覽

首頁 智慧食堂管理系統是一種可以提高食堂運營效率的管理系統。它將前端代碼使用Vue實現&#xff0c;后端使用Spring Boot實現。這個系統的目的是簡化食堂管理&#xff0c;提高食堂服務質量。在現代快節奏的生活中&#xff0c;人們對餐飲服務提出了更高的要求&#xff0c;食堂管…