1. 程式人生 > >Kubernetes Pv & Pvc

Kubernetes Pv & Pvc

編輯 stp 通過 def meta 建議 其他 state ast

Kubernetes PV & pvc


介紹

PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的兩種API資源,用於抽象存儲細節。管理員關註於如何通過pv提供存儲功能而無需
關註用戶如何使用,同樣的用戶只需要掛載pvc到容器中而不需要關註存儲卷采用何種技術實現。
pvc和pv的關系與pod和node關系類似,前者消耗後者的資源。pvc可以向pv申請指定大小的存儲資源並設置訪問模式,這就可以通過Provision -> Claim 的方式,來對存儲資源進行控制。

生命周期

pv和pvc遵循以下生命周期:

  • 供應準備。通過集群外的存儲系統或者雲平臺來提供存儲持久化支持。
    - 靜態提供:管理員手動創建多個PV,供PVC使用。
    - 動態提供:動態創建PVC特定的PV,並綁定。

  • 綁定。用戶創建pvc並指定需要的資源和訪問模式。在找到可用pv之前,pvc會保持未綁定狀態。

  • 使用。用戶可在pod中像volume一樣使用pvc。

  • 釋放。用戶刪除pvc來回收存儲資源,pv將變成“released”狀態。由於還保留著之前的數據,這些數據需要根據不同的策略來處理,否則這些存儲資源無法被其他pvc使用。

  • 回收(Reclaiming)。pv可以設置三種回收策略:保留(Retain),回收(Recycle)和刪除(Delete)。
    - 保留策略:允許人工處理保留的數據。
    - 刪除策略:將刪除pv和外部關聯的存儲資源,需要插件支持。
    - 回收策略:將執行清除操作,之後可以被新的pvc使用,需要插件支持。

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

Provisioning

兩種方式提供的PV資源供給:

  • static

      通過集群管理者創建多個PV,為集群“使用者”提供存儲能力而隱藏真實存儲的細節。並且存在於kubenretes api中,可被直接使用。
    
  • dynamic

      動態卷供給是kubernetes獨有的功能,這一功能允許按需創建存儲建。在此之前,集群管理員需要事先在集群外由存儲提供者或者雲提供商創建
    

存儲卷,成功之後再創建PersistentVolume對象,才能夠在kubernetes中使用。動態卷供給能讓集群管理員不必進行預先創建存儲卷,而是隨著用戶需求
進行創建。在1.5版本提高了動態卷的彈性和可用性。

    在此前1.4版本中加入了一個 新的 API 對象 StorageClass,可以定義多個 StorageClass 對象,並可以分別指定存儲插件、設置參數,用於提

供不同的存儲卷。這樣的設計讓集群管理員能夠在同一個集群內,定義和提供不同類型的、不同參數的卷(相同或者不同的存儲系統)。這樣的設計還確
保了最終用戶在無需了解太多的情況下,有能力選擇不同的存儲選項。

PV類型

pv支持以下類型:

  • GCEPersistentDisk
  • AWSElasticBlockStore
  • NFS
  • iSCSI
  • RBD (Ceph Block Device)
  • Glusterfs
  • AzureFile
  • AzureDisk
  • CephFS
  • cinder
  • FC
  • FlexVolume
  • Flocker
  • PhotonPersistentDisk
  • Quobyte
  • VsphereVolume
  • HostPath (single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)

PV屬性:

  • 訪問模式,與pv的語義相同。在請求資源時使用特定模式。
  • 資源,申請的存儲資源數額。

PV卷階段狀態:

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

AwsElasticBlockServer 靜態PV示例

需要滿足以下條件方可使用EBS:

  • Pod運行的節點必須為AWS EC2實例
  • 這些示例需要和EBS在同一個區域和可用區域
  • EBS只支持一個EC2掛載一個卷
  • RC或者Deployment 副本集只能為1。

1. 創建PV(Persistent Volume)

$ vim ebs-pv.yaml

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: ebs-pv
      labels:
        type: amazonEBS
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteOnce
      awsElasticBlockStore:
        volumeID: vol-079c492115a7be6e1
        fsType: ext4

$ kubectl create -f ebs-pv.yaml

    persistentvolume "ebs-pv" created

2. 創建PVC(Persistent Volume Claim)

$ vim nginx-pvc.yaml

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: nginx-pvc
      labels:
        type: amazonEBS
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi

$ kubectl create -f nginx-pvc.yaml

    persistentvolumeclaim "nginx-pvc" created

3.創建deployment服務使用pvc資源

$ vim nginx-with-pvc.yaml

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: nginx-with-pvc
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            service: nginx
            app: test
        spec:
          containers:
          - image: nginx
            name: nginx-with-pvc
            volumeMounts:
            - mountPath: /test-ebs
              name: my-pvc
          volumes:
          - name: my-pvc
            persistentVolumeClaim:
              claimName: nginx-pvc

kubectl create -f nginx-with-pvc.yaml

    Deployment "nfs-web" created

註意事項

    - 由於aws ebs限制一個ebs只能同時掛載一個ec2,在使用基於pvc的pod時,建議使用replicas=1來創建一個部署集。StatefulSet可解決數據庫集群問題。
    - pod遷移,pvc遷移(卸載舊實例/掛載新實例)默認35秒。
    - 通過deployemnt部署,刪除deployment之後,可重新掛載原有pvc到新的pod裏面。
    - 當pod被刪除,同時刪除依賴的pvc,pv狀態變更為release。此時不能被其他pvc使用,aws ebs需要delete pv重建。目前不支持通過手動回收


- 已經被pvc綁定的pv可以被刪除,刪除後對應的pvc仍為Bound狀態。如有pod正在使用此pvc則仍可使用。如無pod使用,則創建pod掛載此pvc時
會出現失敗。
- pv可以在綁定後被編輯(如訪問模式,容量),導致信息與對應的pvc不一致




鏈接:https://www.jianshu.com/p/fda9de00ba5f

Kubernetes Pv & Pvc