1. 程式人生 > >k8s的pv和pvc(阿里雲伺服器nfs建立pv)

k8s的pv和pvc(阿里雲伺服器nfs建立pv)

全棧工程師開發手冊 (作者:欒鵬)

簡介

PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的兩種API資源,用於抽象儲存細節。管理員關注於如何通過pv提供儲存功能而無需關注使用者如何使用,同樣的使用者只需要掛載pvc到容器中而不需要關注儲存卷採用何種技術實現。

pvc和pv的關係與pod和node關係類似,前者消耗後者的資源。pvc可以向pv申請指定大小的儲存資源並設定訪問模式。

生命週期

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

  • 供應準備。管理員在叢集中建立多個pv供使用者使用。
  • 繫結。使用者建立pvc並指定需要的資源和訪問模式。在找到可用pv之前,pvc會保持未繫結狀態。
  • 使用。使用者可在pod中像volume一樣使用pvc。
  • 釋放。使用者刪除pvc來回收儲存資源,pv將變成“released”狀態。由於還保留著之前的資料,這些資料需要根據不同的策略來處理,否則這些儲存資源無法被其他pvc使用。
  • 回收。pv可以設定三種回收策略:保留(Retain),回收(Recycle)和刪除(Delete)。
  • 保留策略允許人工處理保留的資料。
  • 刪除策略將刪除pv和外部關聯的儲存資源,需要外掛支援。
  • 回收策略將執行清除操作,之後可以被新的pvc使用,需要外掛支援。

pv型別

pv支援以下型別:

  • GCEPersistentDisk
  • AWSElasticBlockStore
  • NFS
  • iSCSI
  • RBD (Ceph Block Device)
  • Glusterfs
  • HostPath (single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)

pv屬性

pv擁有以下屬性:

  • 容量。目前僅支援儲存大小,未來可能支援IOPS和吞吐量等。
  • 訪問模式。ReadWriteOnce:單個節點讀寫。ReadOnlyMany:多節點只讀。ReadWriteMany:多節點讀寫。掛載時只能使用一種模式。
  • 回收策略。目前NFS和HostPath支援回收。 AWS、EBS、GCE、PD和Cinder支援刪除。
  • 階段。分為Available(未繫結pvc)、Bound(已繫結)、Released(pvc已刪除但資源未回收)、Failed(自動回收失敗)

可以通過

kubectl get pv       檢視

pvc屬性

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

pv和pvc執行原理

PersistentVolumeClaimBinder以單例模式執行在master上,它會監控所有pvc並將它們繫結到與請求資源最接近的足量的pv上。也就是說pvc佔用的實際儲存資源可能會大於請求的資源。k8s不保證底層儲存的高可用,需要提供者負責。

NewPersistentVolumeOrderedIndex用來索引不同訪問模式的pv並基於容量排序。PersistentVolumeClaimBinder根據pvc的需求來查詢索引。

pv是全域性的,pvc可以指定namespace。

預設情況下pv使用的回收策略為Retain,此時如果繫結的pvc刪除後,pv將處於“Released”狀態,需要手動處理pv或自定義回收指令碼。

阿里雲建立pv

先來建立pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: cloudai-code-pv
  namespace: cloudai-2
  labels:
    alicloud-pvname: pv-nas
spec:     # 定義pv屬性
  capacity:         # 容量
    storage: 1Gi   # 儲存容量
  storageClassName: nas
  accessModes:    # 訪問模式
    - ReadWriteMany   # ReadWriteOnce:單個節點讀寫。ReadOnlyMany:多節點只讀。ReadWriteMany:多節點讀寫。掛載時只能使用一種模式。
  flexVolume:
    driver: "alicloud/nas"   # 這裡是固定的
    options:
      server: "xxxxxxxxxxxxxxxxxxxx"   # 這裡要問阿里雲管理者
      path: "/k8s/cloudai2/code"
      vers: "4.0"
  persistentVolumeReclaimPolicy: Recycle   # 回收策略  目前NFS和HostPath支援回收Recycle。 AWS、EBS、GCE、PD和Cinder支援刪除Delete。Retain保留所有的資料資源

再來建立pvc

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: cloudai-code-pvc
  namespace: cloudai-2
spec:
  storageClassName: nas
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  selector:
    matchLabels:
      alicloud-pvname: pv-nas

建立了pvc,我們就可以在pod中將pvc作為目錄,掛載到pod內部目錄了。多個pod可以掛載同一個pvc目錄

pod中將目錄掛載帶pvc


apiVersion: apps/v1
kind: Deployment
metadata:
  name: lp-deployment     # 部署的名稱,部署負責pod的正常執行個數,不負責pod內分散式處理
  namespace: cloudai-2
spec:   # 包括一些container,storage,volume以及其他Kubernetes需要的引數,以及諸如是否在容器失敗時重新啟動容器的屬性。可在特定Kubernetes API找到完整的Kubernetes Pod的屬性。
  selector:    
    matchLabels:
      app: lp-pod   # 根據標籤選擇選擇部署下一層的容器組,複製保持容器組的正常執行個數
  replicas: 1   # 選項定義需要的副本個數,此處可以設定很多屬性,例如受此Deployment影響的Pod的選擇器等
  template:   # template其實就是對Pod物件的定義。沒有為pod指定名稱,會自動在deployment的名稱後面加隨機字串
    metadata:
      labels:
        app: lp-pod   # 為容器組(pod)打標籤,
    spec: 
      volumes: 
      - name: config-path  
        persistentVolumeClaim:
            claimName: cloudai-code-pvc
      imagePullSecrets:
      - name: hubsecret
      containers:
      - name: lp-container     # 容器名稱
        image: xxxxxxxxxxx    # 基於的映象名, 根據映象建立容器
        command: ['sleep','30000']
        volumeMounts:
        - name: config-path
          mountPath: /app