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

 

 

 

 


免責聲明!

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



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