动态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: name: csi-stor-sc-local-stor1lun08 #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: "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配置文件参数描述
参数 描述 是否必填 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:否。
否 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。
否 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-storageclass-local-lun09.yaml为例。
[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的名字 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的名字 spec: accessModes: #访问模式,Block模式的卷支持ReadWriteOnce、ReadOnlyMany、ReadWriteMany - ReadWriteOnce volumeMode: Block resources: requests: storage: 88Gi #卷容量,单位为GiB storageClassName: csi-stor-sc-local-stor1lun09 # 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
[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 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的名称 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中挂载的卷
以csi-app-local-pvc-storlun08.yaml为例。
[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是一一对应的关系。