k8s的pv和pvc(阿里雲伺服器nfs建立pv)
阿新 • • 發佈:2019-01-31
全棧工程師開發手冊 (作者:欒鵬)
簡介
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