動態PV是通過PVC創建的PV,用戶不需要提前創建PV,只要通過StorageClass把存儲資源定義好,Kubernetes就會根據PVC動態創建PV,自動觸發HBlock CSI插件動態創建HBlock的卷。動態PV適用于存儲卷較多,但存儲卷的類型都相同的場景。
使用動態PV的主要流程如下:
創建StorageClass
新建StorageClass的YAML配置文件
卷模式為filesystem,創建StorageClass csi-stor-sc-local-stor1lun08的YAML配置文件csi-storageclass-local-stor1lun08.yaml。可以參考examples\filesystem-volumes\dynamic-pv\local\csi-storageclass-local.yaml中的示例。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: # Set to the actual driver name name: csi-stor-sc-local-stor1lun08 #StorageClass名稱 # Set to the actual driver name provisioner: stor.csi.k8s.io # HBlock CSI安裝時的驅動名稱。 parameters: storageMode: Local # HBlock 卷的存儲類型 fsType: xfs # 卷被掛載到容器的文件系統類型,支持xfs,ext4 readOnly: "false" # 是否以只讀方式掛載卷 sectorSize: "4096" # HBlock 中卷的扇區大小,支持512,4096,單位字節 localStorageClass: "EC 2+1" # HBlock卷冗余模式 minReplica: "2" # 最小副本數(僅HBlock集群版支持)。 highAvailability: "ActiveStandby" # HBlock卷高可用模式。 writePolicy: "WriteBack" # HBlock卷寫策略 isMultipath: "true" # 是否啟動多控 maxSessions: "1" # iSCSI Target允許建立的最大會話數。 ECfragmentSize: "16" #糾刪碼模式分片大小。卷冗余模式為EC模式時,此設置才生效,否則忽略。 serverNumbers: "2" # HBlock Target所在的服務器數量(僅集群版支持)。 clusterID: "stor1" #HBlock標識 reclaimPolicy: Delete # PV的回收策略,支持Retain和Delete volumeBindingMode: Immediate allowVolumeExpansion: true # 是否允許擴展卷卷模式為Block,創建StorageClass csi-stor-sc-local-stor1lun09的YAML配置文件csi-storageclass-local-stor1lun09.yaml。可以參考examples\block-volumes\dynamic-pv\csi-storageclass-local.yaml中的示例。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-stor-sc-local-stor1lun09 #StorageClass名稱 provisioner: stor.csi.k8s.io # HBlock CSI安裝時的驅動名稱。 parameters: storageMode: Local #HBlock 卷的存儲類型 readOnly: "false" #是否以只讀方式掛載卷 sectorSize: "4096" #HBlock 中卷的扇區大小,支持512,4096,單位字節 localStorageClass: "EC 2+1" #HBlock卷冗余模式 minReplica: "2" # 最小副本數(僅HBlock集群版支持)。 highAvailability: "ActiveStandby" #HBlock卷高可用模式。 writePolicy: "WriteBack" #HBlock卷寫策略 isMultipath: "true" #是否啟動多控 maxSessions: "1" # iSCSI Target允許建立的最大會話數。 ECfragmentSize: "16" #糾刪碼模式分片大小。卷冗余模式為EC模式時,此設置才生效,否則忽略。 serverNumbers: "2" # HBlock Target所在的服務器數量(僅集群版支持)。 clusterID: "stor1" #HBlock標識 reclaimPolicy: Delete #PV的回收策略,支持Retain和Delete volumeBindingMode: Immediate allowVolumeExpansion: true #是否允許擴展卷StorageClass的YAML配置文件參數描述
參數 描述 是否必填 metadata.name StorageClass的名稱。 是 provisioner HBlock CSI驅動名稱。
取值:HBlock CSI安裝時的驅動名稱。
是 storageMode 卷的存儲類型,支持Local、Cache、Storage模式。
Cache、Storage模式表示上云卷。
是 fsType 卷被掛載到容器的文件系統類型,支持xfs,ext4。
說明
卷模式為filesystem時必填。
條件 readOnly 是否以只讀模式進行卷掛載。
取值:
- "true"。
- "false"。
默認值為"false"。
注意
這里需要輸入字符串,即"true"或"false"。
是 cloudBucketName 已存在的OOS存儲桶的名稱。
注意
請勿開啟Bucket的生命周期設定和合規保留。
類型:字符串。
上云卷必填 cloudPrefix 設置OOS中的前綴名稱,設置前綴名稱后,卷數據會存在存儲桶以前綴命名的類文件夾中。如果未指定前綴,則直接存儲在以卷名稱命名的類文件夾中。
類型:字符串。
取值:長度范圍是1~256。
否 cloudAccessKey OOS AccessKeyID。
類型:字符串。
上云卷必填 cloudSecretKey OOS SecretAccessKey。
如果配置文件csi-secret-decrypt.yaml中的decryptFlag為true,需要對secretKey源碼使用DecryptData配置的密鑰對進行AES(ECP、paddingcs7)加密,加密后的結果進行Base64編碼,具體詳見配置加密模式。
類型:字符串。
上云卷必填 cloudEndpoint 設置OOS Endpoint。
類型:字符串。
上云卷必填 cloudObjectSize 數據存儲在OOS中的大小。
取值:128、256、512、1024、2048、4096、8192,單位是KiB。默認值為1024。
否 cloudStorageClass 設置OOS的存儲類型。
取值:
- STANDARD:標準存儲。
- STANDARD_IA:低頻訪問存儲。
默認值為STANDARD。
否 cloudCompression 是否壓縮數據上傳至OOS。
取值:
- Enabled:是。
- Disabled:否。
默認值為Enabled。
否 cloudSignVersion OOS的請求簽名認證方式
取值:
- v2:v2簽名。
- v4:v4簽名。
默認值為v2。
否 cloudRegion 表示Endpoint資源池所在區域。
V4簽名時,此項必填。
類型:字符串。
條件 deleteCloudData 刪除卷時,是否刪除云上的數據。
取值:
- true:刪除云上的數據。
- false:不刪除云上的數據。
默認值為false。
否 sectorSize 扇區大小。根據客戶端文件系統 I/O 操作的最小單位設定卷扇區大小。
類型:枚舉。
取值:"512"、"4096",單位為字節。默認值為"4096"。
否 localStorageClass 本地存儲冗余模式。單機版不能設置此參數。
取值:
- single-copy:單副本。
- 2-copy:兩副本。
- 3-copy:三副本。
- EC N+M:糾刪碼模式。其中N、M為正整數,N>M,且N+M<=128。表示將數據分割成N個片段,并生成M個校驗數據。
默認值為EC 2+1。
否 minReplica 最小副本數(僅集群版支持)。
- 對于副本模式的卷,假設卷副本數為X,最小副本數為Y(Y必須≤X),該卷每次寫入時,至少Y份數據寫入成功,才視為本次寫入成功。
- 對于EC N+M模式的卷,假設該卷最小副本數設置為Y(必須滿足N≤Y≤N+M),必須滿足總和至少為Y的數據塊和校驗塊寫入成功,才視為本次寫入成功。
取值:整數。對于副本卷,取值范圍是[1, N],N為副本模式卷的副本數,默認值為1。對于EC卷,取值范圍是[N, N+M],默認值為N。
否 redundancyOverlap 卷的折疊副本數(僅集群版支持)。在數據冗余模式下,同一份數據的不同副本/分片默認分布在不同的故障域,當故障域損壞時,允許根據卷的冗余折疊原則,將多份數據副本放在同一個故障域中,但是分布在不同的path上。
注意
如果存儲池故障域級別為path,此參數不生效。
取值:對副本模式,取值范圍是[1,副本數],默認值為1;對于EC模式,取值范圍是[1,M+N],默認值為1。
否 ECfragmentSize 糾刪碼模式分片大小。卷冗余模式為EC模式時,此設置才生效,否則忽略。
取值:1、2、4、8、16、32、64、128、256、512、1024、2048、4096,單位是KiB。默認值為16。
否 highAvailability 是否選擇高可用模式。單機版不能設置此參數。
取值:
- ActiveStandby:啟動主備,該卷關聯對應Target下的所有IQN。
- Disabled:禁用高可用模式,該卷關聯對應Target下的一個IQN。
默認值為ActiveStandby。
否 writePolicy 卷的寫策略。
取值:
- WriteBack:回寫,即數據寫入到內存后,立刻返回給客戶端寫成功,之后再異步寫入磁盤。適用于對性能要求較高,穩定性要求不高的場景。
- WriteThrough:透寫,即數據同時寫入內存和磁盤,并在兩處都寫成功后,再返回客戶端寫成功。適用于穩定性要求較高,寫性能要求不高,且最近寫入的數據會較快被讀取的場景。
- WriteAround:繞寫,即數據寫入磁盤后即釋放相應內存,寫入磁盤成功后,立刻返回客戶端寫成功。適用于穩定性要求較高,性能要求不高,且寫多讀少的場景。
默認值為WriteBack。
否 isMultipath 是否使用multipath。
取值:
- "true"。
- "false"。
默認值為"true"。
注意
這里需要輸入字符串,即"true"或"false"。
如果HBlock集群版使用的HBlock卷沒有啟用高可用模式,即highAvailability為Disabled,此處需要設置為"false",否則會導致pod啟動失敗。
如果是HBlock單機版,此處需要設置為"false"。
條件 path 指定存儲卷數據的數據目錄(僅單機版支持)。
如果創建卷時不指定數據目錄,使用服務器設置的默認數據目錄。
否 pool 存儲池名稱,表示最終存儲池,卷數據最終落在該存儲池內(僅集群版支持)。
取值:長度范圍是1~16,只能由字母、數字和短橫線(-)、下劃線(_)組成,字母區分大小寫,且僅支持以字母和數字開頭。
默認使用基礎存儲池。
否 cachePool 存儲池名稱,表示高速緩存存儲池,卷數據首先寫入該存儲池內(僅集群版支持)。
取值:長度范圍是1~16,只能由字母、數字和短橫線(-)、下劃線(_)組成,字母區分大小寫,且僅支持以字母和數字開頭。
如果不填寫則代表不設置高速緩存存儲池。
注意
存儲池與緩存存儲池不能是同一個存儲池。
否 maxSessions iSCSI Target允許建立的最大會話數。
取值:整數,取值范圍是[1, 1024],默認值為1。
注意
卷模式為filesystem,取值只能為1。
否 serverNumbers Target所在的服務器數量(僅集群版支持)。
整數形式,取值為[2, n],n為集群內服務器的數量。默認值為2。
否 faultDomains 卷的服務端連接位置信息。根據存儲池的故障域,創建Target所在服務器的列表(僅集群版支持),以便創建LUN時,LUN關聯的Target優先從該服務器列表中選擇所在服務器。例如存儲池為rack級別,其拓撲圖涵蓋rack1、rack2、rack3、rack4中的節點,且faultDomains指定rack1、rack2,那么創建LUN時,LUN關聯的Target優先從rack1、rack2所包含的此存儲池的服務器列表里進行選擇。
注意
存儲池的故障域為path級別時,不能設置該參數。
如果LUN指定了高速緩存池和最終存儲池,則從高速緩存池池中選擇節點列表。如果LUN只指定了最終存儲池,則從最終存儲池中選擇節點列表。
取值:以節點的形式添加,節點的級別可以到room、rack、server。可以指定多個節點,但是節點的個數要小于等于serverNumbers。支持一個節點添加多次,但是每次只能選一個server,并且選擇的server不能與前面重復。如果一個節點出現的次數過多導致節點內的全部server都被選擇,則系統會忽略此節點,從后面的節點中繼續選擇。
否 chapEnable 是否使用CHAP認證,取值:
- "true"。
- "false"。
默認值為"false"。
注意
這里需要輸入字符串,即"true"或"false"。
否 chapUser CHAP認證的用戶名。需要對CHAP認證的用戶名源碼使用DecryptData配置的密鑰對進行AES(ECP、paddingcs7)加密,加密后的結果進行Base64編碼,具體詳見配置加密模式。
源碼:字符串形式,長度范圍是3~64,只能由字母、數字、句點( . )、短橫線( - )、下劃線( _ )、冒號( : )組成,字母區分大小寫,且僅支持以字母或數字開頭。
否 chapPassword CHAP認證的密碼。需要對CHAP認證的密碼源碼使用DecryptData配置的密鑰對進行AES(ECP、paddingcs7)加密,加密后的結果進行Base64編碼,具體詳見配置加密模式。
源碼:字符串形式,長度范圍是12~16,只能由字母、數字或下劃線( _ )組成,字母區分大小寫。
否 clusterID HBlock的標識,在csi-configMap.yaml中唯一。詳見配置HBlock訪問地址。 是 reclaimPolicy 持久化卷回收策略。
取值:
- Retain:保留。
- Delete:刪除。
默認值為Delete。
否 volumeBindingMode 立即綁定還是等待Pod調度時綁定。
取值:
- Immediate:立即綁定。
- WaitForFirstConsumer:延遲綁定。
默認值為Immediate。
否 allowVolumeExpansion 允許卷擴展。
取值:
- true:允許卷擴展。
- false:不允許卷擴展。
默認值為false。
否
應用配置文件
以csi-storageclass-local-stor1lun08.yaml為例。
[root@server dynamic-pv]# kubectl apply -f csi-storageclass-local-stor1lun08.yaml
storageclass.storage.k8s.io/csi-stor-sc-local-stor1lun08 created 驗證創建的StorageClass
以csi-stor-sc-local-stor1lun08為例。
[root@server dynamic-pv]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
csi-stor-sc-local-stor1lun08 stor.csi.k8s.io Delete Immediate true 24s注意
如需加密配置CHAP用戶名和密碼,則deploy/csi-plugin-conf/csi-secret-decrypt.yaml 文件中decryptFlag字段需配置為true,且CHAP用戶名和密碼字段必須配置為AES密文的base64格式。具體可以參見配置加密模式。
創建PVC
創建PVC,并和StorageClass關聯。
新建PVC的YAML配置文件
卷模式為filesystem,創建PVC csi-pvc-local-stor1lun08的配置文件csi-pvc-local-stor1lun08.yaml。參考examples\filesystem-volumes\dynamic-pv\local\csi-pvc-local.yaml中的示例。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: csi-pvc-local-stor1lun08 # PVC的名字 # Set to the actual namespace namespace: default spec: accessModes: #訪問模式,filesystem模式的卷支持ReadWriteOnce - ReadWriteOnce resources: requests: storage: 77Gi #卷容量,單位為GiB storageClassName: csi-stor-sc-local-stor1lun08 #PVC使用的StorageClass的名字卷模式為Block,創建PVC csi-pvc-local-block-stor1lun09的配置文件csi-pvc-local-stor1lun09.yaml。參考examples\block-volumes\dynamic-pv\csi-pvc-local-block.yaml中的示例。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: csi-pvc-local-block-stor1lun09 # PVC的名字 # Set to the actual namespace namespace: default spec: accessModes: # 訪問模式,Block模式的卷支持ReadWriteOnce、ReadOnlyMany、ReadWriteMany - ReadWriteOnce volumeMode: Block resources: requests: storage: 88Gi #卷容量,單位為GiB storageClassName: csi-stor-sc-local-stor1lun09 #PVC使用的StorageClass的名字
PVC的YAML配置文件參數描述
| 參數 | 描述 | 是否必填 |
|---|---|---|
| metadata.name | PVC的名稱。 | 是 |
| metadata.namespace | 命名空間。 取值:HBlock CSI安裝時綁定的命名空間名稱。 | 是 |
| storage | 卷的容量,單位GiB。 | 是 |
| storageClassName | 指定PVC所使用的 StorageClass 名稱。 | 是 |
應用配置文件
以csi-pvc-local-stor1lun08.yaml為例。
[root@server dynamic-pv]# kubectl apply -f csi-pvc-local-stor1lun08.yaml
persistentvolumeclaim/csi-pvc-local-stor1lun08 created驗證已經創建的PVC
說明
如果命名空間非default,需要使用命令kubectl get pvc -n namespace查詢。
[root@server dynamic-pv]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
csi-pvc-local-stor1lun08 Bound pvc-84b9a4b9-403d-41a5-96bc-8d1e08c7ab15 77Gi RWO csi-stor-sc-local-stor1lun08 27s創建Pod
創建Pod,并和PVC關聯。HBlock CSI插件將自動創建、格式化、掛載HBlock的卷。
新建Pod的YAML配置文件
卷模式為filesystem,創建Pod my-csi-app-local-stor1lun08的配置文件csi-app-local-pvc-stor1lun08.yaml。可以參考examples\filesystem-volumes\dynamic-pv\local\csi-app-local-pvc.yaml中的示例。
kind: Pod apiVersion: v1 metadata: name: my-csi-app-local-stor1lun08 # Set to the actual namespace namespace: default #HBlock CSI安裝時綁定的命名空間 spec: containers: - name: my-frontend image: busybox # 鏡像地址 imagePullPolicy: "IfNotPresent" # 拉取鏡像策略 volumeMounts: - mountPath: "/test8" # 掛載到容器的目標路徑 name: lun08 command: [ "sleep", "1000000" ] volumes: - name: lun08 # 對應volumeMounts的掛載項目 persistentVolumeClaim: claimName: csi-pvc-local-stor1lun08 # 調用pvc的名字卷模式為Block,創建Pod my-csi-app-local-block-stor1lun09的配置文件csi-app-local-pvc-stor1lun09.yaml。可以參考examples\block-volumes\dynamic-pv\csi-app-local-pvc-block.yaml中的示例。
kind: Pod apiVersion: v1 metadata: name: my-csi-app-local-block-stor1lun09 #Pod的名稱 # Set to the actual namespace namespace: default #HBlock CSI安裝時綁定的命名空間 spec: containers: - name: my-frontend image: busybox # 鏡像地址 imagePullPolicy: "IfNotPresent" # 拉取鏡像策略 volumeDevices: - devicePath: "/dev/test9" # 掛載到容器的目標路徑 name: lun09 # 對應volumes中的name command: [ "sleep", "1000000" ] volumes: - name: lun09 # 對應volumeMounts的掛載項目 persistentVolumeClaim: claimName: csi-pvc-local-block-stor1lun09 # 調用pvc的名字
應用配置文件
以 csi-app-local-pvc-stor1lun08.yaml 為例。
[root@server dynamic-pv]# kubectl apply -f csi-app-local-pvc-stor1lun08.yaml
pod/my-csi-app-local-stor1lun08 created驗證Pod中掛載的卷
以my-csi-app-local-stor1lun08 為例。
說明
如果命名空間非default,需要使用命令kubectl get pod -n namespace|grep Podname查詢。
[root@server test]# kubectl get pod|grep my-csi-app-local-stor1lun08
my-csi-app-local-stor1lun08 1/1 Running 0 27s可以看到容器中已經掛載了路徑/test8。
[root@server ~]# kubectl exec -it my-csi-app-local-stor1lun08 -- /bin/sh
/ # ls
bin dev etc home lib lib64 proc root sys test8 tmp usr var注意
HBlock CSI插件根據用戶的配置,在HBlock集群中自動創建卷和Target,卷、Target、PV是一一對應的關系。