操作指南

Red Hat OpenShift Container Storage 3.11

配置和管理 Red Hat Openshift Container Storage.

摘要

本指南提供有关运行容器存储部署的信息。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息

部分 I. 管理

第 1 章 管理集群

heketi 允许管理员通过管理一个或多个红帽 Gluster 存储集群来添加和删除存储容量。

他提供了一个 RESTful 管理界面,可用于管理红帽 Gluster 存储卷的生命周期。利用 Heketi,如 OpenStack Manila、Kubernetes 和 OpenShift 等云服务可以动态置备 Red Hat Gluster Storage 卷,并包括了任何受支持的持久性类型。他将自动确定集群中 brick 的位置,确保在不同故障域中放置 brick 及其副本。Heketi 还支持任意数量的红帽 Gluster 存储群集,允许云服务提供网络文件存储,而无需受限于单个红帽 Gluster 存储群集。
使用 Heketi 时,管理员不再管理或配置 brick、磁盘或受信存储池。Heketi 服务将管理所有硬件,使管理员能够按需分配存储。所有用 Heketi 注册的磁盘都必须以原始格式提供,然后使用提供的磁盘上由 LVM 管理。

注意

副本 3 和仲裁卷是支持使用 Heketi 创建的卷类型。

heketi 卷创建

heketi 卷创建

创建卷请求到 Heketi,使得它能够选择在 2 个区域和 4 个节点之间分布的 brick。在红帽 Gluster 存储中创建卷后,Hketi 为最初发出请求的服务提供卷信息。

1.1. 增加存储容量

您可以使用以下方法增加存储容量:

  • 添加设备
  • 添加新节点
  • 添加一个全新的群集。

1.1.1. 添加新设备

您可以在现有节点中添加更多设备来提高存储容量。当添加更多设备时,您必须确保将设备添加为集合。例如,当扩展副本副本数为 2 的分布式复制卷时,应将一个设备添加到至少两个节点中。如果使用副本 3,则至少应将一个设备添加到至少三个节点。

您可以使用 CLI 添加设备,如下所示:

注册指定的设备。以下示例演示了如何将设备的 /dev/sde' 添加到节点 d6f2c22f2757bf67b1486d868dcb7794 中:

# heketi-cli device add --name=/dev/sde --node=d6f2c22f2757bf67b1486d868dcb7794
OUTPUT:
Device added successfully

1.1.2. 添加新节点

将存储添加到 Heketi 的另一种方式是向集群添加新节点。与添加设备一样,您可以使用 CLI 将新节点添加到现有集群中。在集群中添加新节点后,您必须将新设备注册到该节点。

注意

若要添加节点成功,请确保打开了用于 glusterd 通信的端口。有关端口的详情请参考 https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.5/html/installation_guide/port_information

  1. 扩展 OCP 集群以添加新节点。更多信息请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#adding-cluster-hosts_adding-hosts-to-cluster

    注意
    • 如果新节点已成为 OCP 集群的一部分,请跳过这一步并继续下一步 2。
    • OCP 集群可以扩展,以作为计算节点或 infra 节点添加新节点。例如,对于 infra,它是 node3.example.com openshift_node_group_name='node-config-infra',对于计算节点,它是 node3.example.com openshift_node_group_name='node-config-compute'。
  2. 配置防火墙规则:

    注意

    若要添加节点成功,请确保打开了用于 glusterd 通信的端口。有关端口的详情请参考 https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.5/html/installation_guide/port_information

    1. 在新添加的 glusterfs 节点的 /etc/sysconfig/iptables 文件中添加以下规则:

      -A OS_FIREWALL_ALLOW -p tcp -m state --state NEW -m tcp --dport 24007 -j ACCEPT
      -A OS_FIREWALL_ALLOW -p tcp -m state --state NEW -m tcp --dport 24008 -j ACCEPT
      -A OS_FIREWALL_ALLOW -p tcp -m state --state NEW -m tcp --dport 2222 -j ACCEPT
      -A OS_FIREWALL_ALLOW -p tcp -m state --state NEW -m multiport --dports 49152:49664 -j ACCEPT
      -A OS_FIREWALL_ALLOW -p tcp -m state --state NEW -m tcp --dport 24010 -j ACCEPT
      -A OS_FIREWALL_ALLOW -p tcp -m state --state NEW -m tcp --dport 3260 -j ACCEPT
      -A OS_FIREWALL_ALLOW -p tcp -m state --state NEW -m tcp --dport 111 -j ACCEPT
    2. 重新载入/重启 iptables:

      # systemctl restart iptables
  3. 执行以下步骤将标签添加到要部署 RHGS Container 的节点:

    1. 执行以下命令,验证 Red Hat Openshift Container Storage 是否已部署并以预期身份工作:

      # oc get ds

      例如:

      # oc get ds
      NAME                DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
      glusterfs-storage   3         3         3         3            3           glusterfs=storage-host   1d
    2. 为新添加的每个节点添加标签,为该新集群添加了 Red Hat Gluster Storage pod:

      # oc label node <NODE_NAME> glusterfs=<node_label>

      其中,

      • NODE_NAME: 是新创建的节点的名称。
      • node_label:现有 daemonset 中使用的名称。当您执行 oc get ds 时,这是您在上一步中获取的值。

      例如:

      # oc label node 192.168.90.3 glusterfs=storage-host
      node "192.168.90.3" labeled
    3. 通过执行以下命令验证 Red Hat Gluster Storage pod 是否在新添加的节点上运行:

      观察在这些新节点上生成的其他 Gluster 存储 pod

      # oc get pods

      例如:

      # oc get pods
      NAME              READY     STATUS    RESTARTS   AGE
      glusterfs-356cf   1/1       Running   0          30d
      glusterfs-fh4gm   1/1       Running   0          30d
      glusterfs-hg4tk   1/1       Running   0          30d
      glusterfs-v759z   0/1       Running   0          1m

      您应看到其他 Gluster 存储 pod,在本例中为 4gluster pod,而不是像前面一样查看 3。它们需要 1-2 分钟才能健康。(如 glusterfs-v759z 0/1 不健康状态)。

    4. 验证 Red Hat Gluster Storage pod 是否正在运行

      # oc get pods -o wide -l glusterfs=storage-pod
  4. 使用 Heketi CLI 向集群添加新节点。下面介绍如何使用 CLI 将新节点 1 添加到 '597fceb5d6c876b899e48f599b988f54 ' 集群:

    # heketi-cli node add --zone=1 --cluster=597fceb5d6c876b899e48f599b988f54 --management-host-name=node4.example.com --storage-host-name=192.168.10.104
    
    OUTPUT:
    Node information:
    Id: 095d5f26b56dc6c64564a9bc17338cbf
    State: online
    Cluster Id: 597fceb5d6c876b899e48f599b988f54
    Zone: 1
    Management Hostname node4.example.com
    Storage Hostname 192.168.10.104
  5. 使用 Heketi CLI 在集群中添加设备。有关添加设备的详情请参考 第 1.1.1 节 “添加新设备”

    注意

    当节点添加到使用 heketi 的 gluster 受信存储池时,现有的端点不会自动更新。
    要更新端点,请执行以下命令:

    # heketi-cli volume endpoint patch <volume-id>
    # oc patch ep <heketi-db-endpoint-name> -p <changes>

1.1.3. 将新集群添加到现有 Red Hat Openshift Container Storage 安装中

通过添加新的红帽 Gluster 存储群集,可以增加存储容量。新集群的节点必须作为 OCP 节点(聚合模式)或 RHGS 节点(独立模式)准备。要在现有 Red Hat Openshift Container Storage 安装中添加新集群,请执行以下命令:

  1. 执行以下命令,验证 Red Hat Openshift Container Storage 是否已部署并以预期身份工作。

    # oc get ds

    例如:

    # oc get ds
    NAME                DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
    glusterfs-storage   3         3         3         3            3           glusterfs=storage-host   1d
    注意

    第 1.1.2 节 “添加新节点” 部分执行步骤 1 和步骤 2 来添加新主机。对要添加的所有节点重复上述步骤。

  2. 通过执行以下命令验证 Red Hat Gluster Storage pod 是否在运行:

    # oc get pods
  3. 为新添加的每个节点添加标签,在其中为新集群添加 Red Hat Gluster Storage pod,以执行以下命令:

    # oc label node <NODE_NAME> glusterfs=<node_label>

    其中,

    • NODE_NAME: 是新创建的节点的名称
    • node_label:现有 daemonset 中使用的名称。

    例如:

    # oc label node 192.168.90.3 glusterfs=storage-host
    node "192.168.90.3" labeled

    观察在这些新节点上生成的其他 Gluster 存储 pod

    # oc get pods

    例如:

    # oc get pods
    NAME              READY     STATUS    RESTARTS   AGE
    glusterfs-356cf   1/1       Running   0          30d
    glusterfs-fh4gm   1/1       Running   0          30d
    glusterfs-hg4tk   1/1       Running   0          30d
    glusterfs-v759z   0/1       Running   0          1m
    glusterfs-rgs3k   0/1       Running   0          1m
    glusterfs-gtq9f   0/1       Running   0          1m

    您应看到其他 Gluster 存储 pod,在这个示例中,6 gluster 容器集而不是像以前一样 3。它们需要 1-2 分钟才能正常运行。(例如,glusterfs-v759z、glusterfs-rgs3k 和 glusterfs-gtq9f 0/1 不健康)。

  4. 通过执行以下命令验证 Red Hat Gluster Storage pod 是否在运行:

    # oc get ds

    例如:

    # oc get ds
    NAME                DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
    glusterfs-storage   6         6         6         6            6           glusterfs=storage-host   2h
  5. 使用以下命令在 Heketi 中创建新集群:

    # heketi-cli cluster create
  6. 如添加新设备和添加新节点 中所述,在新创建的集群中添加节点和设备。??? ???

1.2. 减少存储容量

Heketi 还支持减小存储容量。您可以通过删除设备、节点和集群来减少存储。这些请求只能通过 heketi CLI 或 API 执行。有关使用命令行 API 的详情,请参考 Heketi API https://github.com/heketi/heketi/wiki/API

注意
  • 通过执行 heketi-cli 拓扑信息命令可以检索 ID。

    # heketi-cli topology info
  • heketidbstorage 卷无法被删除,因为它包含 heketi 数据库。

1.2.1. 删除卷

您可以使用以下 Heketi CLI 命令删除卷:

# heketi-cli volume delete <volume_id>

例如:

# heketi-cli volume delete 12b2590191f571be9e896c7a483953c3
Volume 12b2590191f571be9e896c7a483953c3 deleted

1.2.2. 删除 Bricks

您可以使用以下 Heketi CLI 命令从卷中删除 brick:

# heketi-cli brick evict <brick_id>

例如:

# heketi-cli brick evict 000e649d15e7d2a7615de3c2878ee270
  Brick 000e649d15e7d2a7615de3c2878ee270 evicted

可以从 Heketi 拓扑确定 brick ID。个 brick 属于一个卷,因此只需要 brick ID。heketi 将自动确定该 brick 与之关联的卷,并将其替换为新 brick。

1.2.3. 删除设备

删除该设备从 heketi 的拓扑中删除设备。无法删除具有 brick 的设备。您必须通过禁用和删除设备来确保这些 brick 空闲。

1.2.3.1. 禁用和启用设备

禁用设备将进一步分配 brick 到该设备。您可以使用以下 Heketi CLI 命令禁用设备:

# heketi-cli device disable <device_id>

例如:

# heketi-cli device disable f53b13b9de1b5125691ee77db8bb47f4
Device f53b13b9de1b5125691ee77db8bb47f4 is now offline

如果要重新启用该设备,请执行以下命令。启用设备允许在该设备上分配 brick。

# heketi-cli device enable <device_id>

例如:

# heketi-cli device enable f53b13b9de1b5125691ee77db8bb47f4
Device f53b13b9de1b5125691ee77db8bb47f4 is now online

1.2.3.2. 删除和删除设备

删除设备会将现有的 brick 移到其他设备。这有助于确保设备没有 brick。只能在禁用设备后删除设备。

  1. 使用以下命令删除设备:

     # heketi-cli device remove <device_id>

    例如:

    # heketi-cli device remove e9ef1d9043ed3898227143add599e1f9
    Device e9ef1d9043ed3898227143add599e1f9 is now removed
  2. 使用以下命令删除该设备:

    # heketi-cli device delete <device_id>

    例如:

    # heketi-cli device delete 56912a57287d07fad0651ba0003cf9aa
    Device 56912a57287d07fad0651ba0003cf9aa deleted

    重复使用已删除设备的唯一方法是再次添加该设备到 heketi 的拓扑中。

1.2.4. 删除节点

无法删除添加设备的节点。要删除该节点,必须删除与节点关联的设备。禁用和删除节点可确保所有底层设备也会被删除。删除该节点后,可以删除其中的所有设备,最后可以删除该节点。

1.2.4.1. 禁用和启用节点

禁用节点将 brick 进一步分配给与节点关联的所有设备。您可以使用以下 heketi CLI 命令禁用节点:

# heketi-cli node disable <node_id>

例如:

# heketi-cli node disable 5f0af88b968ed1f01bf959fe4fe804dc
Node 5f0af88b968ed1f01bf959fe4fe804dc is now offline

如果要重新启用该节点,请执行以下命令。

# heketi-cli node enable <node_id>

例如:

# heketi-cli node enable 5f0af88b968ed1f01bf959fe4fe804dc
Node 5f0af88b968ed1f01bf959fe4fe804dc is now online

1.2.4.2. 删除和删除节点

删除节点会将节点中所有设备的现有 brick 移到集群中的其它设备。这有助于确保节点中的所有设备都没有 brick。只能在禁用设备后删除设备。

  1. 要删除节点,请执行以下命令:

    # heketi-cli node remove <node_id>

    例如:

    # heketi-cli node remove 5f0af88b968ed1f01bf959fe4fe804dc
    Node 5f0af88b968ed1f01bf959fe4fe804dc is now removed
  2. 执行以下命令删除与节点关联的设备,因为无法删除与其关联的设备:

    # heketi-cli device delete <device_id>

    例如:

    # heketi-cli device delete 56912a57287d07fad0651ba0003cf9aa
    Device 56912a57287d07fad0651ba0003cf9aa deleted

    对节点上的每个设备执行 命令。

  3. 使用以下命令删除节点:

    # heketi-cli node delete <node_id>

    例如:

    # heketi-cli node delete 5f0af88b968ed1f01bf959fe4fe804dc
    Node 5f0af88b968ed1f01bf959fe4fe804dc deleted

    删除节点将从 heketi 拓扑中删除节点。重新将节点重新添加到 heketi 的拓扑中,重复使用已删除节点的唯一方法是

    注意
    • 当使用 heketi 从 gluster 受信存储池中删除节点时,现有端点不会自动更新。
      要更新端点,请执行以下命令:
    # heketi-cli volume endpoint patch <volume-id>
    # oc patch ep <heketi-db-endpoint-name> -p <changes>
    • 可选-使用 heketi 从 gluster 受信存储池中删除节点,在已删除节点上运行的 pod 仍然存在。要删除 pod,请执行以下命令:
    # oc label nodes <node name> glusterfs-

    例如:

    # oc label node 192.168.90.3 glusterfs-
      node "192.168.90.3" labeled

    glusterfs=storage-host 标签已从节点中删除,以确保已删除的 glusterfs pod 已从移除的节点中停止并删除。有关维护前所需步骤的更多信息,请参阅链接 :https://access.redhat.com/documentation/en-us/red_hat_openshift_container_storage/3.11/html-single/operations_guide/index#necessary_steps_to_be_followed_before_maintenance

1.2.5. 删除集群

您可以使用以下 Heketi CLI 命令删除集群:

注意

在删除集群前,请确保集群中的所有节点被删除。

# heketi-cli cluster delete <cluster_id>

例如:

# heketi-cli cluster delete 0e949d91c608d13fd3fc4e96f798a5b1
Cluster 0e949d91c608d13fd3fc4e96f798a5b1 deleted

1.3. 替换集群资源

heketi 支持替换设备和节点。在以下部分中提供了替换设备和节点的步骤。

1.3.1. 替换设备

heketi 不允许使用另一个设备进行一对一替换。但是,如果设备失败,请按照以下示例了解替换失败设备所需的操作顺序。

  1. 使用以下命令查找失败的设备:

    # heketi-cli topology info
    …
    …
    ...
        Nodes:
    Node Id: 8faade64a9c8669de204b66bc083b10d
    ...
    ...
    …
                    Id:a811261864ee190941b17c72809a5001   Name:/dev/vdc            State:online    Size (GiB):499     Used (GiB):281     Free (GiB):218
                            Bricks:
                                    Id:34c14120bef5621f287951bcdfa774fc   Size (GiB):280     Path: /var/lib/heketi/mounts/vg_a811261864ee190941b17c72809a5001/brick_34c14120bef5621f287951bcdfa774fc/brick
    …
    …
    ...

    以下示例说明了替换故障设备所需的操作序列。这个示例使用设备 ID a811261864ee190941b17c72809a5001,它属于 ID 8faade64a9c8669de204b66bc083b10das

  2. 在与被替换设备相同的节点添加新设备。

    # heketi-cli device add --name /dev/vdd --node 8faade64a9c8669de204b66bc083b10d
    Device added successfully
  3. 禁用失败的设备。

    # heketi-cli device disable a811261864ee190941b17c72809a5001
    Device a811261864ee190941b17c72809a5001 is now offline
  4. 删除失败的设备。

    # heketi-cli device remove a811261864ee190941b17c72809a5001
    Device a811261864ee190941b17c72809a5001 is now removed

    在这个阶段,brick 从失败的设备迁移。他基于 brick 分配算法选择合适的设备。因此,可能所有 brick 不能迁移到新添加的设备。

  5. 删除失败的设备。

    1. 使用以下命令删除该设备:

      # heketi-cli device delete a811261864ee190941b17c72809a5001
      Device a811261864ee190941b17c72809a5001 deleted
      注意
      • 您可以使用 --force-forget 选项以及 Heketi-cli 设备删除 <device-ID> 命令来删除失败的设备。但是,建议仅在 device delete 命令失败时使用这个选项。
      • 您必须确定该设备已被移除,或者系统在 heketi 之外的干净使用系统命令,然后仅使用 --force-forget 选项。
    2. 必须禁用 performance.read-ahead 选项,以允许修复完成。

      # gluster volume set <VOLUME> performance.read-ahead off
      注意

      performance.read-ahead 选项设置为 OFF,直到完成对卷的修复任务为止,一旦修复完成,则将其设置回为 ON 状态的默认状态。

    3. 如果超过 100,000 个条目需要修复,则必须启动额外的 shd。有关如何启动其他自我修复守护进程的详情,请参考 https://access.redhat.com/solutions/3794011
  6. 在另一个设备上重复上述步骤序列之前,您必须等待自我修复操作完成。当条目值的数目返回 0 时,您可以验证自我修复操作是否已完成。

    # oc rsh <any_gluster_pod_name>
    for each in $(gluster volume list) ; do gluster vol heal $each info | grep "Number of entries:" ; done
    Number of entries: 0
    Number of entries: 0
    Number of entries: 0

