通过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: name: csi-storageclass-local-stateful-stor1lun10 #StorageClass名称 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: name: csi-storageclass-local-stateful-block-stor1lun11 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: true
StorageClass的YAML配置文件参数描述
参数 描述 是否必填 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。
否 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。
否 serverNumbers Target所在的服务器数量(仅集群版支持)。
整数形式,取值为[2, n],n为集群内服务器的数量。默认值为2。
否 clusterID HBlock的标识,在csi-configMap.yaml中唯一。详见配置HBlock访问地址。 是 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,只能由字母、数字或下划线( _ )组成,字母区分大小写。
否 reclaimPolicy 持久化卷回收策略。
取值:
Retain:保留。
Delete:删除。
默认值为Delete。
否 volumeBindingMode 立即绑定还是等待Pod调度时绑定。
取值:
Immediate:立即绑定。
WaitForFirstConsumer:延迟绑定。
默认值为Immediate。
否 allowVolumeExpansion 允许卷扩展。
取值:
true:允许卷扩展。
false:不允许卷扩展。
默认值为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 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 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 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 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为例。
[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