1. 程式人生 > 其它 >k8s儲存持久化(nfs用例)

k8s儲存持久化(nfs用例)

在k8s中對於儲存的資源抽象了兩個概念,分別是PersistentVolume(PV)、PersistentVolumeClaim(PVC)。

  • PV是叢集中的資源
  • PVC是對這些資源的請求。

PV和PVC都只是抽象的概念,在k8s中是通過外掛的方式提供具體的儲存實現,目前包含有NFS、ceph、iSCSI和雲提供商指定的儲存系統。

一、認識PV/PVC/StorageClass

1、概念介紹

  管理儲存是管理計算的一個明顯問題。該PersistentVolume子系統為使用者和管理員提供了一個API,用於抽象如何根據消費方式提供儲存的詳細資訊。為此,我們引入了兩個新的API資源:PersistentVolume和PersistentVolumeClaim

PV :PersistentVolume(持久化卷),是對底層的共享儲存的一種抽象,PV 由管理員進行建立和配置,它和具體的底層的共享儲存技術的實現方式有關,比如 Ceph、GlusterFS、NFS 等,都是通過外掛機制完成與共享儲存的對接。

  PersistentVolumeClaim(PVC)是由使用者進行儲存的請求。 它類似於pod。 Pod消耗節點資源,PVC消耗PV資源。Pod可以請求特定級別的資源(CPU和記憶體)。宣告可以請求特定的大小和訪問模式(例如,可以一次讀/寫或多次只讀)。

  雖然PersistentVolumeClaims允許使用者使用抽象儲存資源,但是PersistentVolumes對於不同的問題,使用者通常需要具有不同屬性(例如效能)。群集管理員需要能夠提供各種PersistentVolumes不同的方式,而不僅僅是大小和訪問模式,而不會讓使用者瞭解這些卷的實現方式。對於這些需求,有StorageClass資源。

  StorageClass為管理員提供了一種描述他們提供的儲存的“類”的方法。 不同的類可能對映到服務質量級別,或備份策略,或者由群集管理員確定的任意策略。 Kubernetes本身對於什麼類別代表是不言而喻的。 這個概念有時在其他儲存系統中稱為“配置檔案”。

PV是運維人員來建立的,開發操作PVC,可是大規模叢集中可能會有很多PV,如果這些PV都需要運維手動來處理這也是一件很繁瑣的事情,所以就有了動態供給概念,也就是Dynamic Provisioning,動態供給的關鍵就是StorageClass,它的作用就是建立PV模板。建立StorageClass裡面需要定義PV屬性比如儲存型別、大小等;另外建立這種PV需要用到儲存外掛。最終效果是,使用者提交PVC,裡面指定儲存型別,如果符合我們定義的StorageClass,則會為其自動建立PV並進行繫結。

  PVC和PV是一一對應的。

PV和PVC中的spec關鍵欄位要匹配,比如儲存(storage)大小。

PV和PVC中的storageClassName欄位必須一致。

2、生命週期

  PV是群集中的資源。PVC是對這些資源的請求,並且還充當對資源的檢查。PV和PVC之間的相互作用遵循以下生命週期:

Provisioning ——-> Binding ——–>Using——>Releasing——>Recycling

  • 供應準備Provisioning---通過叢集外的儲存系統或者雲平臺來提供儲存持久化支援。
    • - 靜態提供Static:叢集管理員建立多個PV。 它們攜帶可供叢集使用者使用的真實儲存的詳細資訊。 它們存在於Kubernetes API中,可用於消費
    • - 動態提供Dynamic:當管理員建立的靜態PV都不匹配使用者的PersistentVolumeClaim時,叢集可能會嘗試為PVC動態配置卷。 此配置基於StorageClasses:PVC必須請求一個類,並且管理員必須已建立並配置該類才能進行動態配置。 要求該類的宣告有效地為自己禁用動態配置。
  • 繫結Binding---使用者建立pvc並指定需要的資源和訪問模式。在找到可用pv之前,pvc會保持未繫結狀態。
  • 使用Using---使用者可在pod中像volume一樣使用pvc。
  • 釋放Releasing---使用者刪除pvc來回收儲存資源,pv將變成“released”狀態。由於還保留著之前的資料,這些資料需要根據不同的策略來處理,否則這些儲存資源無法被其他pvc使用。
  • 回收Recycling---pv可以設定三種回收策略:保留(Retain),回收(Recycle)和刪除(Delete)。
    • - 保留策略:允許人工處理保留的資料。
    • - 刪除策略:將刪除pv和外部關聯的儲存資源,需要外掛支援。
    • - 回收策略:將執行清除操作,之後可以被新的pvc使用,需要外掛支援。

