PV和PVC


一、PV和PVC

1.1、概念

PersistentVolume(PV)是集群中已由管理員配置的一段網絡村吃。集群中的資源就想一個節點是一個集群資源

PV是諸如卷之類卷插件,但是具有獨立於使用PV的任何單個pod的生命周期。該API對象補貨存儲的實現細節,即NFS,iSCSI或雲提供商特定的存儲系統

PersistentVolumeClaims(PVC)是用戶存儲的請求。PVC的使用邏輯:在pod中定義一個存儲卷(該存儲卷類型為pvc),定義的時候直接指定大小,pvc必須與對應的pv建立關系,pvc會根據定義去pv申請,而pv是由存儲空間創建出來的。pv和pvc是k8s抽象出來的一種存儲資源

雖然PersistentVolumeClaims允許用戶使用抽象存儲資源,但是常見的需求是,用戶需要根據不同的需求去創建pv,用於不同的場景。而此時需要集群管理員提供不同需求的PV,而不僅僅是pv的大小和訪問模式,但又不需要用戶了解這些卷的實現細節。對於這樣的需求,此時可以采用StorageClass資源

pv是集群中的資源。pvc是對這些資源的請求,也是對資源的索引檢查。pv和pvc之間的相互作用遵循這個生命周期

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

1.2、兩種PV提供方式

1.2.1、靜態

集群管理員創建一些PV。它們攜帶可供集群用戶使用的真實存儲的詳細信息。它們存在於K8SAPI中,可用於消費

1.2.2、動態

通過存儲類進行動態創建存儲空間
當管理員創建的靜態PV都不匹配用戶的PVC時,集群可能會嘗試動態的為PVC配置卷。此配置基於Storageclass:PVC
必須請求存儲類,並且管理員必須已創建並配置該類才能進行動態配置,要求該類的聲明有效的為自己禁用動態配置

1.3、PV定義

kubectl	explain pv		#查看pv的定義方式

kubectl explain pv.spec	#查看pv定義的規格
spec:
  nfs(定義存儲類型)
    path(定義掛載卷路徑)
	server(定義服務器名稱)
  accessModes(定義訪問模式,以下有三種訪問模式,以列表的方式存在,也就是說可以定義多個訪問模式)
    ReadWriteOnec(RWO)	#單節點讀寫
    ReadOnlyMany(ROX)   #多節點只讀
	ReadWriteMany(RWX)	#多節點讀寫
  capacity(定義pv空間的大小)
    storage(指定大小)

kubectl explain pvc	#查看pvc的定義方式

kubectl explain pvc.spec
spec:
  accessModes(定義訪問模式,必須是pv的訪問模式的子集)
  resources(定義申請資源的大小)
    requests:
	  storage:

二、基於NFS使用靜態pv和pvc

2.1、環境准備

192.168.80.11 master01
192.168.80.12 node01
192.168.80.13 node02
192.168.80.14 nfs

2.2、配置nfs存儲

systemctl stop firewalld
setenforce 0
hostnamctl set-hostname nfs

mkdir -p /data/v{1..5}
chmod 777 -R /data/*

vim /etc/exports
/data/v1 192.168.80.0/24(rw,no_root_squash)
/data/v2 192.168.80.0/24(rw,no_root_squash)
/data/v3 192.168.80.0/24(rw,no_root_squash)
/data/v4 192.168.80.0/24(rw,no_root_squash)
/data/v5 192.168.80.0/24(rw,no_root_squash)

systemctl start rpcbind
systemctl start nfs

exportfs -arv	#發布共享
showmount -e	#查看共享

echo '111111' > /data/v1/index.html
echo '222222' > /data/v2/index.html
echo '333333' > /data/v3/index.html
echo '444444' > /data/v4/index.html
echo '555555' > /data/v5/index.html

2.3、定義PV

//這里定義5個Pv,並且定義掛載的路徑以及訪問模式,還有pv划分的大小

vim pv-demo.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
labels:
  name: pv1
spec:
  nfs:
    path: /data/v1
    server: nfs
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv2
  labels:
    name: pv2
spec:
  nfs:
    path: /data/v2
    server: nfs
  accessModes: ["ReadWriteOnce"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv3
  labels:
    name: pv3
spec:
  nfs:
    path: /data/v3
    server: nfs
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv4
  labels:
    name: pv4
spec:
  nfs:
    path: /data/v4
    server: nfs
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv5
  labels:
    name: pv5
spec:
  nfs:
    path: /data/v5
    server: nfs
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 5Gi

kubectl apply -f pv-demo.yaml

kubectl get pv

2.4、定義PVC

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

vim pvc-demo.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: pv-pvc
spec:
  containers:
  - name: myapp
    image: nginx
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html
    persistentVolumeClaim:
      claimName: mypvc

kubectl apply -f pvc-demo.yaml
kubectl get pv

三、基於動態storageclass創建pv與pvc

3.1 storageclass的用處

在pv和pvc使用過程中存在的問題,在pvc申請存儲空間時,未必就有現成的pv符合pvc申請的需求,上面nfs在做pvc可以成功的因素是因為我們做了指定的需求處理。當PvC申請的存儲空間不一定有滿足PvC要求的Pv時,Kubernetes為管理員提供了描述存儲"class(類)"的方法(StorageClass)。舉個例子,在存儲系統中划分一個1TB的存儲空間提供給Kubernetes使用,當用戶需要一個10G的PvC時,會立即通過restful發送請求,從而讓存儲空間創建一個10G的image,之后在我們的集群中定義成10c的Pv供給給當前的Pvc作為掛載使用。在此之前我們的存儲系統必須支持restful接口,比如ceph分布式存儲,而glusterfs則需要借助第三方接口完成這樣的請求

3.2 storageclass的yaml格式

kubectl explain storageclass #storageclass也是k8s上的資源
KIND: Storageclass
VERSION: storage.k8s.io/vl
FIELDS:
allowVolumeExpansion <boolean>
allowedTopologies<[]Object>apiversion<string>
kind <string>
metadata <object>
  mountOptions <[]string>掛載選項
  parameters <map[string]string#參數,取決於分配器,可以接受不同的參數。例如,參數type的值 io1和參數iopsPerGB特定於EBS PV。當參數被省略時,會使用默認值。
  provisioner <string-requred-#存儲分配器,用來決定使用哪個卷插件分配 PV。該字段必須指定。
  reclaimPolicy <string>#回收策略,可以是 Delete或者 Retain。如果 StorageClass 對象被創建時沒有指定 reclaimPolicy,它將默認為 Delete。
  volumeBindingMode<string>#卷的綁定模式


StorageClass 中包含 provisioner、parameters和 reclaimPolicy字段,當 class需要動態分配 PersistentVolume時會使用到。由於storageclass需要一個獨立的存儲系統,此處就不再演示。從其他資料查看定義storageclass的方式如下:

kind: storageClass
apiversion: storage.k8s.io/v1432
metadata :
  name : standard
provisioner: kubernetes.iol aws-ebs435 parameters:
  type: gp2
reclaimPolicy: Retain
mountoptions:
  - debug


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM