通過StatefulSet中指定的StorageClass動態創建PVC,Kubernetes根據StorageClass中配置的信息,自動觸發HBlock CSI插件創建HBlock卷。動態PVC適用于需動態創建多個Pod,并為其掛載存儲的場景。
使用動態PVC的主要流程如下:
創建StorageClass
新建StorageClass的YAML配置文件
卷模式為filesystem,創建StorageClass csi-storageclass-local-stateful-stor1lun10的配置文件csi-storageclass-local-stateful-stor1lun10.yaml。可以參考examples\filesystem-volumes\statefulset\csi-storageclass-local-stateful.yaml中的示例。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: # If there is a conflict with other StorageClass, you can change it to another name name: csi-storageclass-local-stateful-stor1lun10 #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和localStorageClass "EC N+M"中的N默認相等 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 #持久化卷回收策略,支持Retain和Delete volumeBindingMode: Immediate allowVolumeExpansion: true #允許卷擴展卷模式為Block,創建StorageClass csi-storageclass-local-stateful-block-stor1lun11的配置文件csi-storageclass-local-stateful-block-stor1lun11.yaml。可以參考examples\block-volumes\statefulset\csi-storageclass-local-stateful-block.yaml。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: # If there is a conflict with other StorageClass, you can change it to another name name: csi-storageclass-local-stateful-block-stor1lun11 # Set to the actual driver name provisioner: stor.csi.k8s.io parameters: storageMode: Local readOnly: "false" sectorSize: "4096" localStorageClass: "EC 2+1" # minReplica和localStorageClass "EC N+M"中的N默認相等 minReplica: "2" highAvailability: "ActiveStandby" writePolicy: "WriteBack" isMultipath: "true" maxSessions: "1" ECfragmentSize: "16" serverNumbers: "2" clusterID: "stor1" reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: trueStorageClass的YAML配置文件參數描述
| 參數 | 描述 | 是否必填 |
|---|---|---|
| metadata.name | StorageClass名稱。 | 是 |
| provisioner | HBlock CSI驅動名稱。 取值:HBlock CSI安裝時的驅動名稱。 | 是 |
| storageMode | 卷的存儲類型,支持Local、Cache、Storage模式。 Cache、Storage模式表示上云卷。 | 是 |
| fsType | 卷被掛載到容器的文件系統類型,支持xfs,ext4。 說明 卷模式為filesystem時必填。 | 條件 |
| readOnly | 是否以只讀模式進行卷掛載。 取值:
默認值為"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。 | 否 |
| cloudCompression | 是否壓縮數據上傳至OOS。 取值:
默認值為Enabled。 | 否 |
| cloudSignVersion | OOS的請求簽名認證方式 取值:
默認值為v2。 | 否 |
| cloudRegion | 表示Endpoint資源池所在區域。 使用V4簽名時,此項必填。 類型:字符串。 | 條件 |
| deleteCloudData | 刪除卷時,是否刪除云上的數據。 取值:
默認值為false。 | 否 |
| sectorSize | 扇區大小。根據客戶端文件系統 I/O 操作的最小單位設定卷扇區大小。 類型:枚舉。 取值:"512"、"4096",單位為字節。默認值為"4096" | 否 |
| localStorageClass | 本地存儲冗余模式。單機版不能設置此參數。 取值:
默認值為EC 2+1。 | 否 |
| minReplica | 最小副本數(僅集群版支持)。
取值:整數。對于副本卷,取值范圍是[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。 | 否 |
| writePolicy | 卷的寫策略。 取值:
默認值為WriteBack。 | 否 |
| isMultipath | 是否使用Multipath。 取值:
默認值為"true"。 注意
| 條件 |
| 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所包含的此存儲池的服務器列表里進行選擇。 注意
取值:以節點的形式添加,節點的級別可以到room、rack、server。可以指定多個節點,但是節點的個數要小于等于serverNumbers。支持一個節點添加多次,但是每次只能選一個server,并且選擇的server不能與前面重復。如果一個節點出現的次數過多導致節點內的全部server都被選擇,則系統會忽略此節點,從后面的節點中繼續選擇。 | 否 |
| clusterID | HBlock的標識,在csi-configMap.yaml中唯一。詳見配置HBlock訪問地址。 | 是 |
| chapEnable | 是否使用CHAP認證,取值:
默認值為"false"。 注意 這里需要輸入字符串,即"true"或"false"。 | 否 |
| chapUser | CHAP認證的用戶名。需要對CHAP認證的用戶名源碼使用DecryptData配置的密鑰對進行AES(ECP、paddingcs7)加密,加密后的結果進行Base64編碼,具體詳見配置加密模式。 源碼:字符串形式,長度范圍是3~64,只能由字母、數字、句點( . )、短橫線( - )、下劃線( _ )、冒號( : )組成,字母區分大小寫,且僅支持以字母或數字開頭。 | 否 |
| chapPassword | CHAP認證的密碼。需要對CHAP認證的密碼源碼使用DecryptData配置的密鑰對進行AES(ECP、paddingcs7)加密,加密后的結果進行Base64編碼,具體詳見配置加密模式。 源碼:字符串形式,長度范圍是12~16,只能由字母、數字或下劃線( _ )組成,字母區分大小寫。 | 否 |
| reclaimPolicy | 持久化卷回收策略。 取值:
默認值為Delete。 | 否 |
| volumeBindingMode | 立即綁定還是等待Pod調度時綁定。 取值:
默認值為Immediate。 | 否 |
| allowVolumeExpansion | 允許卷擴展。 取值:
默認值為false。 | 否 |
應用配置文件
以csi-storageclass-local-stateful-stor1lun10.yaml為例。
[root@server statefulset]# kubectl apply -f csi-storageclass-local-stateful-stor1lun10.yaml
storageclass.storage.k8s.io/csi-storageclass-local-stateful-stor1lun10 created創建StatefulSet
新建StatefulSet的YAML配置文件
卷模式為filesystem,創建StatefulSet csi-app-stateful-local-stor1lun10的YAML配置文件csi-app-stateful-local-stor1lun10.yaml。可以參考examples\filesystem-volumes\statefulset\csi-app-stateful-local.yaml中的示例。
apiVersion: v1 kind: Service metadata: name: csi-app-stateful-local-stor1lun10 # Set to the actual namespace namespace: default # HBlock CSI安裝時綁定的命名空間名稱。 labels: app: csi-app-stateful-local-stor1lun10 spec: ports: - port: 80 name: web clusterIP: None selector: app: csi-app-stateful-local-stor1lun10 --- apiVersion: apps/v1 kind: StatefulSet metadata: name: csi-app-stateful-local-stor1lun10 # Set to the actual namespace namespace: default # HBlock CSI安裝時綁定的命名空間名稱。 spec: selector: matchLabels: app: csi-app-stateful-local-stor1lun10 serviceName: "csi-app-stateful-local-stor1lun10" replicas: 2 template: metadata: labels: app: csi-app-stateful-local-stor1lun10 spec: terminationGracePeriodSeconds: 10 containers: - name: csi-app-stateful-local-stor1lun10 image: busybox ports: - containerPort: 80 name: web volumeMounts: - name: lun10 mountPath: /test10 command: [ "sleep", "1000000" ] volumeClaimTemplates: - metadata: name: lun10 spec: accessModes: [ "ReadWriteOnce" ] # 訪問模式,filesystem模式的卷支持ReadWriteOnce storageClassName: "csi-storageclass-local-stateful-stor1lun10" resources: requests: storage: 100Gi卷模式為Block,創建StatefulSet csi-app-stateful-local-block-lun11的YAML配置文件csi-app-stateful-local-block-lun11.yaml。參考examples\block-volumes\statefulset\csi-app-stateful-local-block.yaml中的示例。
apiVersion: v1 kind: Service metadata: name: csi-app-stateful-local-block-lun11 # Set to the actual namespace namespace: default # HBlock CSI安裝時綁定的命名空間名稱。 labels: app: csi-app-stateful-local-block-lun11 spec: ports: - port: 80 name: web clusterIP: None selector: app: csi-app-stateful-local-block-lun11 --- apiVersion: apps/v1 kind: StatefulSet metadata: name: csi-app-stateful-local-block-lun11 # Set to the actual namespace namespace: default # HBlock CSI安裝時綁定的命名空間名稱。 spec: selector: matchLabels: app: csi-app-stateful-local-block-lun11 serviceName: "csi-app-stateful-local-block-lun11" replicas: 2 template: metadata: labels: app: csi-app-stateful-local-block-lun11 spec: terminationGracePeriodSeconds: 10 containers: - name: csi-app-stateful-local-block-lun11 image: busybox ports: - containerPort: 80 name: web volumeDevices: - name: lun11 devicePath: /dev/test11 command: [ "sleep", "1000000" ] volumeClaimTemplates: - metadata: name: lun11 spec: accessModes: [ "ReadWriteOnce" ] #訪問模式,Block模式的卷支持的訪問模式:ReadWriteOnce、ReadOnlyMany、ReadWriteMany volumeMode: Block #卷模式為Block storageClassName: "csi-storageclass-local-stateful-block-stor1lun11" resources: requests: storage: 101Gi
應用配置文件
以csi-app-stateful-local-stor1lun10.yaml為例。
[root@server statefulset]# kubectl apply -f csi-app-stateful-local-stor1lun10.yaml
service/csi-app-stateful-local-stor1lun10 created
statefulset.apps/csi-app-stateful-local-stor1lun10 created驗證已經創建的StatefulSet
以csi-app-stateful-local-stor1lun10為例。
說明
如果命名空間非default,需要使用命令kubectl get statefulset -n namespace|grep statefluname查詢。
[root@server statefulset]# kubectl get statefulset |grep csi-app-stateful-local-stor1lun10
csi-app-stateful-local-stor1lun10 2/2 28m可以看到容器中已經掛載了路徑/test10。
[root@server ~]# kubectl exec -it csi-app-stateful-local-stor1lun10-0 -- /bin/sh
/ # ls
bin dev etc home lib lib64 proc root sys test10 tmp usr var