kubernetes資源對象--持久化存儲Persistent Volume和Persistent Volume Claim

概念

存儲管理跟計算管理是兩個不同的問題。理解每個存儲系統是一件複雜的事情,特別是對於普通用戶來說,有時並不需要關心各種存儲實現,只希望能夠安全可靠地存儲數據。

爲了簡化對存儲調度,K8S對存儲的供應和使用做了抽象,以API形式提供給管理員和用戶使用。要完成這一任務,引入了兩個新的API資源:Persistent Volume(持久卷,以下簡稱PV)和Persistent Volume Claim(持久卷申請,以下簡稱PVC)。

PV是集羣中的一塊網絡存儲,跟Node一樣,也是集羣的資源。PV跟Volume(卷)類似,不過會有獨立於Pod的生命週期。由系統管理員配置創建的一個數據卷(即PV類型),它代表了某一類存儲插件實現。

PVC是用戶的一個請求,跟Pod類似。Pod消費Node的資源,PVC消費PV的資源。Pod 能夠申請特定的資源(CPU和內存);PVC能夠申請特定的尺寸和訪問模式(例如可以加載一個讀寫,以及多個只讀實例),而無須感知後端的存儲實現。.

PV類型

PV類型使用插件的形式來實現。K8S現在支持以下插件:

  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是對這一資源的請求,也是對資源的所有權的檢驗。PV和PVC 之間的互動遵循如下的生命週期。

供應

集羣管理員會創建一系列的PV。這些PV包含了爲集羣用戶提供的真實存儲資源。可利用 K8S API來消費。

綁定

用戶創建一個包含了容量和訪問模式的PVC。Master會監聽PVC的產生,並嘗試根據請求內容查找匹配的PV,並把PV和PVC進行綁定。用戶能夠獲取滿足需要的資源,並且在使用過程中可能超出請求數量。

如果找不到合適的卷,這一申請就會持續處於非綁定狀態,一直到出現合適的PV。例如一個集羣準備了很多的50G大小的持久卷,(雖然總量足夠)也是無法響應100G的申請的,除非把100G的PV加入集羣。

使用

Pod把PVC作爲捲來使用。集羣會通過PVC查找綁定的PV,並Mount給Pod。對於支持多種訪問方式的卷,用戶在使用 PVC 作爲卷時,可以指定需要的訪問方式。

一旦用戶擁有了一個已經綁定的PVC,被綁定的PV就歸該用戶所有了。用戶的Pods能夠通過在Pod的卷中包含的PVC來訪問他們佔有的PV。

釋放

當用戶完成對卷的使用時,就可以利用API刪除PVC對象了,而且還可以重新申請。刪除PVC後,對應的卷被視爲“被釋放”,但這時還不能給其他的PVC使用。之前的PVC數據還保存在卷中,要根據策略來進行後續處理。

回收

PV的回收策略向集羣闡述了在PVC釋放卷時,應如何進行後續工作。目前可以採用三種策略:保留,回收或者刪除。保留策略允許重新申請這一資源。在PVC能夠支持的情況下,刪除策略會同時刪除卷以及AWS EBS/GCE PD或者Cinder卷中的存儲內容。如果插件能夠支持,回收策略會執行基礎的擦除操作(rm -rf /thevolume/*),這一卷就能被重新申請了。

創建範例

PV

每個PV包含一個spec,用於描述該卷的規格和狀態。

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屬性。

目前存儲大小是唯一一個能夠被申請的指標。

Access Modes(訪問模式)

只要資源提供者支持,持久卷能夠被用任何方式加載到主機上。每種存儲都會有不同的能力,每個PV的訪問模式也會被設置成爲該卷所支持的特定模式。例如NFS能夠支持多個讀寫客戶端,但某個NFS PV可能會在服務器上以只讀方式使用。每個PV都有自己的一系列的訪問模式,這些訪問模式取決於PV的能力。

訪問模式的可選範圍如下:

ReadWriteOnce:該卷能夠以讀寫模式被加載到一個節點上。

ReadOnlyMany:該卷能夠以只讀模式加載到多個節點上。

ReadWriteMany:該卷能夠以讀寫模式被多個節點同時加載。

在 CLI 下,訪問模式縮寫爲:

RWO:ReadWriteOnce

ROX:ReadOnlyMany

RWX:ReadWriteMany

重要!一個卷不論支持多少種訪問模式,同時只能以一種訪問模式加載。例如一個 GCEPersistentDisk既能支持ReadWriteOnce,也能支持ReadOnlyMany。

Recycling Policy(回收策略)

當前的回收策略可選值包括:

Retain-人工重新申請

Recycle-基礎擦除(“rm-rf /thevolume/*”)

Delete-相關的存儲資產,例如AWSEBS或GCE PD卷一併刪除。

目前,只有NFS和HostPath支持Recycle策略,AWSEBS、GCE PD支持Delete策略。

階段(Phase)

一個卷會處於如下階段之一:

Available:可用資源,尚未被綁定到PVC上

Bound:該卷已經被綁定

Released:PVC已經被刪除,但該資源尚未被集羣回收

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一樣可以請求特定數量的資源。在這裏的請求內容就是存儲(storage)。Resource Model 文中提到的內容對 PV 和 PVC 同樣適用。

StatefulSet調用

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: v1
spec:
 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、調用資源的創建注意事項

使用限制

PVC、PV不能使用在deployment、rc、rs等場景下

命名規則

如上面的例子:

調用PVC的StatefulSet:StatefulSet名稱爲test-sfs,卷名爲pvc

PV:pv-test-sfs-{0,1}

PVC:pvc-test-sfs-{0,1}

規則如下:

PVC和PV的命名規則爲:資源類型-StatefulSet名稱-副本數序號(從0開始)

PV和PVC的yaml規劃

除了命名規則外,還需要保證訪問accessModes、resources這兩個一樣

按照以上規則創建後,可以看到PV和PVC能關聯起來

本文轉自開源中國-kubernetes資源對象--持久化存儲Persistent Volume和Persistent Volume Claim

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章