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 节点上执行以下步骤:

  1. 要在必须配置启动器的所有节点上安装与启动器相关的软件包,请执行以下命令:

    # yum install iscsi-initiator-utils device-mapper-multipath
  2. 要启用多路径,请执行以下命令:

    # mpathconf --enable
  3. 创建以下内容并在 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
  4. 执行以下命令启动多路径守护进程并 [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),则可以省略以下步骤。

  1. 执行以下命令为密码创建编码值:

    # echo -n "<key>" | base64

    其中 key 是部署 CNS 时创建的 admin-key 的值

    例如:

    # echo -n "mypassword" | base64
    bXlwYXNzd29yZA==
  2. 创建 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
  3. 通过执行以下命令在 Openshift 上注册 secret:

    # oc create -f glusterfs-secret.yaml
    secret "heketi-secret" created
3.2.1.1.3. 注册存储类

为持久性卷置备配置 StorageClass 对象时,管理员必须描述要使用的置备程序类型,以及置备属于类的 PersistentVolume 时使用的参数。

  1. 创建存储类。下面是一个存储类文件示例:

    # 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 provisioner pod 的部署有的 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 实例。所有参数都是可选的。如果省略 restsecretnamespacerestsecretname,则使用空密码。
    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 中包含 _。

  2. 要将存储类注册到 Openshift,请执行以下命令:

    # oc create -f glusterfs-block-storageclass.yaml
    storageclass "gluster-block" created
  3. 要获得存储类的详情,请执行以下命令:

    # 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. 创建持久性卷声明

要创建持久性卷声明,请执行以下命令:

  1. 创建持久性卷声明文件。如下提供了示例持久性卷声明:

    # 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。

  2. 执行以下命令注册声明:

    # oc create -f glusterfs-block-pvc-claim.yaml
    persistentvolumeclaim "claim1" created
  3. 要获取声明的详细信息,请执行以下命令:

    # 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. 验证申索创建

要验证是否创建了声明,请执行以下命令:

  1. 要获取持久性卷声明和持久性卷的详情,请执行以下命令:

    # 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

您可以为创建的持久性卷提供自定义卷名称前缀。通过提供自定义卷名称前缀,用户现在可以基于以下方法轻松地搜索/过滤卷:

  • 任何作为 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 中使用声明。

  1. 要在应用中使用声明,例如

    # 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

  2. 要验证 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
  3. 要验证持久性卷是否挂载到容器中,请执行以下命令:

    # 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 被删除也是如此。

  1. 要删除声明,请执行以下命令:

    # oc delete pvc <claim-name>

    例如:

    # oc delete pvc claim1
    persistentvolumeclaim "claim1" deleted
  2. 要验证是否删除了声明,请执行以下命令:

    # 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 作为日志记录和指标的后端

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部