1.3.2. 替换节点

heketi 不允许一对一替换另一个节点。但是,如果一个节点失败,请按照以下示例进行替换故障节点及其对应设备所需的操作顺序。

  1. 使用以下命令查找出现故障的节点:

    # heketi-cli topology info
    
    …
    …
    ...
        Nodes:
    Node Id: 8faade64a9c8669de204b66bc083b10d
    ...
    ...
    …
              Id:a811261864ee190941b17c72809a5001   Name:/dev/vdc            State:online    Size (GiB):499     Used (GiB):281     Free (GiB):218
                      Bricks:
                              Id:34c14120bef5621f287951bcdfa774fc   Size (GiB):280     Path: /var/lib/heketi/mounts/vg_a811261864ee190941b17c72809a5001/brick_34c14120bef5621f287951bcdfa774fc/brick
    …
    …
    ...

    以下示例说明了替换故障节点所需的操作顺序。这个示例使用节点 ID 8faade64a9c8669de204b66bc083b10d。

    扩展 OCP 集群以添加替换节点。有关如何添加节点的详情,请参考 第 1.1.2 节 “添加新节点” 部分中的步骤。

    注意

    如果替换节点已是 OCP 集群的一部分,请跳过这一步并继续下一步 2。

  2. 添加一个新节点,最好具有与要替换节点相同的设备。

    # heketi-cli node add --zone=1 --cluster=597fceb5d6c876b899e48f599b988f54 --management-host-name=node4.example.com --storage-host-name=192.168.10.104
    
    # heketi-cli device add --name /dev/vdd --node 8faade64a9c8669de204b66bc083b10d
    
    Node and device added successfully
  3. 禁用故障节点。

    # heketi-cli node disable 8faade64a9c8669de204b66bc083b10d
    Node 8faade64a9c8669de204b66bc083b10d is now offline
  4. 删除故障的节点。

    # heketi-cli node remove 8faade64a9c8669de204b66bc083b10d
    Node 8faade64a9c8669de204b66bc083b10d is now removed

    在这个阶段,brick 从故障节点迁移。他基于 brick 分配算法选择合适的设备。

  5. 执行以下命令删除与节点关联的设备,因为无法删除与其关联的设备:

    # heketi-cli device delete <device_id>

    例如:

    # heketi-cli device delete 56912a57287d07fad0651ba0003cf9aa
    Device 56912a57287d07fad0651ba0003cf9aa deleted

    对节点上的每个设备执行 命令。

  6. 删除出现故障的节点。

    # heketi-cli node delete 8faade64a9c8669de204b66bc083b10d
    Node 8faade64a9c8669de204b66bc083b10d deleted
    注意

    如果要替换节点中的块,请参阅 第 3.2.2 节 “替换块存储中的块”

第 2 章 在 OpenShift 环境中进行 Red Hat Gluster Storage Pod 操作

本章列出可以在红帽 Gluster 存储 pod(gluster pod)上执行的各种操作:

  • 要列出 pod,请执行以下命令:

    # oc get pods -n <storage_project_name>

    例如:

    # oc get pods -n storage-project
    NAME                                                     READY     STATUS    RESTARTS   AGE
    storage-project-router-1-v89qc                           1/1       Running   0          1d
    glusterfs-dc-node1.example.com                           1/1       Running   0          1d
    glusterfs-dc-node2.example.com                           1/1       Running   1          1d
    glusterfs-dc-node3.example.com                           1/1       Running   0          1d
    heketi-1-k1u14                                           1/1       Running   0          23m

    以下是上例中的 gluster pod:

    glusterfs-dc-node1.example.com
    glusterfs-dc-node2.example.com
    glusterfs-dc-node3.example.com
    注意

    topology.json 文件将提供给定受信存储池(TSP)中的节点详情。在上例中,所有三个红帽 Gluster 存储节点都来自相同的 TSP。

  • 要进入 gluster pod shell,请执行以下命令:

    # oc rsh <gluster_pod_name> -n <storage_project_name>

    例如:

    # oc rsh glusterfs-dc-node1.example.com -n storage-project
    
    sh-4.2#
  • 要获得对等状态,请执行以下命令:

    # gluster peer status

    例如:

    # gluster peer status
    
    Number of Peers: 2
    
    Hostname: node2.example.com
    Uuid: 9f3f84d2-ef8e-4d6e-aa2c-5e0370a99620
    State: Peer in Cluster (Connected)
    Other names:
    node1.example.com
    
    Hostname: node3.example.com
    Uuid: 38621acd-eb76-4bd8-8162-9c2374affbbd
    State: Peer in Cluster (Connected)
  • 要列出受信存储池上的 gluster 卷,请执行以下命令:

    # gluster volume info

    例如:

    Volume Name: heketidbstorage
    Type: Distributed-Replicate
    Volume ID: 2fa53b28-121d-4842-9d2f-dce1b0458fda
    Status: Started
    Number of Bricks: 2 x 3 = 6
    Transport-type: tcp
    Bricks:
    Brick1: 192.168.121.172:/var/lib/heketi/mounts/vg_1be433737b71419dc9b395e221255fb3/brick_c67fb97f74649d990c5743090e0c9176/brick
    Brick2: 192.168.121.233:/var/lib/heketi/mounts/vg_0013ee200cdefaeb6dfedd28e50fd261/brick_6ebf1ee62a8e9e7a0f88e4551d4b2386/brick
    Brick3: 192.168.121.168:/var/lib/heketi/mounts/vg_e4b32535c55c88f9190da7b7efd1fcab/brick_df5db97aa002d572a0fec6bcf2101aad/brick
    Brick4: 192.168.121.233:/var/lib/heketi/mounts/vg_0013ee200cdefaeb6dfedd28e50fd261/brick_acc82e56236df912e9a1948f594415a7/brick
    Brick5: 192.168.121.168:/var/lib/heketi/mounts/vg_e4b32535c55c88f9190da7b7efd1fcab/brick_65dceb1f749ec417533ddeae9535e8be/brick
    Brick6: 192.168.121.172:/var/lib/heketi/mounts/vg_7ad961dbd24e16d62cabe10fd8bf8909/brick_f258450fc6f025f99952a6edea203859/brick
    Options Reconfigured:
    performance.readdir-ahead: on
    
    Volume Name: vol_9e86c0493f6b1be648c9deee1dc226a6
    Type: Distributed-Replicate
    Volume ID: 940177c3-d866-4e5e-9aa0-fc9be94fc0f4
    Status: Started
    Number of Bricks: 2 x 3 = 6
    Transport-type: tcp
    Bricks:
    Brick1: 192.168.121.168:/var/lib/heketi/mounts/vg_3fa141bf2d09d30b899f2f260c494376/brick_9fb4a5206bdd8ac70170d00f304f99a5/brick
    Brick2: 192.168.121.172:/var/lib/heketi/mounts/vg_7ad961dbd24e16d62cabe10fd8bf8909/brick_dae2422d518915241f74fd90b426a379/brick
    Brick3: 192.168.121.233:/var/lib/heketi/mounts/vg_5c6428c439eb6686c5e4cee56532bacf/brick_b3768ba8e80863724c9ec42446ea4812/brick
    Brick4: 192.168.121.172:/var/lib/heketi/mounts/vg_7ad961dbd24e16d62cabe10fd8bf8909/brick_0a13958525c6343c4a7951acec199da0/brick
    Brick5: 192.168.121.168:/var/lib/heketi/mounts/vg_17fbc98d84df86756e7826326fb33aa4/brick_af42af87ad87ab4f01e8ca153abbbee9/brick
    Brick6: 192.168.121.233:/var/lib/heketi/mounts/vg_5c6428c439eb6686c5e4cee56532bacf/brick_ef41e04ca648efaf04178e64d25dbdcb/brick
    Options Reconfigured:
    performance.readdir-ahead: on
  • 要获得卷状态,请执行以下命令:

    # gluster volume status <volname>

    例如:

    # gluster volume status vol_9e86c0493f6b1be648c9deee1dc226a6
    
    Status of volume: vol_9e86c0493f6b1be648c9deee1dc226a6
    Gluster process                             TCP Port  RDMA Port  Online  Pid
    ------------------------------------------------------------------------------
    Brick 192.168.121.168:/var/lib/heketi/mounts/v
    g_3fa141bf2d09d30b899f2f260c494376/brick_9f
    b4a5206bdd8ac70170d00f304f99a5/brick        49154     0          Y       3462
    Brick 192.168.121.172:/var/lib/heketi/mounts/v
    g_7ad961dbd24e16d62cabe10fd8bf8909/brick_da
    e2422d518915241f74fd90b426a379/brick        49154     0          Y       115939
    Brick 192.168.121.233:/var/lib/heketi/mounts/v
    g_5c6428c439eb6686c5e4cee56532bacf/brick_b3
    768ba8e80863724c9ec42446ea4812/brick        49154     0          Y       116134
    Brick 192.168.121.172:/var/lib/heketi/mounts/v
    g_7ad961dbd24e16d62cabe10fd8bf8909/brick_0a
    13958525c6343c4a7951acec199da0/brick        49155     0          Y       115958
    Brick 192.168.121.168:/var/lib/heketi/mounts/v
    g_17fbc98d84df86756e7826326fb33aa4/brick_af
    42af87ad87ab4f01e8ca153abbbee9/brick        49155     0          Y       3481
    Brick 192.168.121.233:/var/lib/heketi/mounts/v
    g_5c6428c439eb6686c5e4cee56532bacf/brick_ef
    41e04ca648efaf04178e64d25dbdcb/brick        49155     0          Y       116153
    NFS Server on localhost                     2049      0          Y       116173
    Self-heal Daemon on localhost               N/A       N/A        Y       116181
    NFS Server on node1.example.com                                        2049      0          Y       3501
    Self-heal Daemon on node1.example.com                                  N/A       N/A        Y       3509
    NFS Server on 192.168.121.172                  2049      0          Y       115978
    Self-heal Daemon on 192.168.121.172            N/A       N/A        Y       115986
    
    Task Status of Volume vol_9e86c0493f6b1be648c9deee1dc226a6
    ------------------------------------------------------------------------------
    There are no active volume tasks
  • 要使用快照功能,请在其中一个节点上使用以下命令载入快照模块:

    # modprobe dm_snapshot
    重要

    使用快照的限制

    • 创建快照后,必须仅通过用户可用的快照功能进行访问。这可用于将文件复制到所需位置。
    • 不支持将卷恢复到快照状态,因此不应执行,因为它可能会损坏数据的一致性。
    • 在带有快照的卷上,不得执行卷更改操作(如卷扩展)。
    • 无法对基于 gluster-block 的 PV 进行一致的快照。
  • 要对 gluster 卷进行快照,请执行以下命令:

    # gluster snapshot create <snapname> <volname>

    例如:

    # gluster snapshot create snap1 vol_9e86c0493f6b1be648c9deee1dc226a6
    
    snapshot create: success: Snap snap1_GMT-2016.07.29-13.05.46 created successfully
  • 要列出快照,请执行以下命令:

    # gluster snapshot list

    例如:

    # gluster snapshot list
    
    snap1_GMT-2016.07.29-13.05.46
    snap2_GMT-2016.07.29-13.06.13
    snap3_GMT-2016.07.29-13.06.18
    snap4_GMT-2016.07.29-13.06.22
    snap5_GMT-2016.07.29-13.06.26
  • 要删除快照,请执行以下命令:

    # gluster snap delete <snapname>

    例如:

    # gluster snap delete snap1_GMT-2016.07.29-13.05.46
    
    Deleting snap will erase all the information about the snap. Do you still want to continue? (y/n) y
    snapshot delete: snap1_GMT-2016.07.29-13.05.46: snap removed successfully

    有关管理快照的更多信息,请参阅 https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.5/html-single/administration_guide/index#chap-Managing_Snapshots

  • 您可以将 Red Hat Openshift Container Storage 卷设置为非 Red Hat Openshift Container Storage 远程网站。异地复制使用主从模式。在这里,Red Hat Openshift Container Storage 卷充当 master 卷。要设置异地复制,您必须在 gluster pod 上运行 geo-replication 命令。要进入 gluster pod shell,请执行以下命令:

     # oc rsh <gluster_pod_name> -n <storage_project_name>

    有关设置 geo-replication 的更多信息,请参阅 https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.5/html/administration_guide/chap-managing_geo-replication

  • Brick 多路复用是一种功能,允许将多个 brick 纳入一个进程中。这减少了资源消耗,使您可以运行比以前相同的内存消耗数量更多的 brick。

    从 Container-Native Storage 3.6 中默认启用 brick 多路复用。如果要关闭它,请执行以下命令:

    # gluster volume set all cluster.brick-multiplex off
  • 启用 glusterfs libfuse 中的 auto_unmount 选项确保在 FUSE 服务器终止时卸载该文件系统,方法是运行执行卸载的独立 monitor 进程。

    Openshift 中的 GlusterFS 插件为 gluster 挂载启用 auto_unmount 选项。

2.1. 对节点进行维护

2.1.1. 在维护前需要遵循的步骤

  • 删除 glusterfs 的标签 glusterfs 或等同标签,这是 glusterfs daemonset 的选择器。等待 pod 终止。

    • 运行以下命令来获取 节点选择器

      # oc get ds

      例如:

      # oc get ds
      NAME              DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE
      glusterfs-storage   3         3         3         3            3
                         NODE SELECTOR             AGE
                         glusterfs=storage-host    12d
    • 使用以下命令删除 glusterfs 标签。

      # oc label node <storge_node1> glusterfs-

      例如:

      # oc label node <storge_node1> glusterfs-
      node/<storage_node1> labeled
    • 等待 glusterfs 容器集被终止。使用以下命令进行验证。

      # oc get pods -l glusterfs

      例如:

      # oc get pods -l glusterfs
      NAME                               READY     STATUS     RESTARTS   AGE
      glusterblock-storage-provisioner   1/1       Running    0          7m
      glusterfs-storage-4tc9c            1/1    Terminating   0          5m
      glusterfs-storage-htrfg            1/1       Running    0          1d
      glusterfs-storage-z75bc            1/1       Running    0          1d
      heketi-storage-1-shgrr             1/1       Running    0          1d
  • 使用以下命令使节点不可调度。

    # oc adm manage-node --schedulable=false <storage_node1>

    例如:

    # oc adm manage-node --schedulable=false <storage_node1>
    NAME            STATUS                     ROLES    AGE  VERSION
    storage_node1   Ready,SchedulingDisabled   compute  12d  v1.11.0+d4cacc0
  • 使用以下命令排空节点。

    # oc adm drain --ignore-daemonsets <storage_node1>
    注意

    执行维护和重启(如果需要)

2.1.2. 维护后要遵循的必要步骤

  • 使用以下命令使节点可以调度。

    # oc adm manage-node --schedulable=true <storage_node1>

    例如:

    # oc adm manage-node --schedulable=true <storage_node1>
    NAME       STATUS    ROLES     AGE       VERSION
    node1      Ready     compute   12d       v1.11.0+d4cacc0
  • 添加标签 glusterfs 或同等标签,这是 glusterfs daemonset 的选择器。等待 Pod 准备就绪。

    • 运行以下命令来获取 节点选择器

      # oc get ds

      例如:

      # oc get ds
      NAME               DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE
      glusterfs-storage   3         3         3         3            3
                        NODE SELECTOR            AGE
                        glusterfs=storage-host   12d
    • 使用以上节点选择器和以下命令标记 glusterfs 节点。

      # oc label node <storage_node1> glusterfs=storage-host

      例如:

      # oc label node <storage_node1> glusterfs=storage-host
      node/<storage_node1> labeled
    • 等待 Pod 变为 Ready 状态。

      # oc get pods

      例如:

      # oc get pods
      NAME                                READY     STATUS    RESTARTS   AGE
      glusterblock-storage-provisioner    1/1       Running   0          3m
      glusterfs-storage-4tc9c             0/1       Running   0          50s
      glusterfs-storage-htrfg             1/1       Running   0          1d
      glusterfs-storage-z75bc             1/1       Running   0          1d
      heketi-storage-1-shgrr              1/1       Running   0          1d
    • 等待 Pod 处于 1/1 Ready 状态。

      例如:

      # oc get pods
      NAME                                 READY     STATUS    RESTARTS   AGE
      glusterblock-storage-provisioner     1/1       Running   0          3m
      glusterfs-storage-4tc9c              1/1       Running   0          58s
      glusterfs-storage-htrfg              1/1       Running   0          1d
      glusterfs-storage-z75bc              1/1       Running   0          1d
      heketi-storage-1-shgrr               1/1       Running   0          1d
  • 等待修复完成,使用 oc rsh 获取 glusterfs pod 的 shell 并使用下列命令监控修复,并等待 条目数量 为零(0)。

    # for each_volume in gluster volume list; do gluster volume heal $each_volume info ; done

    例如:

    # for each_volume in gluster volume list; do gluster volume heal $each_volume info ; done
    Brick 10.70.46.210:/var/lib/heketi/mounts/vg_64e90b4b94174f19802a8026f652f6d7/brick_564f7725cef192f0fd2ba1422ecbf590/brick
    Status: Connected
    Number of entries: 0
    
    Brick 10.70.46.243:/var/lib/heketi/mounts/vg_4fadbf84bbc67873543472655e9660ec/brick_9c9c8c64c48d24c91948bc810219c945/brick
    Status: Connected
    Number of entries: 0
    
    Brick 10.70.46.224:/var/lib/heketi/mounts/vg_9fbaf0c06495e66f5087a51ad64e54c3/brick_75e40df81383a03b1778399dc342e794/brick
    Status: Connected
    Number of entries: 0
    
    Brick 10.70.46.224:/var/lib/heketi/mounts/vg_9fbaf0c06495e66f5087a51ad64e54c3/brick_e0058f65155769142cec81798962b9a7/brick
    Status: Connected
    Number of entries: 0
    
    Brick 10.70.46.210:/var/lib/heketi/mounts/vg_64e90b4b94174f19802a8026f652f6d7/brick_3cf035275dc93e0437fdfaea509a3a44/brick
    Status: Connected
    Number of entries: 0
    
    Brick 10.70.46.243:/var/lib/heketi/mounts/vg_4fadbf84bbc67873543472655e9660ec/brick_2cfd11ce587e622fe800dfaec101e463/brick
    Status: Connected
    Number of entries: 0

