通过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 | 是否以只读模式进行卷挂载。 取值:
默认值为"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。 | 否 |
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。节点的级别可以不同,但节点名必须唯一。节点名称可以使用在集群拓扑中的全路径,格式为:name:name:name,从根节点开始逐级指定;也可以使用部分路径,但该路径需在集群拓扑中唯一。例如default:room4:hblock_4、room4:hblock_4、hblock_4在集群拓扑中均指向同一节点,且节点名在集群拓扑中唯一,则任选其一即可。 | 否 |
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 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