静态PV是指直接使用YAML文件创建的PV,适用于存储卷较少,并且不会频繁修改配置信息的场景。使用静态PV时,需要在HBlock中先创建好卷,然后创建PV、PVC和Pod,HBlock CSI插件可自动格式化,挂载HBlock的卷。
使用静态PV的主要流程如下:
创建卷
创建HBlock卷的步骤请参考HBlock用户手册。
创建PV
新建PV的YAML配置文件
-
卷模式为filesystem的示例,创建PV csi-pv-local-stor1lun06a。参考examples\filesystem-volumes\static-pv\csi-pv-local.yaml中的示例。
apiVersion: v1 kind: PersistentVolume metadata: #元数据 name: csi-pv-local-stor1lun06a # PV的名称 labels: #标签 app: stor-pv-nocreate-stor1lun06a # PV的标识 spec: capacity: storage: 66Gi #卷容量,单位为GiB,此处配置的卷容量应等于HBlock中创建的卷容量 volumeMode: Filesystem #卷模式,支持Filesystem和Block模式,默认为Filesystem模式 accessModes: #访问模式,Filesystem模式的卷支持ReadWriteOnce,ReadOnlyMany(卷需要提前格式化) - ReadWriteOnce persistentVolumeReclaimPolicy: Retain #持久化卷回收策略,支持Retain和Delete csi: driver: stor.csi.k8s.io volumeHandle: "stor1:lun06a" #指定HBlock卷 volumeAttributes: fsType: xfs #卷被挂载到容器的文件系统类型,支持xfs,ext4 readOnly: "false" isMultipath: "true" #是否使用Multipath chapEnable: "false" #是否使用CHAP认证 chapUser: "username" chapPassword: "password"
-
卷模式为Block,创建PV csi-pv-local-block-stor2lunb1。参考examples\block-volumes\static-pv\csi-pv-local-block.yaml中的示例。
apiVersion: v1 kind: PersistentVolume metadata: #元数据 name: csi-pv-local-block-stor2lunb1 # PV的名称 labels: #标签 app: csi-pv-local-block-stor2lunb1 spec: capacity: storage: 22Gi #卷容量,单位为GiB,此处配置的卷容量应等于HBlock中创建的卷容量 volumeMode: Block #卷模式,支持Filesystem和Block模式,默认为Filesystem模式 accessModes: #访问模式,Block模式的卷支持ReadWriteOnce、ReadOnlyMany、ReadWriteMany - ReadWriteOnce persistentVolumeReclaimPolicy: Retain #持久化卷回收策略,支持Retain和Delete csi: driver: stor.csi.k8s.io # HBlock CSI插件 volumeHandle: "stor2:lunb1" #指定HBlock卷 volumeAttributes: readOnly: "false" #是否以只读方式挂载卷 isMultipath: "false" #是否使用Multipath,HBlock单机版时,取值false chapEnable: "false" #是否使用CHAP认证
PV的YAML配置文件参数描述
参数 描述 是否必填 driver HBlock CSI插件。
取值:stor.csi.k8s.io。
是 accessModes 访问模式。
取值:
ReadWriteOnce:卷可以被一个节点以读写的方式挂载。
ReadOnlyMany:卷可以被多个节点以只读方式挂载。filesystem模式下,卷需要提前格式化。
ReadWriteMany:卷可以被多个节点以读写方式挂载。仅Block模式的卷支持。
是 volumeHandle 指定具体的HBlock卷名称,格式为clusterID:lunName。
clusterID:指定HBlock的标识,在csi-configMap.yaml中唯一。详见配置HBlock访问地址。
lunName:HBlock中创建的卷名称。
是 volumeAttributes.fsType 卷被挂载到容器的文件系统类型,支持xfs,ext4。
说明卷模式为filesystem时必填。
条件 volumeAttributes.readOnly 是否以只读方式挂载卷。
取值:
"true"。
"false"。
默认值为"false"。
注意这里需要输入字符串,即"true"或"false"。
否 volumeAttributes.isMultipath 是否使用Multipath。
取值:
"true"。
"false"。
默认值为"true"。
注意这里需要输入字符串,即"true"或"false"。
如果HBlock集群版使用的HBlock卷没有启用高可用模式,即highAvailability为Disabled,此处需要设置为"false",否则会导致pod启动失败。
如果是HBlock单机版,此处需要设置为"false"。
条件 volumeAttributes.chapEnable 是否使用CHAP认证。
取值:
"true"。
"false"。
默认值为"false"。
注意这里需要输入字符串,即"true"或"false"。
否 volumeAttributes.chapUser CHAP认证的用户名。需要对CHAP认证的用户名源码使用DecryptData配置的密钥对进行AES(ECP、paddingcs7)加密,加密后的结果进行Base64编码,具体详见配置加密模式。
源码:字符串形式,长度范围是3~64,只能由字母、数字、句点( . )、短横线( - )、下划线( _ )、冒号( : )组成,字母区分大小写,且仅支持以字母或数字开头。
否 volumeAttributes.chapPassword CHAP认证的密码。需要对CHAP认证的密码源码使用DecryptData配置的密钥对进行AES(ECP、paddingcs7)加密,加密后的结果进行Base64编码,具体详见配置加密模式。
源码:字符串形式,长度范围是12~16,只能由字母、数字或下划线( _ )组成,字母区分大小写。
否
注意
如要使用加密方式配置CHAP密码,请参考配置加密模式。
PV的回收策略告诉集群,在PV被释放之后集群应该如何处理该PV。当前,PV可以被Retain(保留)、 Recycle(再利用)或者Delete(删除)。HBlock CSI插件目前仅支持Retain和Delete,不支持Recycle。
回收策略 Retain 使得用户可以手动回收资源。当 PersistentVolumeClaim 对象被删除时,PersistentVolume 卷仍然存在,对应的数据卷被视为“已释放(released)”。由于卷上仍然存在着前一申领人的数据,该卷还不能用于其他申领。管理员需要手动回收该卷。
对于回收策略为Delete的卷配置,删除动作会将PersistentVolume 对象从Kubernetes中移除,同时也会从外部基础设施中移除所关联的存储资产。动态供应的卷会继承其StorageClass中设置的回收策略,该策略默认为Delete。管理员需要根据用户的期望来配置StorageClass。注意,如果PV中使用的是HBlock已经提前创建的卷,则不能通过Kubernetes来删除该卷。
应用配置文件
以csi-pv-local-stor1lun06a.yaml为例。
[root@server test]# kubectl apply -f csi-pv-local-stor1lun06a.yaml
persistentvolume/csi-pv-local-stor1lun06a created
验证创建的PV
以csi-pv-local.yaml为例。
[root@server test]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
csi-pv-local-stor1lun06a 66Gi RWO Retain Available 20s
创建PVC
新建PVC的YAML配置文件
-
卷模式为filesystem,新建PVC csi-pvc-local-nocreate-stor1lun06a的YAML配置文件。参考examples\filesystem-volumes\static-pv\csi-pvc-local-nocreate.yaml中的示例。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: csi-pvc-local-nocreate-stor1lun06a # PVC的名字 spec: accessModes: #访问模式 - ReadWriteOnce resources: requests: storage: 66Gi #卷的容量,单位GiB,Kubernetes会尝试绑定大于等于该容量的PV selector: matchLabels: app: stor-pv-nocreate-stor1lun06a
-
卷模式为Block,新建PVC csi-pvc-local-nocreate-block-stor2lunb1的配置文件。参考examples\block-volumes\static-pv\csi-pvc-local-nocreate-block.yaml中的示例。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: csi-pvc-local-nocreate-block-stor2lunb1 spec: accessModes: - ReadWriteOnce volumeMode: Block resources: requests: storage: 22Gi selector: matchLabels: app: csi-pv-local-block-stor2lunb1
应用配置文件
以PVC csi-pvc-local-nocreate-stor1lun06a.yaml为例。
[root@server test]# kubectl apply -f csi-pvc-local-nocreate-stor1lun06a.yaml
persistentvolumeclaim/csi-pvc-local-nocreate-stor1lun06a created
验证已经创建的PVC
以csi-pvc-local-nocreate-stor1lun06a为例。
[root@server test]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
csi-pvc-local-nocreate-stor1lun06a Bound csi-pv-local-stor1lun06a 66Gi RWO 10m
注意
PVC通过容量自动匹配PV,当PV的容量大于等于PVC的容量时,Kubernetes会将PVC和PV进行绑定。如果有多个PV都满足条件,会选择第一个PV进行匹配。
PV和PVC配置文件中如有selector字段,那么app必须配置一致,否则无法绑定。如没有selector字段,PVC会根据容量匹配PV。
PVC和PV绑定后,PV无法删除,如需删除PV,需要先删除绑定的PVC。
创建Pod
创建Pod,并和PVC关联。HBlock CSI插件将自动完成格式化卷(如果未格式化),挂载卷。
新建Pod的YAML配置文件
-
卷模式为filesystem,创建Pod my-csi-app-local-pv-stor1lun06a的配置文件,参考examples\filesystem-volumes\static-pv\csi-app-local-pv.yaml中的示例。
kind: Pod apiVersion: v1 metadata: name: my-csi-app-local-pv-stor1lun06a #创建的Pod名称 spec: containers: - name: my-frontend #容器名称 image: busybox #请替换为容器使用的镜像 imagePullPolicy: "IfNotPresent" #容器镜像的拉取策略 volumeMounts: - mountPath: "/test6a" #卷挂载到容器的目标路径 name: lun06a #对应volumes标签下的资源名 command: [ "sleep", "1000000" ] volumes: - name: lun06a # volumes资源名,可以在volumeMounts下挂载 persistentVolumeClaim: claimName: csi-pvc-local-nocreate-stor1lun06a # Pod指定使用的PVC名称
-
卷模式为Block,创建Pod csi-app-local-pv-block-stor2lunb1的配置文件csi-app-local-pv-stor1lun06a.yaml,参考examples\block-volumes\static-pv\csi-app-local-pv-block.yaml中的示例。
kind: Pod apiVersion: v1 metadata: name: csi-app-local-pv-block-stor2lunb1 spec: containers: - name: lunb1 image: busybox imagePullPolicy: "IfNotPresent" volumeDevices: - devicePath: "/dev/testb1" name: lunb1 command: [ "sleep", "1000000" ] volumes: - name: lunb1 persistentVolumeClaim: claimName: csi-pvc-local-nocreate-block-stor2lunb1
应用配置文件
以csi-app-local-pv-stor1lun06a.yaml 为例。
[root@server test]# kubectl apply -f csi-app-local-pv-stor1lun06a.yaml
pod/my-csi-app-local-pv-stor1lun06a created
验证Pod中挂载的卷
[root@server test]# kubectl get pod|grep my-csi-app-local-pv-stor1lun06a
my-csi-app-local-pv-stor1lun06a 1/1 Running 0 92s
可以看到容器中已经挂载了路径/test6a,此路径对应HBlock中的卷lun06a。
[root@server ~]# kubectl exec -it my-csi-app-local-pv-stor1lun06a -- /bin/sh
/ # ls
bin dev etc home lib lib64 proc root sys test6a tmp usr var