部分 II. 操作

第 3 章 创建持久性卷

OpenShift Container Platform 集群可以使用 GlusterFS 为持久性存储 置备。

持久性卷(PV)和持久性卷声明(PVC)可以在单个项目间共享卷。虽然 PV 定义中包含的 GlusterFS 相关信息也可以直接在容器集定义中定义,但这样做不会将卷创建为不同的集群资源,从而使卷更容易冲突。

按 Labels 和 Selectors 绑定 PV

标签(label)是一个 OpenShift Container Platform 功能,作为对象规格的一部分支持用户定义的标签(键值对)。其主要目的是通过在它们中定义相同的标签来启用对象的任意分组。这些标签可以按照选择器来定向,以匹配具有指定标签值的所有对象。它是我们利用此功能使 PVC 绑定到我们的 PV。

您可以使用标签来标识卷之间共享的常见属性或特征。例如,您可以定义 gluster 卷,使其具有名为 storage-tier _ 的自定义属性(key),其值为 _gold _assigned。声明将能够选择带有 _storage-tier=gold 的 PV,以匹配此 PV。

第 3.1 节 “文件存储” 中提供了在基于文件的存储中置备卷的详情。同样,第 3.2 节 “块存储” 中提供了在基于块的存储中置备卷的详情。

3.1. 文件存储

文件存储也称为文件级或基于文件的存储,以分层结构存储数据。数据保存在文件和文件夹中,并向系统显示存储它并以相同的格式检索数据。您可以为基于文件的存储静态或动态置备卷。

3.1.1. 卷的静态置备

要在 OpenShift 和 Kubernetes 中启用持久卷支持,必须创建几个端点和服务。

注意

如果使用(默认)Ansible 安装程序部署 OpenShift Container Storage,则不需要以下步骤