注:目前只有NFS和HostPath型別卷支援回收策略,AWS EBS,GCE PD,Azure Disk和Cinder支援刪除(Delete)策略。

3、PV型別

  • GCEPersistentDisk
  • AWSElasticBlockStore
  • AzureFile
  • AzureDisk
  • FC (Fibre Channel)
  • Flexvolume
  • Flocker
  • NFS
  • iSCSI
  • RBD (Ceph Block Device)
  • CephFS
  • Cinder (OpenStack block storage)
  • Glusterfs
  • VsphereVolume
  • Quobyte Volumes
  • HostPath (Single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)
  • Portworx Volumes
  • ScaleIO Volumes
  • StorageOS

4、PV卷階段狀態

  • Available – 資源尚未被claim使用
  • Bound – 卷已經被繫結到claim了
  • Released – claim被刪除,卷處於釋放狀態,但未被叢集回收。
  • Failed – 卷自動回收失敗

二、建立PV演示

1、準備nfs服務資料

1、準備nfs服務

  在nfs伺服器上先建立儲存卷對應的目錄

# mkdir -p  /k8s_volumes/v{1,2,3,4,5}
# ls /k8s_volumes/
v1  v2  v3  v4  v5
# cd /k8s_volumes/
# echo "<h1>NFS stor 01</h1>" > v1/index.html
# echo "<h1>NFS stor 02</h1>" > v2/index.html
# echo "<h1>NFS stor 03</h1>" > v3/index.html
# echo "<h1>NFS stor 04</h1>" > v4/index.html
# echo "<h1>NFS stor 05</h1>" > v5/index.html

修改nfs的配置:

# vim /etc/exports
/k8s_volumes/v1   192.168.0.*(rw,async,no_root_squash)
/k8s_volumes/v2   192.168.0.*(rw,async,no_root_squash)
/k8s_volumes/v3   192.168.0.*(rw,async,no_root_squash)
/k8s_volumes/v4   192.168.0.*(rw,async,no_root_squash)
/k8s_volumes/v5   192.168.0.*(rw,async,no_root_squash)

檢視NFS配置:

# exportfs -arv
exporting 192.168.0.*:/k8s_volumes/v5
exporting 192.168.0.*:/k8s_volumes/v4
exporting 192.168.0.*:/k8s_volumes/v3
exporting 192.168.0.*:/k8s_volumes/v2
exporting 192.168.0.*:/k8s_volumes/v1

配置生效:

# showmount -e
Export list for localhost:
/k8s_volumes/v5 192.168.0.*
/k8s_volumes/v4 192.168.0.*
/k8s_volumes/v3 192.168.0.*
/k8s_volumes/v2 192.168.0.*
/k8s_volumes/v1 192.168.0.*

2、在master上建立PV

  編寫yaml檔案,並建立pv。建立5個pv,儲存大小各不相同,是否可讀也不相同:pv-demo.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels:
    name: pv001
spec:
  nfs:
    path: /k8s_volumes/v1
    server: 192.168.0.3
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  persistentVolumeReclaimPolicy: Recycle
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
  labels:
    name: pv002
spec:
  nfs:
    path: /k8s_volumes/v2
    server: 192.168.0.3
  accessModes: ["ReadWriteOnce"]
  persistentVolumeReclaimPolicy: Recycle
  capacity:
    storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
  labels:
    name: pv003
spec:
  nfs:
    path: /k8s_volumes/v3
    server: 192.168.0.3
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  persistentVolumeReclaimPolicy: Recycle
  capacity:
    storage: 20Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
  labels:
    name: pv004
