靜態PV是指直接使用YAML文件創建的PV,適用于存儲卷較少,并且不會頻繁修改配置信息的場景。使用靜態PV時,需要在HBlock中先創建好卷,然后創建PV、PVC和Pod,HBlock CSI插件可自動格式化,掛載HBlock的卷。
使用靜態PV的主要流程如下:
創建卷
創建HBlock卷的步驟請參考HBlock用戶手冊。
創建PV
新建PV的YAML配置文件
卷模式為filesystem的示例,創建PV csi-pv-local-stor1lun06a。參考examples\filesystem-volumes\static-pv\csi-pv-local.yaml中的示例。
apiVersion: v1 kind: PersistentVolume metadata: #元數據 name: csi-pv-local-stor1lun06a #PV的名稱 labels: #標簽 app: stor-pv-nocreate-stor1lun06a #PV的標識 spec: capacity: storage: 66Gi #卷容量,單位為GiB,此處配置的卷容量應等于HBlock中創建的卷容量 volumeMode: Filesystem #卷模式,支持Filesystem和Block模式,默認為Filesystem模式。 accessModes: # 訪問模式,Filesystem模式的卷支持ReadWriteOnce,ReadOnlyMany(卷需要提前格式化) - ReadWriteOnce persistentVolumeReclaimPolicy: Retain #持久化卷回收策略,支持Retain和Delete csi: driver: stor.csi.k8s.io volumeHandle: "stor1:lun06a" #指定HBlock卷 volumeAttributes: fsType: xfs # 卷被掛載到容器的文件系統類型,支持xfs,ext4 readOnly: "false" isMultipath: "true" # 是否使用multipath chapEnable: "false" #是否使用CHAP認證 chapUser: "username" chapPassword: "password"卷模式為Block,創建PV csi-pv-local-block-stor2lunb1。參考examples\block-volumes\static-pv\csi-pv-local-block.yaml中的示例。
apiVersion: v1 kind: PersistentVolume metadata: #元數據 name: csi-pv-local-block-stor2lunb1 #PV的名稱 labels: #標簽 app: csi-pv-local-block-stor2lunb1 spec: capacity: storage: 22Gi #卷容量,單位為GiB,此處配置的卷容量應等于HBlock中創建的卷容量 volumeMode: Block #卷模式,支持Filesystem和Block模式,默認為Filesystem模式。 accessModes: # 訪問模式,Block模式的卷支持ReadWriteOnce、ReadOnlyMany、ReadWriteMany - ReadWriteOnce persistentVolumeReclaimPolicy: Retain # 持久化卷回收策略,支持Retain和Delete csi: driver: stor.csi.k8s.io #HBlock CSI插件 volumeHandle: "stor2:lunb1" #指定HBlock卷 volumeAttributes: readOnly: "false" #是否以只讀方式掛載卷 isMultipath: "false" # 是否使用Multipath,HBlock單機版時,取值false chapEnable: "false" #是否使用CHAP認證PV的YAML配置文件參數描述
參數 描述 是否必填 driver HBlock CSI驅動名稱。
取值:HBlock CSI安裝時的驅動名稱。
是 accessModes 訪問模式。
取值:
- ReadWriteOnce:卷可以被一個節點以讀寫的方式掛載。
- ReadOnlyMany:卷可以被多個節點以只讀方式掛載。filesystem模式下,卷需要提前格式化。
- ReadWriteMany:卷可以被多個節點以讀寫方式掛載。僅Block模式的卷支持。
是 volumeHandle 指定具體的HBlock卷名稱,格式為clusterID:lunName。
clusterID:指定HBlock的標識,在csi-configMap.yaml中唯一。詳見配置HBlock訪問地址。
lunName:HBlock中創建的卷名稱。
是 volumeAttributes.fsType 卷被掛載到容器的文件系統類型,支持xfs,ext4。
說明
卷模式為filesystem時必填。
條件 volumeAttributes.readOnly 是否以只讀方式掛載卷。
取值:
- "true"。
- "false"。
默認值為"false"。
注意
這里需要輸入字符串,即"true"或"false"。
否 volumeAttributes.isMultipath 是否使用Multipath。
取值:
- "true"。
- "false"。
默認值為"true"。
注意
這里需要輸入字符串,即"true"或"false"。
如果HBlock集群版使用的HBlock卷沒有啟用高可用模式,即highAvailability為Disabled,此處需要設置為"false",否則會導致pod啟動失敗。
如果是HBlock單機版,此處需要設置為"false"。
條件 volumeAttributes.chapEnable 是否使用CHAP認證。
取值:
- "true"。
- "false"。
默認值為"false"。
注意
這里需要輸入字符串,即"true"或"false"。
否 volumeAttributes.chapUser CHAP認證的用戶名。需要對CHAP認證的用戶名源碼使用DecryptData配置的密鑰對進行AES(ECP、paddingcs7)加密,加密后的結果進行Base64編碼,具體詳見配置加密模式。
源碼:字符串形式,長度范圍是3~64,只能由字母、數字、句點( . )、短橫線( - )、下劃線( _ )、冒號( : )組成,字母區分大小寫,且僅支持以字母或數字開頭。
否 volumeAttributes.chapPassword CHAP認證的密碼。需要對CHAP認證的密碼源碼使用DecryptData配置的密鑰對進行AES(ECP、paddingcs7)加密,加密后的結果進行Base64編碼,具體詳見配置加密模式。
源碼:字符串形式,長度范圍是12~16,只能由字母、數字或下劃線( _ )組成,字母區分大小寫。
否
注意
- 如要使用加密方式配置CHAP密碼,請參考配置加密模式。
- PV的回收策略告訴集群,在PV被釋放之后集群應該如何處理該PV。當前,PV可以被Retain(保留)、 Recycle(再利用)或者Delete(刪除)。HBlock CSI插件目前僅支持Retain和Delete,不支持Recycle。
- 回收策略 Retain 使得用戶可以手動回收資源。當 PersistentVolumeClaim 對象被刪除時,PersistentVolume 卷仍然存在,對應的數據卷被視為“已釋放(released)”。由于卷上仍然存在著前一申領人的數據,該卷還不能用于其他申領。管理員需要手動回收該卷。
- 對于回收策略為Delete的卷配置,刪除動作會將PersistentVolume 對象從Kubernetes中移除,同時也會從外部基礎設施中移除所關聯的存儲資產。動態供應的卷會繼承其StorageClass中設置的回收策略,該策略默認為Delete。管理員需要根據用戶的期望來配置StorageClass。注意,如果PV中使用的是HBlock已經提前創建的卷,則不能通過Kubernetes來刪除該卷。
應用配置文件
以csi-pv-local-stor1lun06a.yaml為例。
[root@server test]# kubectl apply -f csi-pv-local-stor1lun06a.yaml
persistentvolume/csi-pv-local-stor1lun06a created驗證創建的PV
[root@server test]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
csi-pv-local-stor1lun06a 66Gi RWO Retain Available 20s創建PVC
新建PVC的YAML配置文件
卷模式為filesystem,新建PVC csi-pvc-local-nocreate-stor1lun06a的YAML配置文件。參考examples\filesystem-volumes\static-pv\csi-pvc-local-nocreate.yaml中的示例。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: csi-pvc-local-nocreate-stor1lun06a # PVC的名字 namespace: default spec: accessModes: #訪問模式 - ReadWriteOnce resources: requests: storage: 66Gi #卷的容量,單位GiB,Kubernetes會嘗試綁定大于等于該容量的PV selector: matchLabels: app: stor-pv-nocreate-stor1lun06a卷模式為Block,新建PVC csi-pvc-local-nocreate-block-stor2lunb1的配置文件。參考examples\block-volumes\static-pv\csi-pvc-local-nocreate-block.yaml中的示例。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: csi-pvc-local-nocreate-block-stor2lunb1 namespace: default spec: accessModes: - ReadWriteOnce volumeMode: Block resources: requests: storage: 22Gi selector: matchLabels: app: csi-pv-local-block-stor2lunb1
PVC的YAML配置文件參數描述
| 參數 | 描述 | 是否必填 |
|---|---|---|
| metadata.name | PVC的名稱。 | 是 |
| metadata.namespace | 命名空間。 取值:HBlock CSI安裝時綁定的命名空間名稱。 | 是 |
| storage | 卷的容量,單位GiB。. Kubernetes會嘗試綁定大于等于該容量的PV。 | 是 |
| app | 綁定的PV名稱。 | 是 |
應用配置文件
以PVC csi-pvc-local-nocreate-stor1lun06a.yaml為例。
[root@server test]# kubectl apply -f csi-pvc-local-nocreate-stor1lun06a.yaml
persistentvolumeclaim/csi-pvc-local-nocreate-stor1lun06a created驗證已經創建的PVC
以csi-pvc-local-nocreate-stor1lun06a為例。
說明
如果命名空間非default,需要使用命令kubectl get pvc -n namespace查詢。
[root@server test]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
csi-pvc-local-nocreate-stor1lun06a Bound csi-pv-local-stor1lun06a 66Gi RWO 10m注意
- PVC通過容量自動匹配PV,當PV的容量大于等于PVC的容量時,Kubernetes會將PVC和PV進行綁定。如果有多個PV都滿足條件,會選擇第一個PV進行匹配。
- PV和PVC配置文件中如有selector字段,那么app必須配置一致,否則無法綁定。如沒有selector字段,PVC會根據容量匹配PV。
- PVC和PV綁定后,PV無法刪除,如需刪除PV,需要先刪除綁定的PVC。
創建Pod
創建Pod,并和PVC關聯。HBlock CSI插件將自動完成格式化卷(如果未格式化),掛載卷。
新建Pod的YAML配置文件
卷模式為filesystem,創建Pod my-csi-app-local-pv-stor1lun06a的配置文件,參考examples\filesystem-volumes\static-pv\csi-app-local-pv.yaml中的示例。
kind: Pod apiVersion: v1 metadata: name: my-csi-app-local-pv-stor1lun06a #創建的Pod名稱 # Set to the actual namespace namespace: default #HBlock CSI安裝時綁定的命名空間 spec: containers: - name: my-frontend #容器名稱 image: busybox #請替換為容器使用的鏡像 imagePullPolicy: "IfNotPresent" #容器鏡像的拉取策略 volumeMounts: - mountPath: "/test6a" # 卷掛載到容器的目標路徑 name: lun06a # 對應volumes標簽下的資源名 command: [ "sleep", "1000000" ] volumes: - name: lun06a # volumes資源名,可以在volumeMounts下掛載 persistentVolumeClaim: claimName: csi-pvc-local-nocreate-stor1lun06a # Pod指定使用的PVC名稱卷模式為Block,創建Pod csi-app-local-pv-block-stor2lunb1的配置文件csi-app-local-pv-stor1lun06a.yaml,參考examples\block-volumes\static-pv\csi-app-local-pv-block.yaml中的示例。
kind: Pod apiVersion: v1 metadata: name: csi-app-local-pv-block-stor2lunb1 # Set to the actual namespace namespace: default spec: containers: - name: lunb1 image: busybox imagePullPolicy: "IfNotPresent" volumeDevices: - devicePath: "/dev/testb1" name: lunb1 command: [ "sleep", "1000000" ] volumes: - name: lunb1 persistentVolumeClaim: claimName: csi-pvc-local-nocreate-block-stor2lunb1
應用配置文件
以csi-app-local-pv-stor1lun06a.yaml 為例。
[root@server test]# kubectl apply -f csi-app-local-pv-stor1lun06a.yaml
pod/my-csi-app-local-pv-stor1lun06a created驗證Pod中掛載的卷
說明
如果命名空間非default,需要使用命令kubectl get pod -n namespace|grep Podname查詢。
[root@server test]# kubectl get pod|grep my-csi-app-local-pv-stor1lun06a
my-csi-app-local-pv-stor1lun06a 1/1 Running 0 92s可以看到容器中已經掛載了路徑/test6a,此路徑對應HBlock中的卷lun06a。
[root@server ~]# kubectl exec -it my-csi-app-local-pv-stor1lun06a -- /bin/sh
/ # ls
bin dev etc home lib lib64 proc root sys test6a tmp usr var