概念
存儲管理跟計算管理是兩個不同的問題。理解每個存儲系統(tǒng)是一件復(fù)雜的事情,特別是對于普通用戶來說,有時并不需要關(guān)心各種存儲實現(xiàn),只希望能夠安全可靠地存儲數(shù)據(jù)。
為了簡化對存儲調(diào)度,K8S對存儲的供應(yīng)和使用做了抽象,以API形式提供給管理員和用戶使用。要完成這 一任務(wù),引入了兩個新的API資源:Persistent
Volume(持久卷,以下簡稱PV)和Persistent Volume Claim(持久卷申請,以下簡稱PVC)。
PV是集群中的一塊網(wǎng)絡(luò)存儲,跟Node一樣,也是集群的資源。PV跟Volume(卷)類似,不過會有獨立于Pod的生命周期。由系統(tǒng)管理員配置創(chuàng)建的一個數(shù)據(jù)卷(即PV類型),它代表了某一類存儲插件實現(xiàn)。
PVC是用戶的一個請求,跟Pod類似。Pod消費Node的資源,PVC消費PV的資源。Pod
能夠申請?zhí)囟ǖ馁Y源(CPU和內(nèi)存);PVC能夠申請?zhí)囟ǖ某叽绾驮L問模式(例如可以加載一個讀寫,以及多個只讀實例),而無須感知后端的存儲實現(xiàn)。.
PV類型
PV類型使用插件的形式來實現(xiàn)。K8S現(xiàn)在支持以下插件:
GCEPersistentDisk
AWSElasticBlockStore
AzureFile
AzureDisk
FC (FibreChannel)
Flocker
NFS
iSCSI
RBD (CephBlock Device)
CephFS
Cinder(OpenStack block storage)
Glusterfs
VsphereVolume
QuobyteVolumes
HostPath
VMware Photon
PortworxVolumes
ScaleIOVolumes
PV、PVC生命周期
PV是集群的資源。PVC是對這一資源的請求,也是對資源的所有權(quán)的檢驗。PV和PVC 之間的互動遵循如下的生命周期。
供應(yīng)
集群管理員會創(chuàng)建一系列的PV。這些PV包含了為集群用戶提供的真實存儲資源??衫?K8S API來消費。
綁定
用戶創(chuàng)建一個包含了容量和訪問模式的PVC。Master會監(jiān)聽PVC的產(chǎn)生,并嘗試根據(jù)請求內(nèi)容查找匹配的PV,并把PV和PVC進行綁定。用戶能夠獲取滿足需要的資源,并且在使用過程中可能超出請求數(shù)量。
如果找不到合適的卷,這一申請就會持續(xù)處于非綁定狀態(tài),一直到出現(xiàn)合適的PV。例如一個集群準(zhǔn)備了很多的50G大小的持久卷,(雖然總量足夠)也是無法響應(yīng)100G的申請的,除非把100G的PV加入集群。
使用
Pod把PVC作為卷來使用。集群會通過PVC查找綁定的PV,并Mount給Pod。對于支持多種訪問方式的卷,用戶在使用 PVC
作為卷時,可以指定需要的訪問方式。
一旦用戶擁有了一個已經(jīng)綁定的PVC,被綁定的PV就歸該用戶所有了。用戶的Pods能夠通過在Pod的卷中包含的PVC來訪問他們占有的PV。
釋放
當(dāng)用戶完成對卷的使用時,就可以利用API刪除PVC對象了,而且還可以重新申請。刪除PVC后,對應(yīng)的卷被視為“被釋放”,但這時還不能給其他的PVC使用。之前的PVC數(shù)據(jù)還保存在卷中,要根據(jù)策略來進行后續(xù)處理。
回收
PV的回收策略向集群闡述了在PVC釋放卷時,應(yīng)如何進行后續(xù)工作。目前可以采用三種策略:保留,回收或者刪除。保留策略允許重新申請這一資源。在PVC能夠支持的情況下,刪除策略會同時刪除卷以及AWS
EBS/GCE PD或者Cinder卷中的存儲內(nèi)容。如果插件能夠支持,回收策略會執(zhí)行基礎(chǔ)的擦除操作(rm -rf
/thevolume/*),這一卷就能被重新申請了。
創(chuàng)建范例
PV
每個PV包含一個spec,用于描述該卷的規(guī)格和狀態(tài)。
cat << EOF > pv-lykops-sfs-0.yaml apiVersion: v1 kind: PersistentVolume
metadata: name: pv-lykops-sfs-0 labels: type: nfs app: pv version: v1 spec:
capacity: storage: 1Gi accessModes: -ReadWriteMany
persistentVolumeReclaimPolicy: Recycle nfs: path: /data server: 192.168.20.128
readOnly: false EOF kubectl create -f pv-lykops-sfs-0.yaml
Capacity(容量)
一般來說,PV會指定存儲容量。這里需要使用PV的capcity屬性。
目前存儲大小是唯一一個能夠被申請的指標(biāo)。
Access Modes(訪問模式)
只要資源提供者支持,持久卷能夠被用任何方式加載到主機上。每種存儲都會有不同的能力,每個PV的訪問模式也會被設(shè)置成為該卷所支持的特定模式。例如NFS能夠支持多個讀寫客戶端,但某個NFS
PV可能會在服務(wù)器上以只讀方式使用。每個PV都有自己的一系列的訪問模式,這些訪問模式取決于PV的能力。
訪問模式的可選范圍如下:
ReadWriteOnce:該卷能夠以讀寫模式被加載到一個節(jié)點上。
ReadOnlyMany:該卷能夠以只讀模式加載到多個節(jié)點上。
ReadWriteMany:該卷能夠以讀寫模式被多個節(jié)點同時加載。
在 CLI 下,訪問模式縮寫為:
RWO:ReadWriteOnce
ROX:ReadOnlyMany
RWX:ReadWriteMany
重要!一個卷不論支持多少種訪問模式,同時只能以一種訪問模式加載。例如一個
GCEPersistentDisk既能支持ReadWriteOnce,也能支持ReadOnlyMany。
Recycling Policy(回收策略)
當(dāng)前的回收策略可選值包括:
Retain-人工重新申請
Recycle-基礎(chǔ)擦除(“rm-rf /thevolume/*”)
Delete-相關(guān)的存儲資產(chǎn),例如AWSEBS或GCE PD卷一并刪除。
目前,只有NFS和HostPath支持Recycle策略,AWSEBS、GCE PD支持Delete策略。
階段(Phase)
一個卷會處于如下階段之一:
Available:可用資源,尚未被綁定到PVC上
Bound:該卷已經(jīng)被綁定
Released:PVC已經(jīng)被刪除,但該資源尚未被集群回收
Failed:該卷的自動回收過程失敗。
CLI 會顯示綁定到該 PV 的 PVC。
PVC
cat << EOF > pvc-lykops-sfs-0.yaml apiVersion: v1 kind: PersistentVolumeClaim
metadata: name: pvc-lykops-sfs-0 labels: type: nfs app: pvc version: v1 spec:
accessModes: -ReadWriteMany resources: requests: storage: 1Gi EOF kubectl
create -f pvc-lykops-sfs-0.yaml
訪問模式
PVC使用跟PV一致的訪問模式。
資源
PVC跟Pod一樣可以請求特定數(shù)量的資源。在這里的請求內(nèi)容就是存儲(storage)。Resource Model 文中提到的內(nèi)容對 PV 和 PVC
同樣適用。
StatefulSet調(diào)用
Pod能夠借助PVC來訪問存儲。PVC必須跟Pod
處于同一個命名空間。集群找到Pod命名空間中的PVC,然后利用PVC獲取到PV。這個卷就會被加載到主機上,讓Pod使用。
cat << EOF > lykops-sfs.yaml apiVersion: apps/v1beta1 kind: StatefulSet
metadata: name: lykops-sfs labels: software: apache project: lykops app:
lykops-sfs version: v1spec: serviceName: lykops-sfs template: metadata: labels:
software: apache project: lykops app: lykops-sfs version: v1 name: test-sfs
spec: containers: - name: lykops-sfs image: web:apache ports: - containerPort:
80 name: apache volumeMounts: - name: pvc mountPath: /data/
volumeClaimTemplates: -metadata: name: pvc spec: accessModes: - ReadWriteMany
resources: requests: storage: 1Gi EOF kubectl create -f lykops-sfs.yaml
PV、PVC、調(diào)用資源的創(chuàng)建注意事項
使用限制
PVC、PV不能使用在deployment、rc、rs等場景下
命名規(guī)則
如上面的例子:
調(diào)用PVC的StatefulSet:StatefulSet名稱為test-sfs,卷名為pvc
PV:pv-test-sfs-{0,1}
PVC:pvc-test-sfs-{0,1}
規(guī)則如下:
PVC和PV的命名規(guī)則為:資源類型-StatefulSet名稱-副本數(shù)序號(從0開始)
PV和PVC的yaml規(guī)劃
除了命名規(guī)則外,還需要保證訪問accessModes、resources這兩個一樣
按照以上規(guī)則創(chuàng)建后,可以看到PV和PVC能關(guān)聯(lián)起來
本文轉(zhuǎn)自開源中國-kubernetes資源對象--持久化存儲Persistent Volume和Persistent Volume Claim
<https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fmy.oschina.net%2Flykops%2Fblog%2F1616477>
熱門工具 換一換