spec:
  nfs:
    path: /k8s_volumes/v4
    server: 192.168.0.3
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  persistentVolumeReclaimPolicy: Recycle
  capacity:
    storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
  labels:
    name: pv005
spec:
  nfs:
    path: /k8s_volumes/v5
    server: 192.168.0.3
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  persistentVolumeReclaimPolicy: Recycle
  capacity:
    storage: 15Gi

注:accessModes:支援三種類型:

ReadWriteMany 多路讀寫,卷能被叢集多個節點掛載並讀寫

ReadWriteOnce 單路讀寫,卷只能被單一叢集節點掛載讀寫

ReadOnlyMany 多路只讀,卷能被多個叢集節點掛載且只能讀

nfs,它支援全部三種。但是ISCI就不支援ReadWriteMany;HostPath就不支援ReadOnlyMany和ReadWriteMany

建立PV:

# kubectl apply -f pv-demo.yaml
# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   2Gi        RWO,RWX        Recycle          Available                                   45s
pv002   5Gi        RWO            Recycle          Available                                   45s
pv003   20Gi       RWO,RWX        Recycle          Available                                   45s
pv004   10Gi       RWO,RWX        Recycle          Available                                   45s
pv005   15Gi       RWO,RWX        Recycle          Available                                   45s

3、建立PVC,繫結PV

  編寫yaml檔案,並建立pvc。建立一個pvc,需要6G儲存;所以不會匹配pv001、pv002、pv003,vol-pvc-demo.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  namespace: default
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 10Gi

建立PVC:

# kubectl apply -f vol-pvc-demo.yaml 
查詢驗證:pvc已經繫結到pv004上 # kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mypvc Bound pv004 10Gi RWO,RWX 13s # kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv001 2Gi RWO,RWX Recycle Available 21m pv002 5Gi RWO Recycle Available 21m pv003 20Gi RWO,RWX Recycle Available 21m pv004 10Gi RWO,RWX Recycle Bound default
/mypvc 21m pv005 15Gi RWO,RWX Recycle Available 21m

4、pod應用:使用PVC掛載

pod-pvc-demo.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: vol-pvc
  namespace: default
spec:
  volumes:
  - name: html
    persistentVolumeClaim:
      claimName: mypvc
  containers:
  - name: myapp
    image: nginx
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/

建立:

注意:k8s 該pod所在NODE節點伺服器需要安裝nfs-utils,否則掛載會報錯,POD無法執行。建議每臺節點都安裝

# yum install nfs-utils -y

# kubectl apply -f pod-pvc-demo.yaml 
# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-twjgm   1/1     Running   0          21h   10.244.3.33   k8snode02   <none>           <none>
producer-consumer        2/2     Running   0          20h   10.244.2.2    k8snode01   <none>           <none>
test-pod                 1/1     Running   0          12h   10.244.3.36   k8snode02   <none>           <none>
vol-pvc                  1/1     Running   0          12m   10.244.3.37   k8snode02   <none>           <none>

查詢業務驗證:

# kubectl exec -it vol-pvc -- df -h
Filesystem                   Size  Used Avail Use% Mounted on
overlay                       36G  3.4G   32G  10% /
tmpfs                         64M     0   64M   0% /dev
tmpfs                        2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/mapper/centos-root       36G  3.4G   32G  10% /etc/hosts
shm                           64M     0   64M   0% /dev/shm
192.168.0.3:/k8s_volumes/v4  3.6T  1.9T  1.6T  55% /usr/share/nginx/html
tmpfs                        2.0G   12K  2.0G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                        2.0G     0  2.0G   0% /proc/acpi
tmpfs                        2.0G     0  2.0G   0% /proc/scsi
tmpfs                        2.0G     0  2.0G   0% /sys/firmware


# kubectl exec -it vol-pvc -- curl 127.0.0.1
<h1>NFS stor 04</h1>

https://www.cnblogs.com/zjz20/p/12807286.html

https://blog.csdn.net/qq_25611295/article/details/86065053

https://www.cnblogs.com/chenqionghe/p/11609008.html