示例 glusterfs 端点文件(sample-gluster-endpoints.yaml)和示例 glusterfs 服务文件(sample-gluster-service.yaml)位于* /usr/share/heketi/templates/*directory。

从 /usr/share/heketi/templates/templates/ 目录不会为此类部署创建示例端点和服务文件供 ansible 部署使用。

注意

确保将示例 glusterfs 端点文件 / glusterfs 服务文件复制到您选择的位置,然后编辑复制的文件。例如:

# cp /usr/share/heketi/templates/sample-gluster-endpoints.yaml /<_path_>/gluster-endpoints.yaml
  1. 要指定您要创建的端点,请使用基于环境创建的端点更新复制的 sample-gluster-endpoints.yaml 文件。每个红帽 Gluster 存储受信存储池都需要自己的端点,其具有受信存储池中节点的 IP。

    # cat sample-gluster-endpoints.yaml
    apiVersion: v1
    kind: Endpoints
    metadata:
      name: glusterfs-cluster
    subsets:
      - addresses:
          - ip: 192.168.10.100
        ports:
          - port: 1
      - addresses:
          - ip: 192.168.10.101
        ports:
          - port: 1
      - addresses:
          - ip: 192.168.10.102
        ports:
    - port: 1
    名称
    端点的名称。
    ip
    Red Hat Gluster Storage 节点的 IP 地址。
  2. 执行以下命令来创建端点:

    # oc create -f <name_of_endpoint_file>

    例如:

    # oc create -f sample-gluster-endpoints.yaml
    endpoints "glusterfs-cluster" created
  3. 要验证端点是否已创建,请执行以下命令:

    # oc get endpoints

    例如:

    # oc get endpoints
    NAME                       ENDPOINTS                                                     AGE
    storage-project-router     192.168.121.233:80,192.168.121.233:443,192.168.121.233:1936   2d
    glusterfs-cluster          192.168.121.168:1,192.168.121.172:1,192.168.121.233:1         3s
    heketi                     10.1.1.3:8080                                                 2m
    heketi-storage-endpoints   192.168.121.168:1,192.168.121.172:1,192.168.121.233:1         3m
  4. 执行以下命令创建 gluster 服务:

    # oc create -f <name_of_service_file>

    例如:

    # cat sample-gluster-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: glusterfs-cluster
    spec:
      ports:
    - port: 1
    # oc create -f sample-gluster-service.yaml
    service "glusterfs-cluster" created
  5. 要验证该服务是否已创建,请执行以下命令:

    # oc get service

    例如:

    # oc get service
    NAME                       CLUSTER-IP      EXTERNAL-IP   PORT(S)                   AGE
    storage-project-router     172.30.94.109   <none>        80/TCP,443/TCP,1936/TCP   2d
    glusterfs-cluster          172.30.212.6    <none>        1/TCP                     5s
    heketi                     172.30.175.7    <none>        8080/TCP                  2m
    heketi-storage-endpoints   172.30.18.24    <none>        1/TCP                     3m
    注意

    必须为每个需要持久存储的项目创建端点和服务。

  6. 从 GlusterFS 创建一个带有 Replica 3 的 100G 持久性卷,并将描述此卷的持久卷规格输出到文件 pv001.json:

    $ heketi-cli volume create --size=100 --persistent-volume-file=pv001.json
    cat pv001.json
    {
      "kind": "PersistentVolume",
      "apiVersion": "v1",
      "metadata": {
        "name": "glusterfs-f8c612ee",
        "creationTimestamp": null
      },
      "spec": {
        "capacity": {
          "storage": "100Gi"
        },
        "glusterfs": {
          "endpoints": "TYPE ENDPOINT HERE",
          "path": "vol_f8c612eea57556197511f6b8c54b6070"
        },
        "accessModes": [
          "ReadWriteMany"
        ],
        "persistentVolumeReclaimPolicy": "Retain"
      },
      "status": {}
    重要

    您必须手动将 Labels 信息添加到 .json 文件中。

    以下是供参考的示例 YAML 文件:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-storage-project-glusterfs1
      labels:
        storage-tier: gold
    spec:
      capacity:
        storage: 12Gi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      glusterfs:
        endpoints: TYPE END POINTS NAME HERE,
    path: vol_e6b77204ff54c779c042f570a71b1407
    名称
    卷的名称。
    storage
    分配给这个卷的存储量
    glusterfs
    使用的卷类型,在本例中是 glusterfs 插件
    端点
    定义创建受信存储池的端点名称
    路径
    从受信存储池访问的红帽 Gluster 存储卷。
    accessModes
    accessModes 用作与 PV 和 PVC 匹配的标签。它们目前不定义任何形式的访问控制。
    labels
    使用标签来标识卷之间共享的常见属性或特征。在本例中,我们定义了 gluster 卷,使其具有名为 storage-tier 的自定义属性(key),值设为 gold。个声明将能够选择一个带有 storage-tier=gold 的 PV,以匹配此 PV。
    注意
    • heketi-cli 也接受命令行中的端点名称(--persistent-volume-endpoint="TYPE ENDPOINT HERE")。然后,这可以被传送到 oc create -f - 以立即创建持久性卷。
    • 如果环境中有多个 Red Hat Gluster Storage 受信存储池,您可以检查使用 heketi-cli 卷列表 命令创建卷的受信存储池。此命令列出集群名称。然后,您可以相应地更新 pv001.json 文件中的端点信息。
    • 在创建具有副本计数的双节点设置为三个(replica 3)的 Heketi 卷时,Heketi 会显示一个错误"No space",因为没有空格在三个不同的节点上创建包含三个磁盘集。
    • 如果所有 heketi-cli 写操作(ex: volume create, cluster create.etc)失败,且读取操作(例如:拓扑信息,卷 info .etc)可以成功,则 gluster 卷以只读模式运行。
  7. 编辑 pv001.json 文件,然后在端点部分输入端点名称:

    cat pv001.json
    {
      "kind": "PersistentVolume",
      "apiVersion": "v1",
      "metadata": {
        "name": "glusterfs-f8c612ee",
        "creationTimestamp": null,
        "labels": {
          "storage-tier": "gold"
        }
      },
      "spec": {
        "capacity": {
          "storage": "12Gi"
        },
        "glusterfs": {
          "endpoints": "glusterfs-cluster",
          "path": "vol_f8c612eea57556197511f6b8c54b6070"
        },
        "accessModes": [
          "ReadWriteMany"
        ],
        "persistentVolumeReclaimPolicy": "Retain"
      },
      "status": {}
    }
  8. 运行以下命令来创建持久性卷:

    # oc create -f pv001.json

    例如:

    # oc create -f pv001.json
    persistentvolume "glusterfs-4fc22ff9" created
  9. 要验证持久性卷是否已创建,请执行以下命令:

    # oc get pv

    例如:

    # oc get pv
    
    NAME                 CAPACITY   ACCESSMODES   STATUS      CLAIM     REASON    AGE
    glusterfs-4fc22ff9   100Gi      RWX           Available                       4s
  10. 创建持久性卷声明文件。例如:

    # cat pvc.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: glusterfs-claim
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 100Gi
        selector:
          matchLabels:
    storage-tier: gold
  11. 执行以下命令将持久性卷绑定到持久性卷声明:

    # oc create -f pvc.yaml

    例如:

    # oc create -f pvc.yaml
    persistentvolumeclaim"glusterfs-claim" created
  12. 要验证持久性卷和持久性卷声明是否已绑定,请执行以下命令:

    # oc get pv
    # oc get pvc

    例如:

    # oc get pv
    
    NAME                 CAPACITY   ACCESSMODES   STATUS    CLAIM                  REASON    AGE
    glusterfs-4fc22ff9   100Gi      RWX           Bound     storage-project/glusterfs-claim             1m
    # oc get pvc
    
    NAME              STATUS    VOLUME               CAPACITY   ACCESSMODES   AGE
    glusterfs-claim   Bound     glusterfs-4fc22ff9   100Gi      RWX           11s
  13. 现在可在应用程序中使用声明。例如:

    # 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: glusterfs-claim
    # 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

  14. 要验证 pod 是否已创建,请执行以下命令:

    # oc get pods -n <storage_project_name>

    例如:

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

    # oc rsh busybox
    / $ df -h
    Filesystem                Size      Used Available Use% Mounted on
    /dev/mapper/docker-253:0-1310998-81732b5fd87c197f627a24bcd2777f12eec4ee937cc2660656908b2fa6359129
                          100.0G     34.1M     99.9G   0% /
    tmpfs                     1.5G         0      1.5G   0% /dev
    tmpfs                     1.5G         0      1.5G   0% /sys/fs/cgroup
    192.168.121.168:vol_4fc22ff934e531dec3830cfbcad1eeae
                           99.9G     66.1M     99.9G   0% /usr/share/busybox
    tmpfs                     1.5G         0      1.5G   0% /run/secrets
    /dev/mapper/vg_vagrant-lv_root
                           37.7G      3.8G     32.0G  11% /dev/termination-log
    tmpfs                     1.5G     12.0K      1.5G   0% /var/run/secretgit s/kubernetes.io/serviceaccount
注意

如果您在挂载点上遇到权限被拒绝的错误,则参考 Gluster 卷安全性章节,网址为

3.1.2. 卷的动态置备

动态置备可让您将 Red Hat Gluster 存储卷置备到正在运行的应用程序容器中,而无需预获取卷。由于声明请求出现,该卷将动态创建,因此该卷的大小将调配给应用容器。

注意

当使用(默认)Ansible 安装程序和安装过程中创建的默认存储类(glusterfs-storage)部署 OpenShift Container Storage 时,不需要下方概述的步骤。

3.1.2.1. 配置卷的动态置备

要配置卷的动态置备,管理员必须定义描述集群中提供的存储的 StorageClass 对象。创建存储类后,必须先创建用于 heketi 身份验证的机密,然后才能继续创建持久性卷声明。

3.1.2.1.1. 为 Heketi 身份验证创建 Secret

要为 Heketi 身份验证创建 secret,请执行以下命令:

注意

如果在部署 Red Hat Openshift Container Storage 的过程中没有设置 admin-key 值(用于访问 heketi 来获取卷详情的 secret),则可以省略以下步骤。

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

    # echo -n "<key>" | base64

    其中 "key" 是部署 Red Hat Openshift Container Storage 时创建的 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: kubernetes.io/glusterfs
  3. 通过执行以下命令在 Openshift 上注册 secret:

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

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

  1. 要创建存储类执行以下命令:

    # cat > glusterfs-storageclass.yaml
    
    
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: gluster-container
    provisioner: kubernetes.io/glusterfs
    reclaimPolicy: Retain
    parameters:
      resturl: "http://heketi-storage-project.cloudapps.mystorage.com"
      restuser: "admin"
      volumetype: "replicate:3"
      clusterid: "630372ccdc720a92c681fb928f27b53f,796e6db1981f369ea0340913eeea4c9a"
      secretNamespace: "default"
      secretName: "heketi-secret"
      volumeoptions: "client.ssl on, server.ssl on"
      volumenameprefix: "test-vol"
    allowVolumeExpansion: true

    其中,

    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 用户
    VolumeType

    它指定了正在使用的卷类型。

    注意

    distributed-Three-way replication 是唯一支持的卷类型。这包括标准的三向复制卷和仲裁器 2+1。

    clusterid

    它是集群 ID,在置备卷时会供 heketi 使用。它还可以是用逗号分开的集群 ID 列表。这是一个可选参数。

    注意

    要获取集群 ID,请执行以下命令:

    # heketi-cli cluster list
    secretNamespace + secretName

    识别包含与 Gluster REST 服务通信时使用的用户密码的 Secret 实例。所有参数都是可选的。当同时省略 secretNamespace 和 secretName 时,将使用空密码。

    注意

    当持久性卷被动态置备时,Gluster 插件会创建一个名为 gluster-dynamic-<claimname> 的端点和无头服务。当持久卷声明被删除时,此动态端点和服务将自动删除。

    volumeoptions

    这是一个可选参数。它允许您通过将 参数设置为 "client.ssl on, server.ssl" 来创建启用了加密的 glusterfs 卷。有关启用加密的详情,请参考 第 8 章 启用加密

    注意

    如果没有启用加密,请不要在 storageclass 中添加此参数。

    volumenameprefix

    这是一个可选参数。它描述了 heketi 创建的卷的名称。如需更多信息,请参阅 第 3.1.2.1.5 节 “(可选)为持久性卷提供自定义卷名称前缀”

    注意

    此参数的值无法在 storageclass 中包含 _。

    allowVolumeExpansion
    要提高 PV 声明值,请确保将 storageclass 文件中的 allowVolumeExpansion 参数设置为 true。如需更多信息,请参阅 第 3.1.2.1.7 节 “扩展持久性卷声明”
  2. 要将存储类注册到 Openshift,请执行以下命令:

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

    # oc describe storageclass gluster-container
    
    Name: gluster-container
    IsDefaultClass: No
    Annotations: <none>
    Provisioner: kubernetes.io/glusterfs
    Parameters: resturl=http://heketi-storage-project.cloudapps.mystorage.com,restuser=admin,secretName=heketi-secret,secretNamespace=default
    No events.
3.1.2.1.3. 创建持久性卷声明

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

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

    # cat glusterfs-pvc-claim1.yaml
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: claim1
      annotations:
        volume.beta.kubernetes.io/storage-class: gluster-container
    spec:
      persistentVolumeReclaimPolicy: Retain
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
    persistentVolumeReclaimPolicy

    这是一个可选参数。如果此参数设为 "Retain",则底层的持久性卷也会保留,即使删除了对应的持久性卷声明。

    注意

    当 PVC 被删除时,如果 "persistentVolumeReclaimPolicy:" 设置为 "Retain",则底层 heketi 和 gluster 卷不会被删除。要删除卷,您必须使用 heketi cli,然后删除 PV。

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

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

    # oc describe pvc <_claim_name_>

    例如:

    # oc describe pvc claim1
    
    Name: claim1
    Namespace: default
    StorageClass: gluster-container
    Status: Bound
    Volume: pvc-54b88668-9da6-11e6-965e-54ee7551fd0c
    Labels: <none>
    Capacity: 4Gi
    Access Modes: RWO
    No events.
3.1.2.1.4. 验证申索创建

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

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

    # oc get pv,pvc
    
    NAME                                          CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS     CLAIM                    REASON    AGE
    pv/pvc-962aa6d1-bddb-11e6-be23-5254009fc65b   4Gi        RWO           Delete          Bound      storage-project/claim1             3m
    
    NAME         STATUS    VOLUME                                     CAPACITY   ACCESSMODES   AGE
    pvc/claim1   Bound     pvc-962aa6d1-bddb-11e6-be23-5254009fc65b   4Gi        RWO           4m
  2. 要验证端点和服务是否创建在声明创建过程中,请执行以下命令:

    # oc get endpoints,service
    
    NAME                          ENDPOINTS                                            AGE
    ep/storage-project-router     192.168.68.3:443,192.168.68.3:1936,192.168.68.3:80   28d
    ep/gluster-dynamic-claim1     192.168.68.2:1,192.168.68.3:1,192.168.68.4:1         5m
    ep/heketi                     10.130.0.21:8080                                     21d
    ep/heketi-storage-endpoints   192.168.68.2:1,192.168.68.3:1,192.168.68.4:1         25d
    
    NAME                           CLUSTER-IP       EXTERNAL-IP   PORT(S)                   AGE
    svc/storage-project-router     172.30.166.64    <none>        80/TCP,443/TCP,1936/TCP   28d
    svc/gluster-dynamic-claim1     172.30.52.17     <none>        1/TCP                     5m
    svc/heketi                     172.30.129.113   <none>        8080/TCP                  21d
    svc/heketi-storage-endpoints   172.30.133.212   <none>        1/TCP                     25d
3.1.2.1.5. (可选)为持久性卷提供自定义卷名称前缀

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

  • 任何作为 storageclass 文件中的字段值 "volnameprefix" 提供的字符串。
  • 持久性卷声明名称。
  • 项目/命名空间名称。

要设置名称,请确保您已将参数 volumenameprefix 添加到存储类文件中。如需更多信息,请参阅 第 3.1.2.1.2 节 “注册存储类”

注意

此参数的值无法在 storageclass 中包含 _。

要验证是否设置了自定义卷名称前缀,请执行以下命令:

# oc describe pv <pv_name>

例如:

# oc describe pv pvc-f92e3065-25e8-11e8-8f17-005056a55501
Name:            pvc-f92e3065-25e8-11e8-8f17-005056a55501
Labels:          <none>
Annotations:     Description=Gluster-Internal: Dynamically provisioned PV
                 gluster.kubernetes.io/heketi-volume-id=027c76b24b1a3ce3f94d162f843529c8
                 gluster.org/type=file
                 kubernetes.io/createdby=heketi-dynamic-provisioner
                 pv.beta.kubernetes.io/gid=2000
                 pv.kubernetes.io/bound-by-controller=yes
                 pv.kubernetes.io/provisioned-by=kubernetes.io/glusterfs
                 volume.beta.kubernetes.io/mount-options=auto_unmount
StorageClass:    gluster-container-prefix
Status:          Bound
Claim:           glusterfs/claim1
Reclaim Policy:  Delete
Access Modes:    RWO
Capacity:        1Gi
Message:
Source:
    Type:           Glusterfs (a Glusterfs mount on the host that shares a pod's lifetime)
    EndpointsName:  glusterfs-dynamic-claim1
    Path:           test-vol_glusterfs_claim1_f9352e4c-25e8-11e8-b460-005056a55501
    ReadOnly:       false
Events:             <none>

Path 的值会将自定义卷名称前缀附加到命名空间和声明名称,本例中为 "test-vol"。

3.1.2.1.6. 在 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
    storage-project-router-1-at7tf      1/1       Running        0          13d
    busybox                             1/1       Running        0          8s
    glusterfs-dc-192.168.68.2-1-hu28h   1/1       Running        0          7d
    glusterfs-dc-192.168.68.3-1-ytnlg   1/1       Running        0          7d
    glusterfs-dc-192.168.68.4-1-juqcq   1/1       Running        0          13d
    heketi-1-9r47c                      1/1       Running        0          13d
  3. 要验证持久性卷是否挂载到容器中,请执行以下命令:

    # oc rsh busybox
    / $ df -h
    Filesystem                Size      Used Available Use% Mounted on
    /dev/mapper/docker-253:0-666733-38050a1d2cdb41dc00d60f25a7a295f6e89d4c529302fb2b93d8faa5a3205fb9
                             10.0G     33.8M      9.9G   0% /
    tmpfs                    23.5G         0     23.5G   0% /dev
    tmpfs                    23.5G         0     23.5G   0% /sys/fs/cgroup
    /dev/mapper/rhgs-root
                             17.5G      3.6G     13.8G  21% /run/secrets
    /dev/mapper/rhgs-root
                             17.5G      3.6G     13.8G  21% /dev/termination-log
    /dev/mapper/rhgs-root
                             17.5G      3.6G     13.8G  21% /etc/resolv.conf
    /dev/mapper/rhgs-root
                             17.5G      3.6G     13.8G  21% /etc/hostname
    /dev/mapper/rhgs-root
                             17.5G      3.6G     13.8G  21% /etc/hosts
    shm                      64.0M         0     64.0M   0% /dev/shm
    192.168.68.2:vol_5b05cf2e5404afe614f8afa698792bae
                              4.0G     32.6M      4.0G   1% /usr/share/busybox
    tmpfs                    23.5G     16.0K     23.5G   0% /var/run/secrets/kubernetes.io/serviceaccount
    tmpfs                    23.5G         0     23.5G   0% /proc/kcore
    tmpfs                    23.5G         0     23.5G   0% /proc/timer_stats
3.1.2.1.7. 扩展持久性卷声明

要提高 PV 声明值,请确保将 storageclass 文件中的 allowVolumeExpansion 参数设置为 true。更多信息请参阅: 第 3.1.2.1.2 节 “注册存储类”

注意

您还可以通过 OpenShift Container Platform 3.11 Web 控制台重新定义 PV 的大小。

要扩展持久性卷声明值,请执行以下命令:

  1. 要检查现有的持久性卷大小,在应用程序 pod 中执行以下命令:

    # oc rsh busybox
    # df -h

    例如:

    # oc rsh busybox
    / # df -h
    Filesystem                Size      Used Available Use% Mounted on
    /dev/mapper/docker-253:0-100702042-0fa327369e7708b67f0c632d83721cd9a5b39fd3a7b3218f3ff3c83ef4320ce7
                             10.0G     34.2M      9.9G   0% /
    tmpfs                    15.6G         0     15.6G   0% /dev
    tmpfs                    15.6G         0     15.6G   0% /sys/fs/cgroup
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /dev/termination-log
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /run/secrets
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /etc/resolv.conf
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /etc/hostname
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /etc/hosts
    shm                      64.0M         0     64.0M   0% /dev/shm
    10.70.46.177:test-vol_glusterfs_claim10_d3e15a8b-26b3-11e8-acdf-005056a55501
                              2.0G     32.6M      2.0G   2% /usr/share/busybox
    tmpfs                    15.6G     16.0K     15.6G   0% /var/run/secrets/kubernetes.io/serviceaccount
    tmpfs                    15.6G         0     15.6G   0% /proc/kcore
    tmpfs                    15.6G         0     15.6G   0% /proc/timer_list
    tmpfs                    15.6G         0     15.6G   0% /proc/timer_stats
    tmpfs                    15.6G         0     15.6G   0% /proc/sched_debug
    tmpfs                    15.6G         0     15.6G   0% /proc/scsi
    tmpfs                    15.6G         0     15.6G   0% /sys/firmware

    在本例中,持久性卷大小为 2Gi。

  2. 要编辑持久性卷声明值,请执行以下命令并编辑以下存储参数:

    resources:
        requests:
          storage: <storage_value>
    # oc edit pvc <claim_name>

    例如,将存储值扩展到 20Gi:

    # oc edit pvc claim3
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        pv.kubernetes.io/bind-completed: "yes"
        pv.kubernetes.io/bound-by-controller: "yes"
        volume.beta.kubernetes.io/storage-class: gluster-container2
        volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/glusterfs
      creationTimestamp: 2018-02-14T07:42:00Z
      name: claim3
      namespace: storage-project
      resourceVersion: "283924"
      selfLink: /api/v1/namespaces/storage-project/persistentvolumeclaims/claim3
      uid: 8a9bb0df-115a-11e8-8cb3-005056a5a340
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      volumeName: pvc-8a9bb0df-115a-11e8-8cb3-005056a5a340
    status:
      accessModes:
      - ReadWriteOnce
      capacity:
        storage: 2Gi
    phase: Bound
  3. 要验证,在 app pod 中执行以下命令:

    # oc rsh busybox
    / # df -h

    例如:

    # oc rsh busybox
    # df -h
    Filesystem                Size      Used Available Use% Mounted on
    /dev/mapper/docker-253:0-100702042-0fa327369e7708b67f0c632d83721cd9a5b39fd3a7b3218f3ff3c83ef4320ce7
                             10.0G     34.2M      9.9G   0% /
    tmpfs                    15.6G         0     15.6G   0% /dev
    tmpfs                    15.6G         0     15.6G   0% /sys/fs/cgroup
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /dev/termination-log
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /run/secrets
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /etc/resolv.conf
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /etc/hostname
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /etc/hosts
    shm                      64.0M         0     64.0M   0% /dev/shm
    10.70.46.177:test-vol_glusterfs_claim10_d3e15a8b-26b3-11e8-acdf-005056a55501
                             20.0G     65.3M     19.9G   1% /usr/share/busybox
    tmpfs                    15.6G     16.0K     15.6G   0% /var/run/secrets/kubernetes.io/serviceaccount
    tmpfs                    15.6G         0     15.6G   0% /proc/kcore
    tmpfs                    15.6G         0     15.6G   0% /proc/timer_list
    tmpfs                    15.6G         0     15.6G   0% /proc/timer_stats
    tmpfs                    15.6G         0     15.6G   0% /proc/sched_debug
    tmpfs                    15.6G         0     15.6G   0% /proc/scsi
    tmpfs                    15.6G         0     15.6G   0% /sys/firmware

    观察到大小已从 2Gi(早期)改为 20Gi。

3.1.2.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.
    • 要验证端点是否已删除,请执行以下命令:

      # oc get endpoints <endpointname>

      例如:

      # oc get endpoints gluster-dynamic-claim1
      No resources found.
    • 要验证该服务是否已删除,请执行以下命令:

      # oc get service <servicename>

      例如:

      # oc get service gluster-dynamic-claim1
      No resources found.

3.1.3. 卷安全性

卷以 UID/GID 为 0(root) 提供。对于要写入卷的应用容器集,其 UID/GID 应当为 0(root)。使用卷安全功能,管理员现在可以创建一个唯一 GID 的卷,而应用程序 pod 可使用这种唯一 GID 写入卷

静态置备卷的卷安全性

要使用 GID 创建静态置备的卷,请执行以下命令:

$ heketi-cli volume create --size=100 --persistent-volume-file=pv001.json --gid=590

在以上命令中,会创建一个 GID 为 590 的 100G 持久卷,描述此卷规格的输出将添加到 pv001.json 文件中。

有关使用这个 GID 访问卷的详情,请参考 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html/configuring_clusters/persistent-storage-examples#install-config-storage-examples-gluster-example

动态置备卷的卷安全性

动态置备程序增加了两个新参数,即 gidMingidMax。这些值允许管理员为存储类中的卷配置 GID 范围。要设置 GID 值并为动态置备的卷提供卷安全性,请执行以下命令:

  1. 使用 GID 值创建存储类文件。例如:

    # cat glusterfs-storageclass.yaml
    
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: gluster-container
    provisioner: kubernetes.io/glusterfs
    parameters:
      resturl: "http://heketi-storage-project.cloudapps.mystorage.com"
      restuser: "admin"
      secretNamespace: "default"
      secretName: "heketi-secret"
      gidMin: "2000"
    gidMax: "4000"
    注意

    如果没有提供 gidMingidMax 值,则动态置备的卷将在 2000 和 2147483647 之间拥有 GID。

  2. 创建持久性卷声明。更多信息请参阅: 第 3.1.2.1.3 节 “创建持久性卷声明”
  3. 在 pod 中使用声明。确保此 pod 是无特权的。更多信息请参阅: 第 3.1.2.1.6 节 “在 Pod 中使用 Claim”
  4. 要验证 GID 是否在指定的范围内,请执行以下命令:

    # oc rsh busybox
    $ id

    例如:

    $ id
    uid=1000060000 gid=0(root) groups=0(root),2001

    其中 2001 在上面的输出中,是持久性卷分配的 GID,它位于存储类中指定的范围内。您可以使用分配的 GID 写入此卷。

    注意

    删除持久性卷声明后,从池中释放持久性卷的 GID。

3.1.4. 在 heketi 中进行设备分层

heketi 支持在放置卷时使用简单的标记匹配方法,以使用某些设备。用户需要指定特定设备的键值对,并创建带有卷选项键 user.heketi.device-tag-match 键和一个简单的匹配规则的新卷。

步骤

  1. 在 heketi 设备上应用所需的标签。

    # heketi-cli device settags <device-name> <key>:<value>

    示例:

    # heketi-cli device settags 1fe1b83e5660efb53cc56433cedf7771 disktype:hdd
  2. 从设备中删除应用的标签。

    # heketi-cli device rmtags <device-name> <key>

    示例:

    # heketi-cli device rmtags 1fe1b83e5660efb53cc56433cedf7771 disktype
  3. 验证设备上添加的标签。

    # heketi-cli device info <device-name>

    示例:

    # heketi-cli device info 1fe1b83e5660efb53cc56433cedf7771

    输出示例:

    Device Id: 1fe1b83e5660efb53cc56433cedf7771
    State: online
    Size (GiB): 49
    Used (GiB): 41
    Free (GiB): 8
    Create Path: /dev/vdc
    Physical Volume UUID: GpAnb4-gY8e-p5m9-0UU3-lV3J-zQWY-zFgO92
    Known Paths: /dev/disk/by-id/virtio-bf48c436-04a9-48ed-9 /dev/disk/by-path/pci-0000:00:08.0 /dev/disk/by-path/virtio-pci-0000:00:08.0 /dev/vdc
    Tags:
      disktype: hdd    ---> added tag
  4. 使用带标记的设备创建卷。

     # heketi-cli volume create --size=<size in GiB> --gluster-volume-options'user.heketi.device-tag-match <key>=<value>’
    重要
    • 在创建卷时,您必须传递一个新的卷选项 user.heketi.device-tag-match,其中 选项的值是一个标签键,后跟 "=" 或 "!=",再加上一个标签值。
    • 所有匹配项都是完全匹配且区分大小写,而且只能指定一个 device-tag-match。

    示例:

    # heketi-cli volume create --size=5 --gluster-volume-options 'user.heketi.device-tag-match disktype=hdd’
    注意

    创建了卷后,卷选项列表就会修复。tag-match 规则与卷元数据保留,用于卷扩展和 brick 替换目的。

  5. 创建存储类。

    • 创建仅在硬盘上创建卷的存储类。

      # cat hdd-storageclass.yaml
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        annotations:
          storageclass.kubernetes.io/is-default-class: "false"
        name: glusterfs-storage-hdd
        selfLink: /apis/storage.k8s.io/v1/storageclasses/glusterfs-storage
      parameters:
        resturl: http://heketi-storage.glusterfs.svc:8080
        restuser: admin
        secretName: heketi-storage-admin-secret
        secretNamespace: glusterfs
        volumeoptions: "user.heketi.device-tag-match disktype=hdd"
      provisioner: kubernetes.io/glusterfs
      reclaimPolicy: Delete
      volumeBindingMode: Immediate
    • 创建一个存储类,它只使用更可靠的状态存储创建卷。

      重要

      您必须使用负标签匹配规则来排除硬盘设备。

      # cat sdd-storageclass.yaml
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        annotations:
          storageclass.kubernetes.io/is-default-class: "false"
        name: glusterfs-storage-dd
        selfLink: /apis/storage.k8s.io/v1/storageclasses/glusterfs-storage
      parameters:
        resturl: http://heketi-storage.glusterfs.svc:8080
        restuser: admin
        secretName: heketi-storage-admin-secret
        secretNamespace: glusterfs
        volumeoptions: "user.heketi.device-tag-match disktype!=hdd"
      provisioner: kubernetes.io/glusterfs
      reclaimPolicy: Delete
      volumeBindingMode: Immediate

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

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 中使用声明。

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

3.2.2. 替换块存储中的块

如果要替换来自资源不足或有故障的节点的块,它可以被替换为到新节点。

重要

要使用新的 IP 更新 Gluster 块 PV,在节点替换中引用 https://access.redhat.com/solutions/5042501

执行以下命令:

  1. 执行以下命令从 heketi 获取区域和集群信息

    # heketi-cli topology info --user=<user> --secret=<user key>
    --user
    heketi 用户
    --secret
    指定用户的 secret key
  2. 获取集群 ID 和区 ID 后,请参阅添加新节点来添加新节点。https://access.redhat.com/documentation/en-us/red_hat_openshift_container_storage/3.11/html-single/operations_guide/index#sect_Adding_New_Nodes
  3. 执行以下命令添加设备

    # heketi-cli device add --name=<device name> --node=<node id> --user=<user> --secret=<user key>
    --name
    要添加的设备名称
    --node
    新添加的节点 ID

    例如:

    # heketi-cli device add --name=/dev/vdc --node=2639c473a2805f6e19d45997bb18cb9c --user=admin --secret=adminkey
    Device added successfully
  4. 在新节点及其关联的设备添加到 heketi 后,可以从 heketi 中移除错误或不需要的节点

    要从 heketi 中删除任何节点,请按照这个工作流操作:

    • 节点禁用(通过下下下放置节点来允许节点使用)
    • 节点替换(从 Heti 中删除节点及其所有关联设备)
    • 设备删除(从 Heketi 节点中删除设备)
    • 节点删除(从 Heketi 管理中删除节点)
  5. 执行以下命令从 heketi 获取节点列表

    #heketi-cli node list --user=<user> --secret=<user key>

    例如:

    # heketi-cli node list --user=admin --secret=adminkey
    Id:05746c562d6738cb5d7de149be1dac04    Cluster:607204cb27346a221f39887a97cf3f90
    Id:ab37fc5aabbd714eb8b09c9a868163df    Cluster:607204cb27346a221f39887a97cf3f90
    Id:c513da1f9bda528a9fd6da7cb546a1ee    Cluster:607204cb27346a221f39887a97cf3f90
    Id:e6ab1fe377a420b8b67321d9e60c1ad1    Cluster:607204cb27346a221f39887a97cf3f90
  6. 执行以下命令获取节点的节点信息,必须从 heketi 中删除:

    # heketi-cli node info <nodeid> --user=<user> --secret=<user key>

    例如:

    # heketi-cli node info c513da1f9bda528a9fd6da7cb546a1ee --user=admin --secret=adminkey
    Node Id: c513da1f9bda528a9fd6da7cb546a1ee
    State: online
    Cluster Id: 607204cb27346a221f39887a97cf3f90
    Zone: 1
    Management Hostname: dhcp43-171.lab.eng.blr.redhat.com
    Storage Hostname: 10.70.43.171
    Devices:
    Id:3a1e0717e6352a8830ab43978347a103   Name:/dev/vdc            State:online    Size (GiB):499     Used (GiB):100     Free (GiB):399     Bricks:1
    Id:89a57ace1c3184826e1317fef785e6b7   Name:/dev/vdd            State:online    Size (GiB):499     Used (GiB):10      Free (GiB):489     Bricks:5
  7. 执行以下命令禁止节点被 heketi。这使得节点离线:

    # heketi-cli node disable <node-id> --user=<user> --secret=<user key>

    例如:

    # heketi-cli node disable ab37fc5aabbd714eb8b09c9a868163df --user=admin --secret=adminkey
    Node ab37fc5aabbd714eb8b09c9a868163df is now offline
  8. 执行以下命令从 Heketi 中删除节点及其所有关联设备:

    #heketi-cli node remove <node-id> --user=<user> --secret=<user key>

    例如:

    # heketi-cli node remove ab37fc5aabbd714eb8b09c9a868163df --user=admin --secret=adminkey
    Node ab37fc5aabbd714eb8b09c9a868163df is now removed
  9. 执行以下命令从 heketi 节点中删除设备:

    # heketi-cli device delete <device-id> --user=<user> --secret=<user key>

    例如:

    # heketi-cli device delete 0fca78c3a94faabfbe5a5a9eef01b99c --user=admin --secret=adminkey
    Device 0fca78c3a94faabfbe5a5a9eef01b99c deleted
  10. 执行以下命令从 Heketi 管理中删除节点:

    #heketi-cli node delete <nodeid> --user=<user> --secret=<user key>

    例如:

    # heketi-cli node delete ab37fc5aabbd714eb8b09c9a868163df --user=admin --secret=adminkey
    Node ab37fc5aabbd714eb8b09c9a868163df deleted
  11. 在其中一个 gluster pod 上执行以下命令将故障节点替换为新节点:

    1. 执行以下命令获取托管在 block-hosting-volume 下的块卷列表:

      # gluster-block list <block-hosting-volume> --json-pretty
    2. 执行以下命令以获取托管块卷的服务器列表,还要保存 GBIDPASSWORD 值供以后使用:

      # gluster-block info <block-hosting-volume>/<block-volume> --json-pretty
    3. 执行以下命令将有问题的节点替换为新节点:

      # gluster-block replace <volname/blockname> <old-node> <new-node> [force]

      例如:

      {
        "NAME":"block",
        "CREATE SUCCESS":"192.168.124.73",
        "DELETE SUCCESS":"192.168.124.63",
        "REPLACE PORTAL SUCCESS ON":[
          "192.168.124.79"
        ],
        "RESULT":"SUCCESS"
      }
      
      Note: If the old node is down and does not come up again then you can force replace:
      gluster-block replace sample/block 192.168.124.63 192.168.124.73 force --json-pretty
      
      {
        "NAME":"block",
        "CREATE SUCCESS":"192.168.124.73",
        "DELETE FAILED (ignored)":"192.168.124.63",
        "REPLACE PORTAL SUCCESS ON":[
          "192.168.124.79"
        ],
        "RESULT":"SUCCESS"
      }
    注意

    只有在被替换的块仍在使用时才执行后续步骤。

  12. 如果块卷当前未挂载,请跳过这一步。如果应用程序正在使用块卷,则需要在启动器一端重新加载映射程序设备。

    1. 确定 initiator 节点和 targetname:

      查找 initiator 节点:

      # oc get pods -o wide | grep <podname>

      其中 podname 是挂载 blockvolume 的 pod 的名称。

      例如:

      # oc get pods -o wide | grep cirros1 cirros1-1-x6b5n   1/1       Running   0          1h        10.130.0.5     dhcp46-31.lab.eng.blr.redhat.com    <none>

      找到 targetname:

      # oc describe pv <pv_name> | grep IQN

      例如:

      # oc describe pv pvc-c50c69db-5f76-11ea-b27b-005056b253d1 | grep IQN
        IQN: iqn.2016-12.org.gluster-block:87ffbcf3-e21e-4fa5-bd21-7db2598e8d3f
    2. 在 initiator 节点上执行以下命令查找映射程序设备:

      # mount | grep <targetname>
    3. 重新载入映射程序设备:

      # multipath -r mpathX

      例如:

      # mount | grep iqn.2016-12.org.gluster-block:d6d18f43-8a74-4b2c-a5b7-df1fa3f5bc9a/dev/mapper/mpatha on /var/lib/origin/openshift.local.volumes/plugins/kubernetes.io/iscsi/iface-default/192.168.124.63:3260-iqn.2016-12.org.gluster-block:d6d18f43-8a74-4b2c-a5b7-df1fa3f5bc9a-lun-0 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
      # multipath -r mpatha
  13. 通过在 initiator 中执行以下命令注销旧的门户:

    # iscsiadm -m node -T <targetname> -p <old node> -u

    例如:

    # iscsiadm -m node -T iqn.2016-12.org.gluster-block:d6d18f43-8a74-4b2c-a5b7-df1fa3f5bc9a -p 192.168.124.63 -u
    Logging out of session [sid: 8, target: iqn.2016-12.org.gluster-block:d6d18f43-8a74-4b2c-a5b7-df1fa3f5bc9a, portal: 192.168.124.63,3260]
    Logout of [sid: 8, target: iqn.2016-12.org.gluster-block:d6d18f43-8a74-4b2c-a5b7-df1fa3f5bc9a, portal: 192.168.124.63,3260] successful.
  14. 要重新发现新节点,请执行以下命令:

    # iscsiadm -m discovery -t st -p <new node>

    例如:

    # iscsiadm -m discovery -t st -p 192.168.124.73
    192.168.124.79:3260,1 iqn.2016-12.org.gluster-block:d6d18f43-8a74-4b2c-a5b7-df1fa3f5bc9a
    192.168.124.73:3260,2 iqn.2016-12.org.gluster-block:d6d18f43-8a74-4b2c-a5b7-df1fa3f5bc9a
  15. 通过执行以下操作登录到新门户:

    1. 更新身份验证凭据(从第 11ii 步中使用 GBID 和 PASSWORD)

      # iscsiadm -m node -T <targetname> -o update -n node.session.auth.authmethod -v CHAP -n node.session.auth.username -v <GBID> -n node.session.auth.password -v <PASSWORD> -p <new node ip>
    2. 登录到新门户

      # iscsiadm -m node -T <targetname> -p <new node ip> -l

      例如:

      # iscsiadm -m node -T iqn.2016-12.org.gluster-block:d6d18f43-8a74-4b2c-a5b7-df1fa3f5bc9a -o update -n node.session.auth.authmethod -v CHAP -n node.session.auth.username -v d6d18f43-8a74-4b2c-a5b7-df1fa3f5bc9a -n node.session.auth.password -v a6a9081f-3d0d-4e8b-b9b0-d2be703b455d -p 192.168.124.73
      # iscsiadm -m node -T iqn.2016-12.org.gluster-block:d6d18f43-8a74-4b2c-a5b7-df1fa3f5bc9a -p 192.168.124.73 -l
  16. 要验证启用的主机卷是否已替换并成功运行,请在 initiator 中执行以下命令:

    # ll /dev/disk/by-path/ip-* | grep <targetname> | grep <“new node ip”>

3.2.3. 块卷扩展

您可以扩展块持久性卷声明,以增加应用程序 pod 上的存储量。执行此操作有两种方法:重新调整大小和在线大小。

3.2.3.1. 离线调整大小

  1. 在扩展块 PVC 之前,请确保块托管卷有足够大小。

    1. 要获得 PVC 的 Heketi 块卷 ID,请在主 OCP 节点上执行以下命令:

      # oc get pv $(oc get pvc <PVC-NAME> --no-headers -o=custom-columns=:.spec.volumeName) -o=custom-columns=:.metadata.annotations."gluster\.org/volume-id"
    2. 要获得块卷 ID,请执行以下命令:

      # heketi-cli blockvolume info <block-volume-id>
    3. 要获得块托管卷信息,请执行以下命令:

      # heketi-cli volume info <block-hosting-volume-id>
      注意

      确定您有足够的可用大小。

  2. 关闭应用容器集。
  3. 要通过 heketi-cli 扩展块卷,请执行以下命令:

    # heketi-cli blockvolume expand <block-volume-id> --new-size=<net-new-size>

    例如:

    # heketi-cli blockvolume expand d911d4bcfd4f11bf07b9688a4798b5dc --new-size=7
    Name: blk_glusterfs_claim2_fc40d362-aaf9-11ea-bb32-0a580a820004
    Size: 7
    UsableSize: 7
    Volume Id: d911d4bcfd4f11bf07b9688a4798b5dc
    Cluster Id: 8d1656d29fb8dc6780388cf797351a6d
    Hosts: [10.70.53.185 10.70.53.203 10.70.53.198]
    IQN: iqn.2016-12.org.gluster-block:8ce8eb4c-4951-4777-9b42-244b7ea525cd
    LUN: 0
    Hacount: 3
    Username: 8ce8eb4c-4951-4777-9b42-244b7ea525cd
    Password: b83a74be-df90-4fd7-b1a1-928fdcfed8c4
    Block Hosting Volume: 2224ac1da64c1737604456a1f511574e
    注意

    展开 输出中,确保 SizeUsableSize 匹配。当大小和 Usable Size 匹配时,可以执行第 4 到 8 步。

  4. PVC-NAME 替换为您的 PVC,并创建一个作业来刷新块卷大小。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: refresh-block-size
    spec:
      completions: 1
      template:
        spec:
          containers:
            - image: rhel7
              env:
                - name: HOST_ROOTFS
                  value: "/rootfs"
                - name: EXEC_ON_HOST
                  value: "nsenter --root=$(HOST_ROOTFS) nsenter -t 1 -m"
              command: ['sh', '-c', 'echo -e "# df -Th /mnt" && df -Th /mnt &&
                DEVICE=$(df --output=source /mnt | sed -e /^Filesystem/d) &&
                MOUNTPOINT=$($EXEC_ON_HOST lsblk $DEVICE -n -o MOUNTPOINT) &&
                $EXEC_ON_HOST xfs_growfs $MOUNTPOINT > /dev/null &&
                echo -e "\n# df -Th /mnt" && df -Th /mnt']
              name: rhel7
              volumeMounts:
                - mountPath: /mnt
                  name: block-pvc
                - mountPath: /dev
                  name: host-dev
                - mountPath: /rootfs
                  name: host-rootfs
              securityContext:
                privileged: true
          volumes:
            - name: block-pvc
              persistentVolumeClaim:
                claimName: <PVC-NAME>
            - name: host-dev
              hostPath:
                path: /dev
            - name: host-rootfs
              hostPath:
                path: /
          restartPolicy: Never
  5. 要验证 pod 日志的新大小,请执行以下命令:

    # oc logs refresh-block-size-xxxxx
    注意

    确保 df -Th 输出 post xfs_growfs 反映了新大小:

    例如:

    # oc logs refresh-block-size-jcbzh
    # df -Th /mnt
    Filesystem         Type  Size  Used Avail Use% Mounted on
    /dev/mapper/mpatha xfs   5.0G   33M  5.0G   1% /mnt
    # df -Th /mnt
    Filesystem         Type  Size  Used Avail Use% Mounted on
    /dev/mapper/mpatha xfs   7.0G   34M  6.0G   1% /mnt
  6. 运行以下命令检查作业是否成功:

    # oc get jobs
    NAME                 DESIRED   SUCCESSFUL   AGE
    refresh-block-size   1         1            36m
  7. 要在成功后删除作业,请执行以下命令:

    # oc delete job refresh-block-size
    job.batch "refresh-block-size" deleted
  8. 您可以在启动应用程序 pod 后使用新大小。

3.2.3.2. 在线重新定义大小

  1. 在扩展块 PVC 之前,请确保块托管卷有足够大小。

    1. 要获得 PVC 的 Heketi 块卷 ID,请在主 OCP 节点上执行以下命令:

      # oc get pv $(oc get pvc <PVC-NAME> --no-headers -o=custom-columns=:.spec.volumeName) -o=custom-columns=:.metadata.annotations."gluster\.org/volume-id"
    2. 要获得块卷 ID,请执行以下命令:

      # heketi-cli blockvolume info <block-volume-id>
    3. 要获得块托管卷信息,请执行以下命令:

      # heketi-cli volume info <block-hosting-volume-id>
      注意

      确定您有足够的可用大小。

  2. 要通过 heketi-cli 扩展块卷,请执行以下命令:

    # heketi-cli blockvolume expand <BLOCK-VOLUME-ID> --new-size=<net-new-size>

    例如:

    # heketi-cli blockvolume expand d911d4bcfd4f11bf07b9688a4798b5dc --new-size=7
    Name: blk_glusterfs_claim2_fc40d362-aaf9-11ea-bb32-0a580a820004
    Size: 7
    UsableSize: 7
    Volume Id: d911d4bcfd4f11bf07b9688a4798b5dc
    Cluster Id: 8d1656d29fb8dc6780388cf797351a6d
    Hosts: [10.70.53.185 10.70.53.203 10.70.53.198]
    IQN: iqn.2016-12.org.gluster-block:8ce8eb4c-4951-4777-9b42-244b7ea525cd
    LUN: 0
    Hacount: 3
    Username: 8ce8eb4c-4951-4777-9b42-244b7ea525cd
    Password: b83a74be-df90-4fd7-b1a1-928fdcfed8c4
    Block Hosting Volume: 2224ac1da64c1737604456a1f511574e
    注意

    展开 输出中,确保 SizeUsableSize 匹配。当大小和 Usable Size 匹配时,可以执行第 3 到 9 步。

  3. 要获得映射到 PV 的 iSCSI 目标 IQN 名称,请执行以下命令并记录它以便进一步参考:

    # oc get pv <PV-NAME> -o=custom-columns=:.spec.iscsi.iqn

    例如:

    # oc get pv pvc-fc3e9160-aaf9-11ea-a29f-005056b781de -o=custom-columns=:.spec.iscsi.iqn
    iqn.2016-12.org.gluster-block:8ce8eb4c-4951-4777-9b42-244b7ea525cd
  4. 登录到应用容器集的主机节点。

    1. 要获得应用程序 pod 的节点名称,请执行以下命令:

      # oc get pods <POD-NAME> -o=custom-columns=:.spec.nodeName

      例如:

      # oc get pods cirros2-1-8x6w5 -o=custom-columns=:.spec.nodeName
      dhcp53-203.lab.eng.blr.redhat.com
    2. 要登录到应用程序 pod 的主机节点,请执行以下命令:

      # ssh <NODE-NAME>

      例如:

      # ssh dhcp53-203.lab.eng.blr.redhat.com
  5. 复制多路径映射设备名称(如 mpatha) , ,current size of individual path(例如 sdd、sdesdf)和映射程序设备以便进一步参考。

    # lsblk | grep -B1 <pv-name>

    例如:

    # lsblk | grep -B1 pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
    sdd                                                                                 8:48   0    6G  0 disk
    └─mpatha                                                                          253:18   0    6G  0 mpath /var/lib/origin/openshift.local.volumes/pods/44b76db5-afa2-11ea-a29f-005056b781de/volumes/kubernetes.io~iscsi/pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
    sde                                                                                 8:64   0    6G  0 disk
    └─mpatha                                                                          253:18   0    6G  0 mpath /var/lib/origin/openshift.local.volumes/pods/44b76db5-afa2-11ea-a29f-005056b781de/volumes/kubernetes.io~iscsi/pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
    sdf                                                                                 8:80   0    6G  0 disk
    └─mpatha                                                                          253:18   0    6G  0 mpath /var/lib/origin/openshift.local.volumes/pods/44b76db5-afa2-11ea-a29f-005056b781de/volumes/kubernetes.io~iscsi/pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
    
        # df -Th| grep <PV-NAME>
     For example:
    # df -Th | grep pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
    /dev/mapper/mpatha                xfs       6.0G   44M  6.0G   1% /var/lib/origin/openshift.local.volumes/pods/44b76db5-afa2-11ea-a29f-005056b781de/volumes/kubernetes.io~iscsi/pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
  6. 您可以使用第 3 步中的 IQN 名称重新扫描应用程序 pod 的主机节点上的设备(它是一个 iSCSI initiator),请执行以下命令:

    # iscsiadm -m node -R -T <iqn-name>

    例如:

    # iscsiadm -m node -R -T iqn.2016-12.org.gluster-block:a951f673-1a17-47b8-ac02-197baa32b9b1
    Rescanning session [sid: 1, target:iqn.2016-12.org.gluster-block:a951f673-1a17-47b8-ac02-197baa32b9b1, portal: 192.168.124.80,3260]
    Rescanning session [sid: 2, target:iqn.2016-12.org.gluster-block:a951f673-1a17-47b8-ac02-197baa32b9b1, portal: 192.168.124.73,3260]
    Rescanning session [sid: 3, target:iqn.2016-12.org.gluster-block:a951f673-1a17-47b8-ac02-197baa32b9b1, portal: 192.168.124.63,3260]
    注意

    您现在应该会看到来自单个路径(sdd、sde 和 sdf)的新大小:

    # lsblk | grep -B1 <pv-name>

    例如:

    # lsblk | grep -B1 pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
    sdd            8:48   0    7G  0 disk
    └─mpatha       253:18 0    6G  0 mpath /var/lib/origin/openshift.local.volumes/pods/44b76db5-afa2-11ea-a29f-005056b781de/volumes/kubernetes.io~iscsi/pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
    sde            8:64   0    7G  0 disk
    └─mpatha       253:18 0    6G  0 mpath /var/lib/origin/openshift.local.volumes/pods/44b76db5-afa2-11ea-a29f-005056b781de/volumes/kubernetes.io~iscsi/pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
    sdf            8:80   0    7G  0 disk
    └─mpatha       253:18   0    6G  0 mpath /var/lib/origin/openshift.local.volumes/pods/44b76db5-afa2-11ea-a29f-005056b781de/volumes/kubernetes.io~iscsi/pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
  7. 要刷新多路径设备大小,请执行以下命令。

    1. lsblk 输出中获取多路径映射设备名称,获取第 6 步。
    2. 要刷新 multipath mapper 设备,请执行以下命令:

      # multipathd -k'resize map <multipath-mapper-name>'

      例如:

      # multipathd -k'resize map mpatha'
      Ok
      注意

      现在,您应看到用 映射器设备 mpatha 反映 的新大小。复制以下命令输出中的挂载点路径以进一步参考:

      # lsblk | grep -B1 <PV-NAME>

      例如:

      # lsblk | grep -B1 pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
      sdd                                                                                 8:48   0    7G  0 disk
      └─mpatha                                                                          253:18   0    7G  0 mpath /var/lib/origin/openshift.local.volumes/pods/44b76db5-afa2-11ea-a29f-005056b781de/volumes/kubernetes.io~iscsi/pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
      sde                                                                                 8:64   0    7G  0 disk
      └─mpatha                                                                          253:18   0    7G  0 mpath /var/lib/origin/openshift.local.volumes/pods/44b76db5-afa2-11ea-a29f-005056b781de/volumes/kubernetes.io~iscsi/pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
      sdf                                                                                 8:80   0    7G  0 disk
      └─mpatha                                                                          253:18   0    7G  0 mpath /var/lib/origin/openshift.local.volumes/pods/44b76db5-afa2-11ea-a29f-005056b781de/volumes/kubernetes.io~iscsi/pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
      # df -Th | grep <pv-name>

      例如:

          # df -Th | grep pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
      /dev/mapper/mpatha                xfs       6.0G   44M  6.0G   1% /var/lib/origin/openshift.local.volumes/pods/44b76db5-afa2-11ea-a29f-005056b781de/volumes/kubernetes.io~iscsi/pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
  8. 要增大文件系统布局,请执行以下命令:

    # xfs_growfs <mount-point>

    例如:

    # xfs_growfs /var/lib/origin/openshift.local.volumes/pods/44b76db5-afa2-11ea-a29f-005056b781de/volumes/kubernetes.io~iscsi/pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
    meta-data=/dev/mapper/mpatha     isize=512    agcount=24, agsize=65536 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0 spinodes=0
    data     =                       bsize=4096   blocks=1572864, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal               bsize=4096   blocks=2560, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    data blocks changed from 1572864 to 1835008
    # df -Th | grep <pv-name>

    例如:

    # df -Th | grep pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
    /dev/mapper/mpatha                xfs       7.0G   44M  7.0G   1% /var/lib/origin/openshift.local.volumes/pods/44b76db5-afa2-11ea-a29f-005056b781de/volumes/kubernetes.io~iscsi/pvc-fc3e9160-aaf9-11ea-a29f-005056b781de
  9. 现在,您可以在不重启应用程序 pod 的情况下使用新大小。

第 4 章 关闭 gluster-block 客户端节点

按照以下步骤关闭 gluster-block 客户端节点:

第 5 章 Red Hat Openshift Container Storage 环境中的 S3 兼容对象存储

重要

对 Container-Native Storage 中的 S3 兼容对象存储的支持技术预览。红帽服务级别协议(SLA)不支持技术预览功能,且功能可能并不完善,且不适用于生产环境。

技术预览功能提供早期对最新的产品创新访问权限,使客户能够在开发过程中测试功能并提供反馈。

红帽一般会考虑使"技术预览"功能的未来迭代保持可用,我们以商业上合理的努力来解决客户在使用这些功能时遇到的任何问题。

对象存储为数据存储提供了一个系统,允许用户访问与对象和文件相同的数据,从而简化管理并控制存储成本。S3 API 是基于 HTTP 对对象存储服务访问的事实标准。

注意

S3 兼容对象存储仅适用于 Red Hat Openshift Container Storage 3.11.4 和旧版本。

5.1. 为 Red Hat Openshift Container Storage 设置 S3 兼容对象存储

注意

在设置 S3 Compatible Object Store 前,确保已安装了 cns-deploy 软件包。有关如何安装 cns-deploy 软件包的详情,请参考 https://access.redhat.com/documentation/en-us/red_hat_openshift_container_storage/3.11/html-single/deployment_guide/#part-Appendix

从 /usr/share/heketi/templates/ 目录中执行以下步骤来为 Red Hat Openshift Container Storage 设置 S3 兼容对象存储:

  1. (可选):如果要为 heketi 创建 secret,请执行以下命令:

    # oc create secret generic heketi-${NAMESPACE}-admin-secret
    --from-literal=key=${ADMIN_KEY} --type=kubernetes.io/glusterfs

    例如:

    # oc create secret generic heketi-storage-project-admin-secret
    --from-literal=key=abcd  --type=kubernetes.io/glusterfs
    1. 执行以下命令标记 secret:

      # oc label --overwrite secret heketi-${NAMESPACE}-admin-secret
      glusterfs=s3-heketi-${NAMESPACE}-admin-secret
      gluster-s3=heketi-${NAMESPACE}-admin-secret

      例如:

      # oc label --overwrite secret heketi-storage-project-admin-secret
      glusterfs=s3-heketi-storage-project-admin-secret
      gluster-s3=heketi-storage-project-admin-secret
  2. 创建 GlusterFS StorageClass 文件。使用当前设置的 HEKETI_URLNAMESPACE,并设置 STORAGE_CLASS 名称。

    # sed -e 's/${HEKETI_URL}/<HEKETI_URL>/g'  -e 's/${STORAGE_CLASS}/<STORAGE_CLASSNAME>/g' -e  's/${NAMESPACE}/<NAMESPACE_NAME>/g'   /usr/share/heketi/templates/gluster-s3-storageclass.yaml | oc create -f -

    例如:

    # sed  -e 's/${HEKETI_URL}/heketi-storage-project.cloudapps.mystorage.com/g'  -e 's/${STORAGE_CLASS}/gluster-s3-store/g' -e 's/${NAMESPACE}/storage-project/g' /usr/share/heketi/templates/gluster-s3-storageclass.yaml | oc create -f -storageclass "gluster-s3-store" created
    注意
    • 您可以运行以下命令来获取 HEKETI_URL:

      # oc get routes --all-namespaces | grep heketi

      命令输出示例如下:

      glusterfs   heketi-storage
      heketi-storage-glusterfs.router.default.svc.cluster.local
      heketi-storage   <all>          None

      如果输出中有多个行,您可以选择最相关的选项。

    • 您可以运行以下命令来获取 NAMESPACE:

      oc get project

      命令输出示例如下:

      # oc project
      Using project "glusterfs" on server "master.example.com:8443"

      其中,glusterfs 是 NAMESPACE。

  3. 使用存储类创建持久性卷声明。

    # sed -e 's/${VOLUME_CAPACITY}/<NEW SIZE in Gi>/g'  -e  's/${STORAGE_CLASS}/<STORAGE_CLASSNAME>/g'  /usr/share/heketi/templates/gluster-s3-pvcs.yaml | oc create -f -

    例如:

    # sed -e 's/${VOLUME_CAPACITY}/2Gi/g'  -e  's/${STORAGE_CLASS}/gluster-s3-store/g'  /usr/share/heketi/templates/gluster-s3-pvcs.yaml | oc create -f -
    persistentvolumeclaim "gluster-s3-claim" created
    persistentvolumeclaim "gluster-s3-meta-claim" created

    使用上一步中创建的 STORAGE_CLASS。根据环境要求修改 VOLUME_CAPACITY。等待 PVC 已被绑定。使用以下命令验证相同的命令:

    # oc get pvc
    NAME                    STATUS    VOLUME                                     CAPACITY   ACCESSMODES   AGE
    gluster-s3-claim        Bound     pvc-0b7f75ef-9920-11e7-9309-00151e000016   2Gi        RWX           2m
    gluster-s3-meta-claim   Bound     pvc-0b87a698-9920-11e7-9309-00151e000016   1Gi        RWX           2m
  4. 使用模板启动 glusters3 对象存储服务。设置 S3_account 名称、S3_USER 名称和 S3_PASSWORDPVCMETA_PVC 从上一步中获得。

    # oc new-app  /usr/share/heketi/templates/gluster-s3-template.yaml \
    --param=S3_ACCOUNT=testvolume  --param=S3_USER=adminuser \
    --param=S3_PASSWORD=itsmine --param=PVC=gluster-s3-claim \
    --param=META_PVC=gluster-s3-meta-claim
    --> Deploying template "storage-project/gluster-s3" for "/usr/share/heketi/templates/gluster-s3-template.yaml" to project storage-project
    
         gluster-s3
         ---------
         Gluster s3 service template
    
    
         * With parameters:
            * S3 Account Name=testvolume
            * S3 User=adminuser
            * S3 User Password=itsmine
            * Primary GlusterFS-backed PVC=gluster-s3-claim
            * Metadata GlusterFS-backed PVC=gluster-s3-meta-claim
    
    --> Creating resources ...
        service "gluster-s3-service" created
        route "gluster-s3-route" created
        deploymentconfig "gluster-s3-dc" created
    --> Success
    Run 'oc status' to view your app.
  5. 执行以下命令验证 S3 pod 是否正在运行:

    # oc get pods -o wide
    NAME                             READY     STATUS    RESTARTS   AGE       IP             NODE
    gluster-s3-azkys                 1/1       Running   0          4m        10.130.0.29    node3
    ..

5.2. 对象操作

本节列出了执行的一些对象操作:

  • 获取提供 S3 OS 的路由 URL

    # s3_storage_url=$(oc get routes   | grep "gluster.*s3"  | awk '{print $2}')
    注意

    确保从 https://aws.amazon.com/code/128 下载 s3curl 工具。此工具将用于验证对象操作。

    • s3curl.pl 需要 Digest::HMAC_SHA1 和 Digest::MD5。安装 perl-Digest-HMAC 软件包来获得这一点。您可以运行这个命令安装 perl-Digest-HMAC 软件包:

       # yum install perl-Digest-HMAC
    • 使用检索的 glusters3object url 更新 s3curl.pl perl 脚本:

      例如:

      my @endpoints = ( 'glusters3object-storage-project.cloudapps.mystorage.com');
  • 执行存储桶的 PUT 操作:

    s3curl.pl --debug --id "testvolume:adminuser" --key "itsmine"  --put /dev/null  -- -k -v  http://$s3_storage_url/bucket1
  • 对存储桶中的对象执行 PUT 操作:

    s3curl.pl --debug --id "testvolume:adminuser" --key "itsmine" --put  my_object.jpg  -- -k -v -s http://$s3_storage_url/bucket1/my_object.jpg
  • 验证存储桶中的对象列表:

    s3curl.pl --debug --id "testvolume:adminuser" --key "itsmine"  -- -k -v -s http://$s3_storage_url/bucket1/

第 6 章 Cluster Administrator 设置

认证

使用 AllowAll Authentication 方法设置身份验证。

AllowAll Authentication

设置允许所有密码的身份验证模型。编辑 OpenShift 主控机上的 /etc/origin/master/master-config.yaml,并将 DenyAllPasswordIdentityProvider 的值改为 AllowAllPasswordIdentityProvider。然后重新启动 OpenShift 主控机。

  1. 现在,验证模型已被设置,以一个用户身份登录,如 admin/admin:

    # oc login openshift master e.g. https://1.1.1.1:8443  --username=admin --password=admin
  2. 为 admin 用户帐户授予 cluster-admin 角色。

    # oc login -u system:admin -n default
    Logged into "https:// <<openshift_master_fqdn>>:8443" as "system:admin" using existing credentials.
    
    You have access to the following projects and can switch between them with 'oc project <projectname>':
    
    *default
     glusterfs
     infra-storage
     kube-public
     kube-system
     management-infra
     openshift
     openshift-infra
     openshift-logging
     openshift-node
     openshift-sdn
     openshift-web-console
    
    Using project "default".
    
    # oc adm policy add-cluster-role-to-user cluster-admin admin
    cluster role "cluster-admin" added: "admin"

有关身份验证方法的详情请参考 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#identity-providers-configuring

第 7 章 Gluster Block Storage 作为日志记录和指标的后端

以下部分指南将 Gluster 块存储配置为用于日志记录和指标的后端存储

注意

OpenShift Container Storage 3.11 现在支持块卷扩展。请参阅 第 3.2.3 节 “块卷扩展”

7.1. 先决条件

在将 gluster 块存储设置为日志或指标的后端之前,请检查是否满足以下先决条件:

  • 在 storageclass 文件中,检查是否将默认存储类设置为 gluster 块的存储类。例如:

    # oc get storageclass
    NAME                TYPE
    gluster-block        gluster.org/glusterblock
  • 如果默认值未设为 gluster-block (或者您提供的任何其他名称),请执行以下命令:例如:

    # oc patch storageclass gluster-block -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
    • 执行以下命令进行验证:

      oc get storageclass
      NAME                     TYPE
      gluster-block (default)   gluster.org/glusterblock

7.2. 将 Gluster 块存储启用为日志记录的后端

按照下方所述的任务,将 Gluster Block Storage 启用为用于日志记录的后端:

  1. 要在 Openshift Container Platform 中启用日志记录,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-aggregate-logging
  2. openshift_logging_es_pvc_dynamic ansible 变量必须设置为 true。

    [OSEv3:vars] openshift_logging_es_pvc_dynamic=true

    例如,下面列出 openshift_logging_ 的变量集合示例。

    openshift_logging_install_logging=true
    openshift_logging_es_pvc_dynamic=true
    openshift_logging_kibana_nodeselector={"node-role.kubernetes.io/infra": "true"}
    openshift_logging_curator_nodeselector={"node-role.kubernetes.io/infra": "true"}
    openshift_logging_es_nodeselector={"node-role.kubernetes.io/infra": "true"}
    openshift_logging_es_pvc_size=10Gi
    openshift_logging_es_pvc_storage_class_name="glusterfs-registry-block"
  3. 运行 Ansible playbook。如需更多信息,请参阅https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-aggregate-logging
  4. 要验证,请执行以下命令:

    # oc get pods -n openshift-logging

7.3. 将 Gluster 块存储启用为指标的后端

按照下方所述的任务,将 Gluster 块存储作为指标的后端

注意

默认情况下,由于容器原生虚拟化执行三向复制,因此可以从集群中的任何位置访问重启的节点。因此,建议关闭 Cassandra 级别复制以避免容量开销

  1. 要在 Openshift Container Platform 中启用指标,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-cluster-metrics
  2. openshift_metrics_cassandra_storage_type ansible 变量应设置为 动态

    [OSEv3:vars]openshift_metrics_cassandra_storage_type=dynamic

    例如,以下列出了 openshift_metrics_ 的变量集。

    openshift_metrics_install_metrics=true
    openshift_metrics_storage_kind=dynamic
    openshift_metrics_hawkular_nodeselector={"node-role.kubernetes.io/infra": "true"}
    openshift_metrics_cassandra_nodeselector={"node-role.kubernetes.io/infra": "true"}
    openshift_metrics_heapster_nodeselector={"node-role.kubernetes.io/infra": "true"}
    openshift_metrics_storage_volume_size=10Gi
    openshift_metrics_cassandra_pvc_storage_class_name="glusterfs-registry-block"
  3. 运行 Ansible playbook。如需更多信息,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-cluster-metrics
  4. 要验证,请执行以下命令:

    # oc get pods --namespace openshift-infra

    它应该列出以下 pod 正在运行:

    heapster-cassandra
    heapster-metrics
    hawkular-&*9

7.4. 验证 Gluster 块是否设置为后端

执行以下命令验证 gluster 块是否设置为用于日志记录和指标的后端:

  1. 要获得基础架构概述,请执行以下命令:

    # oc get pods -n logging -o jsonpath='{range .items[].status.containerStatuses[]}{"Name: "}{.name}{"\n  "}{"Image: "}{.image}{"\n"}{"  State: "}{.state}{"\n"}{end}'
  2. 要获取所有持久性卷声明的详情,请执行以下命令:

    # oc get pvc
  3. 要获取 pvc 的详细信息,请执行以下命令:

    # oc describe pvc <claim_name>

    验证卷是否可挂载,并且权限允许读/写。另外,PVC 声明名称应与动态置备的 gluster 块存储类匹配。

    如需更多信息,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-aggregate-logging-sizing

部分 III. 安全性

第 8 章 启用加密

红帽 Gluster 存储支持使用 TLS/SSL 的网络加密。Red Hat Gluster Storage 使用 TLS/SSL 进行身份验证和授权,代替了用于正常连接的家庭扩展身份验证框架。Red Hat Gluster Storage 支持以下加密类型:

  • I/O 加密 - 加密红帽 Gluster 存储客户端和服务器之间的 I/O 连接。
  • 管理加密 - 加密受信存储池内管理(glusterd)连接。

8.1. 先决条件

要启用加密,每个节点需要 3 个证书(glusterfs.key、gluserfs.pem 和 glusterfs.ca)。有关作为先决条件执行步骤的更多信息,请参阅 https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.5/html-single/administration_guide/index#chap-Network_Encryption-Preparing_Certificates

在使用 volumeoptions 参数注册 storageclass 文件时,请确保启用加密。有关为文件存储注册 storageclass 文件的详情,请参考 https://access.redhat.com/documentation/en-us/red_hat_openshift_container_storage/3.11/html-single/operations_guide/index#chap-Documentation-Red_Hat_Gluster_Storage_Container_Native_with_OpenShift_Platform-OpenShift_Creating_Persistent_Volumes-Dynamic_Prov

注意
  • 确保在除 master 外的所有 OpenShift 节点上执行这些步骤。
  • 所有 Red Hat Gluster Storage 卷都挂载到 OpenShift 节点上,然后绑定挂载到应用容器集中。因此,不需要对应用程序 pod 执行任何与加密相关的操作。

8.2. 为新的 Red Hat Openshift Container Storage 设置启用加密

您可以为 I/O 加密和管理加密为新的 Red Hat Openshift Container Storage 设置配置网络加密。

8.2.1. 启用管理加密

虽然红帽 Gluster 存储只能为 I/O 加密配置,但不建议使用管理加密。如果只想在 I/O 路径中启用 SSL,请跳过本节并继续 第 8.2.2 节 “为卷启用 I/O 加密”

在服务器上

在所有服务器上执行以下操作,即 ie,即运行红帽 Gluster 存储容器集的 OpenShift 节点。

  1. 创建 /var/lib/glusterd/secure-access 文件。

    # touch /var/lib/glusterd/secure-access

在客户端上

在客户端(即红帽 Gluster 存储不在运行)的所有 OpenShift 节点上执行以下操作。

  1. 创建 /var/lib/glusterd/secure-access 文件。

    # touch /var/lib/glusterd/secure-access
注意

所有 Red Hat Gluster Storage 卷都挂载到 OpenShift 节点上,然后绑定挂载到应用容器集中。因此,不需要对应用程序 pod 执行任何与加密相关的操作。

在服务器和客户端上运行命令后,部署 Red Hat Openshift Container Storage。如需更多信息,请参阅 https://access.redhat.com/documentation/en-us/red_hat_openshift_container_storage/3.11/html-single/deployment_guide/#chap-Documentation-Red_Hat_Gluster_Storage_Container_Native_with_OpenShift_Platform-Setting_the_environment-Deploy_CNS

8.2.2. 为卷启用 I/O 加密

在服务器和客户端之间启用 I/O 加密:

注意

服务器是运行红帽 Gluster 存储容器集的 OpenShift 节点。

客户端是 Red Hat Gluster Storage 未运行的其他 OpenShift 节点。

  1. 在继续执行后续步骤前,请确保部署了 Red Hat Openshift Container Storage。更多信息请参阅 https://access.redhat.com/documentation/en-us/red_hat_openshift_container_storage/3.11/html-single/deployment_guide/#chap-Documentation-Red_Hat_Gluster_Storage_Container_Native_with_OpenShift_Platform-Setting_the_environment-Deploy_CNS
  2. 您可以创建静态置备的卷,也可以创建动态置备的卷。有关静态置备卷的更多信息,请参阅 https://access.redhat.com/documentation/en-us/red_hat_openshift_container_storage/3.11/html-single/operations_guide/#chap-Documentation-Red_Hat_Gluster_Storage_Container_Native_with_OpenShift_Platform-OpenShift_Creating_Persistent_Volumes-Static_Prov。有关动态置备卷的更多信息,请参阅 https://access.redhat.com/documentation/en-us/red_hat_openshift_container_storage/3.11/html-single/operations_guide/#chap-Documentation-Red_Hat_Gluster_Storage_Container_Native_with_OpenShift_Platform-OpenShift_Creating_Persistent_Volumes-Dynamic_Prov

    注意

    要在创建静态置备的卷时启用加密,请执行以下命令:

     # heketi-cli volume create --size=100 --gluster-volume-options="client.ssl on","server.ssl on"
  3. 运行以下命令来停止卷:

    # oc rsh <gluster_pod_name> gluster volume stop VOLNAME

    gluster pod 名称是卷所属的受信存储池其中一个红帽 Gluster 存储 pod 的名称。

    注意

    要获取 VOLNAME,请执行以下命令:

    # oc describe pv <pv_name>

    例如:

    # oc describe pv  pvc-01569c5c-1ec9-11e7-a794-005056b38171
    Name:           pvc-01569c5c-1ec9-11e7-a794-005056b38171
    Labels:         <none>
    StorageClass:   fast
    Status:         Bound
    Claim:          storage-project/storage-claim68
    Reclaim Policy: Delete
    Access Modes:   RWO
    Capacity:       1Gi
    Message:
    Source:
        Type:               Glusterfs (a Glusterfs mount on the host that shares a pod's lifetime)
        EndpointsName:      glusterfs-dynamic-storage-claim68
        Path:               vol_0e81e5d6e46dcbf02c11ffd9721fca28
        ReadOnly:           false
    No events.

    VOLNAME 是以上输出中"path"的值。

  4. 设置要访问该卷的所有服务器的通用名称列表。确保包含被允许访问该卷的客户端的通用名称。

    # oc rsh <gluster_pod_name> gluster volume set VOLNAME auth.ssl-allow 'server1,server2,server3,client1,client2,client3'
    注意

    如果将 auth.ssl-allow 选项设为 * 值,则任何通过 TLS 验证的客户端都可以从应用程序端挂载和访问卷。因此,您可以将选项的值设置为 *,或者提供客户端以及受信存储池中节点的通用名称。

  5. 在该卷上启用 client.ssl 和 server.ssl 选项。

    # oc rsh <gluster_pod_name> gluster volume set VOLNAME client.ssl on
    # oc rsh <gluster_pod_name> gluster volume set VOLNAME server.ssl on
  6. 启动卷。

    # oc rsh <gluster_pod_name> gluster volume start VOLNAME

8.3. 为现有 Red Hat Openshift Container Storage 设置启用加密

您可以为 I/O 加密和管理加密为现有 Red Hat Openshift Container Storage 设置配置网络加密。

8.3.1. 为卷启用 I/O 加密

为卷启用服务器和客户端之间的 I/O 加密:

注意

服务器是运行红帽 Gluster 存储容器集的 OpenShift 节点。

客户端是 Red Hat Gluster Storage 未运行的其他 OpenShift 节点。

  1. 停止所有具有红帽 Gluster 存储卷的应用 pod。
  2. 停止卷。

    # oc rsh <gluster_pod_name> gluster volume stop VOLNAME

    gluster pod 名称是卷所属的受信存储池其中一个红帽 Gluster 存储 pod 的名称。

  3. 设置允许访问卷的客户端的通用名称列表。务必包含所有服务器的通用名称。

    # oc rsh <gluster_pod_name> gluster volume set VOLNAME auth.ssl-allow 'server1,server2,server3,client1,client2,client3'
    注意

    如果将 auth.ssl-allow 选项设为 * 值,则任何通过 TLS 验证的客户端都可以从应用程序端挂载和访问卷。因此,您可以将选项的值设置为 *,或者提供客户端以及受信存储池中节点的通用名称。

  4. 使用以下命令在卷中启用 client.ssl 和 server.ssl:

    # oc rsh <gluster_pod_name> gluster volume set VOLNAME client.ssl on
    # oc rsh <gluster_pod_name> gluster volume set VOLNAME server.ssl on
  5. 启动卷。

    # oc rsh <gluster_pod_name> gluster volume start VOLNAME
  6. 启动应用 pod 以使用加密的红帽 Gluster 存储卷。

8.3.2. 启用管理加密

虽然建议使用管理加密,尽管红帽 Gluster 存储只能针对 I/O 加密进行配置,而无需使用管理加密。在现有的安装中,运行服务器和客户端时,调度卷、应用程序、客户端和其他最终用户的停机时间,以启用管理加密。

您目前无法动态更改未加密的和加密连接。如果在连接管理加密时运行,则服务器和客户端上的 brick 和其他本地服务从 glusterd 接收通知。

  1. 停止所有具有红帽 Gluster 存储卷的应用 pod。
  2. 停止所有卷。

    # oc rsh <gluster_pod_name> gluster volume stop VOLNAME
  3. 停止红帽 Gluster 存储 Pod。

    # oc delete daemonset glusterfs-storage
  4. 在删除守护进程时,设置 pod 会关闭。要验证 pod 是否已关闭,请执行以下命令:

    # oc get pods
  5. 在所有 OpenShift 节点上创建 /var/lib/glusterd/secure-access 文件。

    # touch /var/lib/glusterd/secure-access
  6. 通过执行以下命令创建 Red Hat Gluster Storage daemonset:

    注意

    对于 Ansible 部署,镜像名称和版本必须在模板中指定,然后才能执行 命令。

    # oc process glusterfs | oc create -f -
  7. 创建守护进程时,pod 已启动。要验证 pod 是否已启动,请执行以下命令:

    # oc get pods
  8. 启动所有卷。

    # oc rsh <gluster_pod_name> gluster volume start VOLNAME
  9. 启动应用容器集以使用加密红帽 Gluster 存储的管理。

8.4. 禁用加密

您可以在以下两个场景中在 Red Hat Openshift Container Storage 设置中禁用加密:

  • 禁用卷的 I/O 加密
  • 禁用管理加密

8.4.1. 禁用所有卷的 I/O 加密

执行以下命令禁用卷的服务器和客户端之间的 I/O 加密:

注意

服务器是运行红帽 Gluster 存储容器集的 OpenShift 节点。

客户端是 Red Hat Gluster Storage 未运行的其他 OpenShift 节点。

  1. 停止所有具有红帽 Gluster 存储卷的应用 pod。
  2. 停止所有卷。

    # oc rsh <gluster_pod_name> gluster volume stop VOLNAME
  3. 重置卷的所有加密选项:

    # oc rsh <gluster_pod_name> gluster volume reset VOLNAME auth.ssl-allow
    # oc rsh <gluster_pod_name> gluster volume reset VOLNAME client.ssl
    # oc rsh <gluster_pod_name> gluster volume reset VOLNAME server.ssl
  4. 在所有 OpenShift 节点上使用以下命令删除用于网络加密的文件:

    # rm /etc/ssl/glusterfs.pem /etc/ssl/glusterfs.key /etc/ssl/glusterfs.ca
    注意

    在启用管理加密后,删除设置中的这些文件将导致所有 gluster pod 失败 glusterd,因此应避免。

  5. 停止红帽 Gluster 存储 Pod。

    # oc delete daemonset glusterfs
  6. 在删除守护进程时,设置 pod 会关闭。要验证 pod 是否已关闭,请执行以下命令:

    # oc get pods
  7. 通过执行以下命令创建 Red Hat Gluster Storage daemonset:

    注意

    对于 Ansible 部署,镜像名称和版本必须在模板中指定,然后才能执行 命令。

    # oc process glusterfs | oc create -f -
  8. 创建守护进程时,pod 已启动。要验证 pod 是否已启动,请执行以下命令:

    # oc get pods
  9. 启动卷。

    # oc rsh <gluster_pod_name> gluster volume start VOLNAME
  10. 启动应用 pod 以使用加密的红帽 Gluster 存储卷。

8.4.2. 禁用管理加密

您目前无法动态更改未加密的和加密连接。如果在连接管理加密时运行,则服务器和客户端上的 brick 和其他本地服务从 glusterd 接收通知。

执行以下命令来禁用管理加密

  1. 停止所有具有红帽 Gluster 存储卷的应用 pod。
  2. 停止所有卷。

    # oc rsh <gluster_pod_name> gluster volume stop VOLNAME
  3. 停止红帽 Gluster 存储 Pod。

    # oc delete daemonset glusterfs
  4. 在删除守护进程时,设置 pod 会关闭。要验证 pod 是否已关闭,请执行以下命令:

    # oc get pods
  5. 删除所有 OpenShift 节点上的 /var/lib/glusterd/secure-access 文件,以禁用管理加密。

    # rm /var/lib/glusterd/secure-access
  6. 在所有 OpenShift 节点上使用以下命令删除用于网络加密的文件:

    # rm /etc/ssl/glusterfs.pem /etc/ssl/glusterfs.key /etc/ssl/glusterfs.ca
  7. 通过执行以下命令创建 Red Hat Gluster Storage daemonset:

    注意

    对于 Ansible 部署,镜像名称和版本必须在模板中指定,然后才能执行 命令。

    # oc process glusterfs | oc create -f -
  8. 创建守护进程时,pod 已启动。要验证 pod 是否已启动,请执行以下命令:

    # oc get pods
  9. 启动所有卷。

    # oc rsh <gluster_pod_name> gluster volume start VOLNAME
  10. 启动应用容器集以使用加密红帽 Gluster 存储的管理。

部分 IV. Migration(迁移)

第 9 章 使用 Red Hat Openshift Container Storage 更新 registry 作为存储后端

OpenShift Container Platform 使用由 NFS 支持的持久性卷(自动设置的)为存储提供集成的 registry。Red Hat Openshift Container Storage 允许您将它替换为用于 registry 存储的 Gluster 持久性卷。这提供了更高的可靠性、可扩展性和故障转移。

如需有关 OpenShift Container Platform 和 docker-registry 的更多信息,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html/configuring_clusters/setting-up-the-registry

9.1. 验证 Openshift Container Platform Registry 部署

要验证 registry 是否已正确部署,请执行以下命令:

  1. 在 master 或客户端中,执行以下命令以 cluster admin 用户身份登录:

    # oc login

    例如:

    # oc login
    
    Authentication required for https://master.example.com:8443 (openshift)
    Username: <cluster-admin-user>
    Password: <password>
    Login successful.
    
    You have access to the following projects and can switch between them with 'oc project <projectname>':
    
      * default
        management-infra
        openshift
        openshift-infra
    
    Using project "default".

    如果没有自动登录到项目,请执行以下命令切换到它:

    # oc project default
  2. 要验证 pod 是否已创建,请执行以下命令:

    # oc get pods

    例如:

    # oc get pods
    NAME                       READY     STATUS    RESTARTS   AGE
    docker-registry-2-mbu0u    1/1       Running   4          6d
    docker-registry-2-spw0o    1/1       Running   3          6d
    registry-console-1-rblwo   1/1       Running   3          6d
  3. 要验证端点是否已创建,请执行以下命令:

    # oc get endpoints

    例如:

    # oc get endpoints
    NAME               ENDPOINTS                                                                  AGE
    docker-registry    10.128.0.15:5000,10.129.0.9:5000                                           7d
    kubernetes         192.168.234.143:8443,192.168.234.143:8053,192.168.234.143:8053             7d
    registry-console   10.128.0.17:9090                                                           7d
    router             192.168.234.144:443,192.168.234.145:443,192.168.234.144:1936 + 3 more...   7d
  4. 要验证持久性卷是否已创建,请执行以下命令:

    # oc get pv
    NAME   CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM  REASON    AGE
    registry-volume           5Gi        RWX           Retain          Bound       default/registry-claim             7d
  5. 要获取为 NFS registry 创建的持久性卷详情,请执行以下命令:

    # oc describe pv registry-volume
    Name:        registry-volume
    Labels:        <none>
    StorageClass:
    Status:        Bound
    Claim:        default/registry-claim
    Reclaim Policy:    Retain
    Access Modes:    RWX
    Capacity:    5Gi
    Message:
    Source:
        Type:    NFS (an NFS mount that lasts the lifetime of a pod)
        Server:    cns30.rh73
        Path:    /exports/registry
        ReadOnly:    false
    No events.

9.2. 使用 Red Hat Openshift Container Storage 转换 Openshift Container Platform Registry

本节提供创建红帽 Gluster 存储卷的步骤,并使用它来为集成 registry 提供存储。

设置 Red Hat Gluster Storage 持久性卷

执行以下命令,以创建红帽 Gluster 存储卷来存储注册表数据并创建持久卷。

注意

命令必须在 default 项目中执行。

  1. 登录到 默认项目

    # oc project default

    例如:

    # oc project default
    Now using project "default" on server "https://cns30.rh73:8443"
  2. 执行以下命令创建 gluster-registry-endpoints.yaml 文件:

     oc get endpoints <heketi-db-storage-endpoint-name> -o yaml --namespace=<project-name> >  gluster-registry-endpoints.yaml
    注意

    您必须为您要使用 Red Hat Gluster Storage registry 的每个项目创建一个端点。因此,您将在 default 项目和前面步骤中创建的新项目(storage-project)中有一个服务和一个端点。

  3. 编辑 gluster-registry-endpoints.yaml 文件。将名称更改为 gluster-registry-endpoints 并删除所有其他元数据,使所有其他元数据保持不变。

    # cat gluster-registry-endpoints.yaml
    apiVersion: v1
    kind: Endpoints
    metadata:
      name: gluster-registry-endpoints
    subsets:
      - addresses:
          - ip: 192.168.124.114
          - ip: 192.168.124.52
          - ip: 192.168.124.83
        ports:
          - port: 1
    protocol: TCP
  4. 执行以下命令创建端点:

    # oc create -f gluster-registry-endpoints.yaml
    endpoints "gluster-registry-endpoints" created
  5. 要验证端点的创建,请执行以下命令:

    # oc get endpoints
    NAME                       ENDPOINTS                                                                 AGE
    docker-registry            10.129.0.8:5000,10.130.0.5:5000                                           28d
    gluster-registry-endpoints  192.168.124.114:1,192.168.124.52:1,192.168.124.83:1                       10s
    kubernetes                 192.168.124.250:8443,192.168.124.250:8053,192.168.124.250:8053            28d
    registry-console           10.131.0.6:9090                                                           28d
    router                     192.168.124.114:443,192.168.124.83:443,192.168.124.114:1936 + 3 more...   28d
  6. 执行以下命令创建 gluster-registry-service.yaml 文件:

     oc get services <heketi-storage-endpoint-name> -o yaml --namespace=<project-name> >  gluster-registry-service.yaml
  7. 编辑 gluster-registry-service.yaml 文件。将名称更改为 gluster-registry-service 并删除所有其他元数据。另外,删除特定的集群 IP 地址:

    # cat gluster-registry-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: gluster-registry-service
    spec:
      ports:
        - port: 1
          protocol: TCP
          targetPort: 1
      sessionAffinity: None
      type: ClusterIP
    status:
    loadBalancer: {}
  8. 执行以下命令来创建服务:

    # oc create -f gluster-registry-service.yaml
    services "gluster-registry-service" created
  9. 执行以下命令验证服务是否正在运行:

    # oc get services
    NAME                       CLUSTER-IP       EXTERNAL-IP   PORT(S)                   AGE
    docker-registry            172.30.197.118   <none>        5000/TCP                  28d
    gluster-registry-service   172.30.0.183     <none>        1/TCP                     6s
    kubernetes                 172.30.0.1       <none>        443/TCP,53/UDP,53/TCP     29d
    registry-console           172.30.146.178   <none>        9000/TCP                  28d
    router                     172.30.232.238   <none>        80/TCP,443/TCP,1936/TCP   28d
  10. 执行以下命令以获取现有 docker-registry pod 的 fsGroup GID:

    # export GID=$(oc get po --selector="docker-registry=default" -o go-template --template='{{printf "%.0f" ((index .items 0).spec.securityContext.fsGroup)}}')
  11. 执行以下命令创建卷

    # heketi-cli volume create --size=5 --name=gluster-registry-volume --gid=${GID}
  12. 为 Red Hat Gluster Storage 卷创建持久性卷文件:

    # cat gluster-registry-volume.yaml
    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: gluster-registry-volume
      labels:
        glusterfs: registry-volume
    spec:
      capacity:
        storage: 5Gi
      glusterfs:
        endpoints: gluster-registry-endpoints
        path: gluster-registry-volume
      accessModes:
        - ReadWriteMany
    persistentVolumeReclaimPolicy: Retain
  13. 执行以下命令来创建持久性卷:

    # oc create -f gluster-registry-volume.yaml
  14. 执行以下命令验证并获取所创建持久性卷的详情:

    # oc get pv/gluster-registry-volume
    NAME                      CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM     REASON    AGE
    gluster-registry-volume   5Gi        RWX           Retain          Available                       21m
  15. 创建新的持久性卷声明。以下是一个持久性卷声明示例,它将用于替换现有的 registry-storage 卷声明。

    # cat gluster-registry-claim.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: gluster-registry-claim
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
    glusterfs: registry-volume
  16. 通过执行以下命令创建持久性卷声明:

    # oc create -f gluster-registry-claim.yaml

    例如:

    # oc create -f gluster-registry-claim.yaml
    persistentvolumeclaim "gluster-registry-claim" created
  17. 执行以下命令验证声明是否绑定:

    # oc get pvc/gluster-registry-claim

    例如:

    # oc get pvc/gluster-registry-claim
    NAME                     STATUS    VOLUME                    CAPACITY   ACCESSMODES   AGE
    gluster-registry-claim   Bound     gluster-registry-volume   5Gi        RWX           22s
  18. 通过执行以下命令使 registry 只读:

    # oc set env -n default dc/docker-registry 'REGISTRY_STORAGE_MAINTENANCE_READONLY={"enabled":true}'

    要确认值设为只读,请执行以下命令:

    # oc set env -n default dc/docker-registry --list
  19. 如果要将数据从旧 registry 迁移到 Red Hat Gluster Storage registry,请执行以下命令:

    注意

    这些步骤是可选的。

    1. 通过执行以下命令将 Red Hat Gluster Storage registry 添加到旧的 registry 部署配置(dc)中:

      # oc set volume dc/docker-registry --add --name=gluster-registry-storage -m /gluster-registry -t pvc --claim-name=gluster-registry-claim
    2. 运行以下命令来保存 Registry pod 名称:

      # export REGISTRY_POD=$(oc get po --selector="docker-registry=default" -o go-template --template='{{printf "%s" ((index .items 0).metadata.name)}}')
    3. 通过执行以下命令,将旧 registry 目录中的数据复制到 Red Hat Gluster Storage registry 目录中:

      # oc rsh -T $REGISTRY_POD cp -aTv /registry/ /gluster-registry/
    4. 通过执行以下命令,从旧的 dc registry 中删除 Red Hat Gluster Storage registry:

      # oc volume dc/docker-registry --remove --name=gluster-registry-storage
  20. 将现有的 registry-storage 卷替换为新的 gluster-registry-claim PVC:

    # oc set volume dc/docker-registry --add --name=registry-storage -t pvc --claim-name=gluster-registry-claim --overwrite
  21. 通过执行以下命令使 registry 读写:

    # oc set env dc/docker-registry REGISTRY_STORAGE_MAINTENANCE_READONLY-

    要验证设置是否被设置为读写,请执行以下命令:

    # oc set env -n default dc/docker-registry --list

有关访问 registry 的更多信息,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html/configuring_clusters/setting-up-the-registry#install-config-registry-accessing

部分 V. 监控

第 10 章 在 OpenShift 3.10 和 3.11 中启用卷指标

Prometheus 是一个独立的开源系统监视和警报工具包,随 OpenShift 提供。您可以使用 Prometheus 将 OpenShift Container Platform 系统资源的指标和警报视觉化为 PV 和服务(如 heketi)。

他提供了一个 RESTful 管理界面,可用于管理 GlusterFS 卷的生命周期,以及 Prometheus 可提取的指标端点。

Prometheus 在 OpenShift 中集成的方式与 OCP 3.10 和 3.11 稍有不同。

有关如何在 OCP 3.10 中设置 Prometheus 的更多信息,请参阅 OpenShift Container Platform 上的 Prometheus

有关如何在 OCP 3.11 中设置 Prometheus 的更多信息,请参阅 Prometheus Cluster Monitoring

10.1. 可用的文件存储和块存储指标

以下列表提供了 Prometheus 上可查看的 PV 的不同指标:

kubelet_volume_stats_available_bytes
卷中的可用字节数。
kubelet_volume_stats_capacity_bytes
卷的容量(以字节为单位)。
kubelet_volume_stats_inodes
卷中内节点的最大数量。
kubelet_volume_stats_inodes_free
卷中可用内节点的数量。
kubelet_volume_stats_inodes_used
卷中使用的内节点数。
kubelet_volume_stats_used_bytes
卷中使用的字节数。

Heketi 服务提供以下指标:

heketi_cluster_count
集群数量。
heketi_device_brick_count
设备上的 brick 数。
heketi_device_count
主机上设备数量。
heketi_device_free_bytes
该设备中的可用空间量。
heketi_device_size_bytes
设备的总大小。
heketi_device_used_bytes
设备中使用的空间量。
heketi_nodes_count
集群中的节点数。
heketi_up
验证 heketi 是否在运行。
heketi_volumes_count
集群中的卷数量。
heketi_block_volumes_count
集群中的块卷数量。

10.2. 在 OpenShift 3.10 中启用 Heketi 指标

要在 OCP 3.10 中查看 Prometheus 上的 Heketi 指标,请执行以下命令:

  1. 将注解添加到 heketi-storage 服务(通常在 app-storage 命名空间中运行)。

    # oc project app-storage
    # oc annotate svc heketi-storage prometheus.io/scheme=http
    # oc annotate svc heketi-storage prometheus.io/scrape=true
    # oc describe svc heketi-storage
    Name:          	heketi-storage
    Namespace:     	app-storage
    Labels:        	glusterfs=heketi-storage-service
       	            heketi=storage-service
    Annotations:   	description=Exposes Heketi service
       	            prometheus.io/scheme=http
       	             prometheus.io/scrape=true
    Selector:      	glusterfs=heketi-storage-pod
    Type:          	ClusterIP
    IP:            	172.30.90.87
    Port:          	heketi  8080/TCP
    TargetPort:    	8080/TCP
    Endpoints:     	172.18.14.2:8080
    Session Affinity:  None
  2. 为 Prometheus configmap 中的 heketi 服务添加 app-storage 命名空间。

    # oc get cm prometheus -o yaml -n openshift-metrics
    ....
    - job_name: 'kubernetes-service-endpoints'
    
         tls_config:
         ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
         # TODO: this should be per target
         insecure_skip_verify: true
    
         kubernetes_sd_configs:
         - role: endpoints
    
         relabel_configs:
         # only scrape infrastructure components
         - source_labels: [__meta_kubernetes_namespace]
         action: keep
    regex: 'default|logging|metrics|kube-.+|openshift|openshift-.+|app-storage'

    对所有其他存储命名空间进行上述操作(例如:infra-storage)。

  3. 重启 prometheus-0 pod,以查询 Prometheus 中的 Heketi 指标。

10.3. 在 OpenShift 3.11 中启用 heketi 指标

在 OCP 3.11 中,Prometheus 使用 servicemonitors,这是 Prometheus Operator 引入的新资源。需要为每个存储命名空间创建 servicemonitor,并描述了要监控的目标集合。

要在 OCP 3.11 中查看 Prometheus 上的 Heketi 指标,请执行以下命令:

  1. heketi-storage 服务中添加注解。

    # oc project app-storage
    # oc annotate svc heketi-storage prometheus.io/scheme=http
    # oc annotate svc heketi-storage prometheus.io/scrape=true
  2. 使用以下模板在 openshift-monitoring 命名空间中创建 heketi-app servicemonitor:

    # cat heketi-app-sm.yml
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: heketi-app
      labels:
        k8s-app: heketi-app
      namespace: openshift-monitoring
    spec:
      endpoints:
      - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
        interval: 30s
        port: heketi
        scheme: http
        targetPort: 0
      namespaceSelector:
        matchNames:
        - app-storage
      selector:
        matchLabels:
          heketi: storage-service

    其中,namespaceSelector 和标签需要与 heketi-storage 服务中的值匹配:

    # oc describe svc heketi-storage -n app-storage
    Name:              heketi-storage
    Namespace:         app-storage
    Labels:            glusterfs=heketi-storage-service
                       heketi=storage-service
    Annotations:       description=Exposes Heketi service
                       prometheus.io/scheme=http
                       prometheus.io/scrape=true
    Selector:          glusterfs=heketi-storage-pod
    Type:              ClusterIP
    IP:                172.30.3.92
    Port:              heketi  8080/TCP
    TargetPort:        8080/TCP
    Endpoints:         10.128.4.12:8080
    Session Affinity:  None
    Events:            <none>

    设置了正确的选择器后,使用正确的选择器集在 openshift-monitoring 命名空间中创建 servicemonitor。

    # oc create -f heketi-app-sm.yml -n openshift-monitoring
    servicemonitor.monitoring.coreos.com "heketi-app" created
    # oc get servicemonitor -n openshift-monitoring
    NAME                          AGE
    alertmanager                  20d
    cluster-monitoring-operator   20d
    heketi-app                    1m
    kube-apiserver                20d
    kube-controllers              20d
    kube-state-metrics            20d
    kubelet                       20d
    node-exporter                 20d
    prometheus                    20d
    prometheus-operator           20d
  3. 如果您有多个 OCS 集群,则需要使用上述步骤为每个 OCS 集群创建一个 servicemonitor。
  4. 执行以下命令向 prometheus 添加 cluster-reader 权限:

    # oc adm policy add-cluster-role-to-user cluster-reader \
    system:serviceaccount:openshift-monitoring:prometheus-k8s -n \
    openshift-monitoring
    cluster role "cluster-reader" added: "system:serviceaccount:openshift-monitoring:prometheus-k8s"
  5. 几分钟后,Prometheus 会加载新的服务监视器。

10.4. 查看指标

查看任何指标:

  1. Prometheus 中添加指标名称,再单击 Execute
  2. Graph 选项卡中,卷指标的值显示为图形。

    例如,在以下镜像中,检查可用的字节数 kubelet_volume_stats_available_bytes 指标已添加到 Prometheus 的搜索栏中。在点 Execute 时,可用的字节数被描述为图形。您可以在行上悬停鼠标以获取更多详细信息。(要查看镜像详情,请右键单击并选择 View Image.)

    Viewing metrics

部分 VI. 故障排除

第 11 章 故障排除

本章介绍了与 Red Hat Openshift Container Storage 相关的最常见的故障排除场景。

Red Hat Openshift Container Storage 节点Fails

如果 Red Hat Openshift Container Storage 节点失败,并且要删除它,则在删除前禁用该节点。如需更多信息,请参阅 第 1.2.4 节 “删除节点”

如果 Red Hat Openshift Container Storage 节点失败且要替换它,请参阅 第 1.3.2 节 “替换节点”

如果 Red Hat Openshift Container Storage 设备失败,请执行以下操作

如果 Red Hat Openshift Container Storage 设备失败,并且要删除它,则在删除前禁用该设备。如需更多信息,请参阅 第 1.2.3 节 “删除设备”

如果 Red Hat Openshift Container Storage 设备失败,且您要替换它,请参阅 第 1.3.1 节 “替换设备”

如果 Red Hat Openshift Container Storage 卷需要更多容量,请执行以下操作
您可以通过添加设备、增加集群大小或添加新集群来增加存储容量。如需更多信息,请参阅 第 1.1 节 “增加存储容量”
安装 Red Hat Openshift Container Storage 时如何升级 Openshift
要升级 Openshift Container Platform,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html/upgrading_clusters/install-config-upgrading-automated-upgrades#upgrading-to-ocp-3-10
查看日志文件
  • 查看 Red Hat Gluster Storage 容器日志

    与 Red Hat Gluster Storage 容器相关的调试信息存储在容器启动的主机上。具体来说,日志和配置文件可在运行 Red Hat Gluster Storage Server 容器的 openshift 节点上的以下位置找到:

    • /etc/glusterfs
    • /var/lib/glusterd
    • /var/log/glusterfs
  • 查看 Heketi 日志

    与 Heketi 相关的调试信息保存在容器中,或被提供给 Heketi 容器的持久性卷中。

    您可以通过在容器运行的 openshift 节点上运行 docker logs <container-id> 命令,来获取 Heketi 的日志。

heketi 命令返回没有错误或空错误

有时,运行 heketi-cli 命令返回没有错误或空错误,如 _ Error_.It 主要是因为 heketi-cli 服务器没有正确配置。您必须首先 ping 以验证 heketi 服务器是否可用,之后使用 _ curl_ 命令和 _ /hello endpoint_ 验证。

# curl http://deploy-heketi-storage-project.cloudapps.mystorage.com/hello
heketi 在载入拓扑文件时报告错误
运行 heketi-cli 报告:加载拓扑文件时错误"对开放式拓扑文件"错误。这可能是因为将旧语法使用单一连字符(-)作为 JSON 选项的前缀。您必须使用双连字符的新语法并重新载入拓扑文件。
curl 命令 heketi 服务器失败,或者没有响应

如果路由器或 heketi 没有被正确配置,则 heketi 的错误消息可能无法明确。要进行故障排除,请使用端点 ping heketi 服务,并使用 IP 地址。如果 IP 地址 ping ping 成功并且端点执行 ping 将失败,这表示路由器配置错误。

在路由器正确设置后,运行一个简单的 curl 命令,如下所示:

# curl http://deploy-heketi-storage-project.cloudapps.mystorage.com/hello

如果正确配置了 heketi,则会显示一个来自 heketi 的欢迎消息。如果没有,请检查 heketi 配置。

当使用 Red Hat Gluster Storage 卷存储 heketi.db 文件时,heketi 无法启动

当使用 Red Hat Gluster Storage 卷存储 heketi.db 并报告以下错误时,Htiti 无法启动:

[heketi] INFO 2016/06/23 08:33:47 Loaded kubernetes executor
[heketi] ERROR 2016/06/23 08:33:47 /src/github.com/heketi/heketi/apps/glusterfs/app.go:149: write /var/lib/heketi/heketi.db: read-only file system
ERROR: Unable to start application

如上所示的只读文件系统错误可在将红帽 Gluster 存储卷用作后端时看到。当仲裁丢失红帽 Gluster 存储卷时,这可能就可能是。在 replica-3 卷中,如果 3 个 brick 的 2 个 brick 停机,这将看到。您必须确保对 heketi gluster 卷满足仲裁,并且能够再次写入 heketi.db 文件。

即使您看到其他错误,也建议的做法是检查 Red Hat Gluster Storage 卷是否提供 heketi.db 文件是否可用。拒绝 heketi.db 文件的访问是其无法启动的最常见原因。

第 12 章 使用端口转发进行客户端配置

如果路由器不可用,您可能能够设置端口转发,以便 heketi-cli 可以与 Heketi 服务通信。执行以下命令进行端口转发:

  1. 运行以下命令,获取 heketi 服务 pod 名称:

    # oc get pods
  2. 要将本地系统中的端口转发到 pod,请在本地系统的另一个终端中执行以下命令:

    # oc port-forward <heketi pod name> 8080:8080
  3. 在原始终端中执行以下命令测试与服务器的通信:

    # curl http://localhost:8080/hello

    这会将本地端口 8080 转发到 pod 端口 8080。

  4. 运行以下命令设置 Heketi 服务器环境变量:

    # export HEKETI_CLI_SERVER=http://localhost:8080
  5. 运行以下命令,从 heketi 获得信息:

    # heketi-cli topology info