3.2. 块存储
块存储允许创建高性能单个存储单元。与 glusterfs 支持的传统文件存储功能不同,可以将每个存储卷/块设备视为独立磁盘驱动器,以便每个存储卷/块设备都可以支持单个文件系统。
Gluster-block 是块设备的分布式管理框架。它旨在使 Gluster 支持的块存储创建和维护尽可能简单。gluster-block 可以置备块设备并将它们导出为 iSCSI LUN,并使用 iSCSI 协议来传输 SCSI 块/命令。
- OpenShift Container Storage 3.11 现在支持块卷扩展。请参阅 第 3.2.3 节 “块卷扩展”。
- 块存储不支持静态置备卷。卷的动态置备是唯一支持的方法。
块存储的推荐 Red Hat Enterprise Linux(RHEL)版本为 RHEL-7.5.4。请确保您的内核版本与 3.10.0-862.14.4.el7.x86_64 相匹配。验证执行:
# uname -r重启节点以使最新的内核更新生效。
3.2.1. 为块存储动态置备卷 复制链接链接已复制到粘贴板!
动态置备可让您将 Red Hat Gluster 存储卷置备到正在运行的应用程序容器中,而无需预获取卷。由于声明请求出现,该卷将动态创建,因此该卷的大小将调配给应用容器。
当使用(默认)Ansible 安装程序和在安装过程中创建的默认存储类(glusterfs-storage-block)部署 OpenShift Container Storage 时,不需要下方概述的步骤。
3.2.1.1. 配置卷的动态置备 复制链接链接已复制到粘贴板!
要配置卷的动态置备,管理员必须定义描述集群中提供的存储的 StorageClass 对象。创建存储类后,必须先创建用于 heketi 身份验证的机密,然后才能继续创建持久性卷声明。
3.2.1.1.1. 在所有发起端配置多路径 复制链接链接已复制到粘贴板!
要确保 iSCSI 启动器可以使用多路径与 iSCSI 目标通信并实现 HA,请在托管应用程序 pod 的所有 OpenShift 节点上执行以下步骤:
要在必须配置启动器的所有节点上安装与启动器相关的软件包,请执行以下命令:
# yum install iscsi-initiator-utils device-mapper-multipath要启用多路径,请执行以下命令:
# mpathconf --enable创建以下内容并在 multipath.conf 文件中添加以下内容:
注意如果是升级,请确保仅在所有服务器节点升级后对 multipath.conf 进行更改并重新载入 multipathd。
# cat >> /etc/multipath.conf <<EOF # LIO iSCSI devices { device { vendor "LIO-ORG" user_friendly_names "yes" # names like mpatha path_grouping_policy "failover" # one path per group hardware_handler "1 alua" path_selector "round-robin 0" failback immediate path_checker "tur" prio "alua" no_path_retry 120 } } EOF执行以下命令启动多路径守护进程并 [re] 加载多路径配置:
# systemctl start multipathd# systemctl reload multipathd
3.2.1.1.2. 为 Heketi 身份验证创建 Secret 复制链接链接已复制到粘贴板!
要为 Heketi 身份验证创建 secret,请执行以下命令:
如果在部署 Red Hat Openshift Container Storage 的过程中没有设置 admin-key 值(用于访问 heketi 来获取卷详情的 secret),则可以省略以下步骤。
执行以下命令为密码创建编码值:
# echo -n "<key>" | base64其中
key是部署 CNS 时创建的admin-key的值例如:
# echo -n "mypassword" | base64 bXlwYXNzd29yZA==创建 secret 文件。下面是一个 secret 文件示例:
# cat glusterfs-secret.yaml apiVersion: v1 kind: Secret metadata: name: heketi-secret namespace: default data: # base64 encoded password. E.g.: echo -n "mypassword" | base64 key: bXlwYXNzd29yZA== type: gluster.org/glusterblock通过执行以下命令在 Openshift 上注册 secret:
# oc create -f glusterfs-secret.yaml secret "heketi-secret" created
3.2.1.1.3. 注册存储类 复制链接链接已复制到粘贴板!
为持久性卷置备配置 StorageClass 对象时,管理员必须描述要使用的置备程序类型,以及置备属于类的 PersistentVolume 时使用的参数。
创建存储类。下面是一个存储类文件示例:
# cat > glusterfs-block-storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: gluster-block provisioner: gluster.org/glusterblock-infra-storage reclaimPolicy: Retain parameters: resturl: "http://heketi-storage-project.cloudapps.mystorage.com" restuser: "admin" restsecretnamespace: "default" restsecretname: "heketi-secret" hacount: "3" clusterids: "630372ccdc720a92c681fb928f27b53f,796e6db1981f369ea0340913eeea4c9a" chapauthenabled: "true" volumenameprefix: "test-vol"其中,
- provisioner
置备程序名称应与
glusterblock provisionerpod 的部署有的 provisioner 名称匹配。要获得置备程序名称,请使用以下命令:# oc describe pod <glusterblock_provisioner_pod_name> |grep PROVISIONER_NAME例如:
# oc describe pod glusterblock-registry-provisioner-dc-1-5j8l9 |grep PROVISIONER_NAME PROVISIONER_NAME: gluster.org/glusterblock-infra-storage- resturl
- Gluster REST 服务/Heketi 服务 url,可按需调配 gluster 卷。常规格式必须是 IPaddress:Port,这是 GlusterFS 动态置备程序的一项必要参数。如果 Heketi 服务在 openshift/kubernetes 设置中公开,则可能的格式与 http://heketi-storage-project.cloudapps.mystorage.com 类似,其中 fqdn 是可解析的 heketi 服务 URL。
- restuser
- 可访问受信存储池中创建卷的 Gluster REST 服务/Heketi 用户
- restsecretnamespace + restsecretname
-
识别包含引用 Gluster REST 服务时要使用的用户密码的 Secret 实例。所有参数都是可选的。如果省略
restsecretnamespace和restsecretname,则使用空密码。 - hacount
-
它是块目标服务器的路径数量。
count通过 iSCSI 多路径功能提供高可用性。如果路径失败,则 I/O 不会中断,并通过另一个可用路径提供 I/O。 - clusterids
它是集群 ID,在置备卷时会供 heketi 使用。它还可以是用逗号分开的集群 ID 列表。这是一个可选参数。
注意要获取集群 ID,请执行以下命令:
# heketi-cli cluster list- chapauthenabled
- 如果要使用启用 CHAP 身份验证来置备块卷,则必须将此值设置为 true。这是一个可选参数。
- volumenameprefix
这是一个可选参数。它描述了 heketi 创建的卷的名称。更多信息请参阅: 第 3.2.1.1.6 节 “(可选)为持久性卷提供自定义卷名称前缀”
注意此参数的值无法在 storageclass
中包含_。
要将存储类注册到 Openshift,请执行以下命令:
# oc create -f glusterfs-block-storageclass.yaml storageclass "gluster-block" created要获得存储类的详情,请执行以下命令:
# oc describe storageclass gluster-block Name: gluster-block IsDefaultClass: No Annotations: <none> Provisioner: gluster.org/glusterblock-infra-storage Parameters: chapauthenabled=true,hacount=3,opmode=heketi,restsecretname=heketi-secret,restsecretnamespace=default,resturl=http://heketi-storage-project.cloudapps.mystorage.com,restuser=admin Events: <none>
3.2.1.1.4. 创建持久性卷声明 复制链接链接已复制到粘贴板!
要创建持久性卷声明,请执行以下命令:
创建持久性卷声明文件。如下提供了示例持久性卷声明:
# cat glusterfs-block-pvc-claim.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: claim1 annotations: volume.beta.kubernetes.io/storage-class: gluster-block spec: persistentVolumeReclaimPolicy: Retain accessModes: - ReadWriteOnce resources: requests: storage: 5Gi- persistentVolumeReclaimPolicy
这是一个可选参数。如果此参数设为 "Retain",则底层的持久性卷也会保留,即使删除了对应的持久性卷声明。
注意当 PVC 被删除时,如果 "persistentVolumeReclaimPolicy:" 设置为 "Retain",则底层 heketi 和 gluster 卷不会被删除。要删除卷,您必须使用 heketi cli,然后删除 PV。
执行以下命令注册声明:
# oc create -f glusterfs-block-pvc-claim.yaml persistentvolumeclaim "claim1" created要获取声明的详细信息,请执行以下命令:
# oc describe pvc <_claim_name_>例如:
# oc describe pvc claim1 Name: claim1 Namespace: block-test StorageClass: gluster-block Status: Bound Volume: pvc-ee30ff43-7ddc-11e7-89da-5254002ec671 Labels: <none> Annotations: control-plane.alpha.kubernetes.io/leader={"holderIdentity":"8d7fecb4-7dba-11e7-a347-0a580a830002","leaseDurationSeconds":15,"acquireTime":"2017-08-10T15:02:30Z","renewTime":"2017-08-10T15:02:58Z","lea... pv.kubernetes.io/bind-completed=yes pv.kubernetes.io/bound-by-controller=yes volume.beta.kubernetes.io/storage-class=gluster-block volume.beta.kubernetes.io/storage-provisioner=gluster.org/glusterblock Capacity: 5Gi Access Modes: RWO Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 1m 1m 1 gluster.org/glusterblock 8d7fecb4-7dba-11e7-a347-0a580a830002 Normal Provisioning External provisioner is provisioning volume for claim "block-test/claim1" 1m 1m 18 persistentvolume-controller Normal ExternalProvisioning cannot find provisioner "gluster.org/glusterblock", expecting that a volume for the claim is provisioned either manually or via external software 1m 1m 1 gluster.org/glusterblock 8d7fecb4-7dba-11e7-a347-0a580a830002 Normal ProvisioningSucceeded Successfully provisioned volume pvc-ee30ff43-7ddc-11e7-89da-5254002ec671
3.2.1.1.5. 验证申索创建 复制链接链接已复制到粘贴板!
要验证是否创建了声明,请执行以下命令:
要获取持久性卷声明和持久性卷的详情,请执行以下命令:
# oc get pv,pvc NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM STORAGECLASS REASON AGE pv/pvc-ee30ff43-7ddc-11e7-89da-5254002ec671 5Gi RWO Delete Bound block-test/claim1 gluster-block 3m NAME STATUS VOLUME CAPACITY ACCESSMODES STORAGECLASS AGE pvc/claim1 Bound pvc-ee30ff43-7ddc-11e7-89da-5254002ec671 5Gi RWO gluster-block 4m
要识别块卷和块托管卷,请参考 https://access.redhat.com/solutions/3897581
3.2.1.1.6. (可选)为持久性卷提供自定义卷名称前缀 复制链接链接已复制到粘贴板!
您可以为创建的持久性卷提供自定义卷名称前缀。通过提供自定义卷名称前缀,用户现在可以基于以下方法轻松地搜索/过滤卷:
- 任何作为 storageclass 文件中的字段值 "volnameprefix" 提供的字符串。
- 持久性卷声明名称。
- 项目/命名空间名称。
要设置名称,请确保您已将参数 volumenameprefix 添加到存储类文件中。如需更多信息,请参阅 第 3.2.1.1.3 节 “注册存储类”
此参数的值无法在 storageclass 中包含 _。
要验证是否设置了自定义卷名称前缀,请执行以下命令:
# oc describe pv <pv_name>
例如:
# oc describe pv pvc-4e97bd84-25f4-11e8-8f17-005056a55501
Name: pvc-4e97bd84-25f4-11e8-8f17-005056a55501
Labels: <none>
Annotations: AccessKey=glusterblk-67d422eb-7b78-4059-9c21-a58e0eabe049-secret
AccessKeyNs=glusterfs
Blockstring=url:http://172.31.251.137:8080,user:admin,secret:heketi-secret,secretnamespace:glusterfs
Description=Gluster-external: Dynamically provisioned PV
gluster.org/type=block
gluster.org/volume-id=cd37c089372040eba20904fb60b8c33e
glusterBlkProvIdentity=gluster.org/glusterblock
glusterBlockShare=test-vol_glusterfs_bclaim1_4eab5a22-25f4-11e8-954d-0a580a830003
kubernetes.io/createdby=heketi
pv.kubernetes.io/provisioned-by=gluster.org/glusterblock
v2.0.0=v2.0.0
StorageClass: gluster-block-prefix
Status: Bound
Claim: glusterfs/bclaim1
Reclaim Policy: Delete
Access Modes: RWO
Capacity: 5Gi
Message:
Source:
Type: ISCSI (an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod)
TargetPortal: 10.70.46.177
IQN: iqn.2016-12.org.gluster-block:67d422eb-7b78-4059-9c21-a58e0eabe049
Lun: 0
ISCSIInterface default
FSType: xfs
ReadOnly: false
Portals: [10.70.46.142 10.70.46.4]
DiscoveryCHAPAuth: false
SessionCHAPAuth: true
SecretRef: {glusterblk-67d422eb-7b78-4059-9c21-a58e0eabe049-secret }
InitiatorName: <none>
Events: <none>
glusterBlockShare 的值将附加至命名空间的自定义卷名称前缀,此时为 "test-vol"。
3.2.1.1.7. 在 Pod 中使用 Claim 复制链接链接已复制到粘贴板!
执行以下步骤以在 pod 中使用声明。
要在应用中使用声明,例如
# cat app.yaml apiVersion: v1 kind: Pod metadata: name: busybox spec: containers: - image: busybox command: - sleep - "3600" name: busybox volumeMounts: - mountPath: /usr/share/busybox name: mypvc volumes: - name: mypvc persistentVolumeClaim: claimName: claim1# oc create -f app.yaml pod "busybox" created有关在应用中使用 glusterfs 声明的更多信息,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-storage-examples-gluster-example。
要验证 pod 是否已创建,请执行以下命令:
# oc get pods -n storage-project NAME READY STATUS RESTARTS AGE block-test-router-1-deploy 0/1 Running 0 4h busybox 1/1 Running 0 43s glusterblock-provisioner-1-bjpz4 1/1 Running 0 4h glusterfs-7l5xf 1/1 Running 0 4h glusterfs-hhxtk 1/1 Running 3 4h glusterfs-m4rbc 1/1 Running 0 4h heketi-1-3h9nb 1/1 Running 0 4h要验证持久性卷是否挂载到容器中,请执行以下命令:
# oc rsh busybox/ # df -h Filesystem Size Used Available Use% Mounted on /dev/mapper/docker-253:1-11438-39febd9d64f3a3594fc11da83d6cbaf5caf32e758eb9e2d7bdd798752130de7e 10.0G 33.9M 9.9G 0% / tmpfs 3.8G 0 3.8G 0% /dev tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup /dev/mapper/VolGroup00-LogVol00 7.7G 2.8G 4.5G 39% /dev/termination-log /dev/mapper/VolGroup00-LogVol00 7.7G 2.8G 4.5G 39% /run/secrets /dev/mapper/VolGroup00-LogVol00 7.7G 2.8G 4.5G 39% /etc/resolv.conf /dev/mapper/VolGroup00-LogVol00 7.7G 2.8G 4.5G 39% /etc/hostname /dev/mapper/VolGroup00-LogVol00 7.7G 2.8G 4.5G 39% /etc/hosts shm 64.0M 0 64.0M 0% /dev/shm /dev/mpatha 5.0G 32.2M 5.0G 1% /usr/share/busybox tmpfs 3.8G 16.0K 3.8G 0% /var/run/secrets/kubernetes.io/serviceaccount tmpfs 3.8G 0 3.8G 0% /proc/kcore tmpfs 3.8G 0 3.8G 0% /proc/timer_list tmpfs 3.8G 0 3.8G 0% /proc/timer_stats tmpfs 3.8G 0 3.8G 0% /proc/sched_debug
3.2.1.1.8. 删除持久性卷声明 复制链接链接已复制到粘贴板!
如果在注册 storageclass 时,如果 "persistentVolumeReclaimPolicy" 参数被设置为 "Retain",则底层 PV 和对应卷即使 PVC 被删除也是如此。
要删除声明,请执行以下命令:
# oc delete pvc <claim-name>例如:
# oc delete pvc claim1 persistentvolumeclaim "claim1" deleted要验证是否删除了声明,请执行以下命令:
# oc get pvc <claim-name>例如:
# oc get pvc claim1 No resources found.用户删除绑定到动态置备创建的持久性卷声明(除了删除持久性卷声明外),Kubernetes 也会删除持久卷、端点、服务和实际卷。如果需要验证它,请执行以下命令:
要验证持久性卷是否已删除,请执行以下命令:
# oc get pv <pv-name>例如:
# oc get pv pvc-962aa6d1-bddb-11e6-be23-5254009fc65b No resources found.
下一步:如果您要安装 Red Hat Openshift Container Storage 3.11,而您希望使用块存储作为日志记录和指标的后端存储,请参阅 第 7 章 Gluster Block Storage 作为日志记录和指标的后端。