操作指南
配置和管理 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,使得它能够选择在 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
扩展 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'。
配置防火墙规则:
注意若要添加节点成功,请确保打开了用于 glusterd 通信的端口。有关端口的详情请参考 https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.5/html/installation_guide/port_information
在新添加的 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
重新载入/重启 iptables:
# systemctl restart iptables
执行以下步骤将标签添加到要部署 RHGS Container 的节点:
执行以下命令,验证 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
为新添加的每个节点添加标签,为该新集群添加了 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
通过执行以下命令验证 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 不健康状态)。
验证 Red Hat Gluster Storage pod 是否正在运行
# oc get pods -o wide -l glusterfs=storage-pod
使用 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
使用 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 安装中添加新集群,请执行以下命令:
执行以下命令,验证 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 来添加新主机。对要添加的所有节点重复上述步骤。
通过执行以下命令验证 Red Hat Gluster Storage pod 是否在运行:
# oc get pods
为新添加的每个节点添加标签,在其中为新集群添加 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 不健康)。
通过执行以下命令验证 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
使用以下命令在 Heketi 中创建新集群:
# heketi-cli cluster create
- 如添加新设备和添加新节点 中所述,在新创建的集群中添加节点和设备。??? ???
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。只能在禁用设备后删除设备。
使用以下命令删除设备:
# heketi-cli device remove <device_id>
例如:
# heketi-cli device remove e9ef1d9043ed3898227143add599e1f9 Device e9ef1d9043ed3898227143add599e1f9 is now removed
使用以下命令删除该设备:
# 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。只能在禁用设备后删除设备。
要删除节点,请执行以下命令:
# heketi-cli node remove <node_id>
例如:
# heketi-cli node remove 5f0af88b968ed1f01bf959fe4fe804dc Node 5f0af88b968ed1f01bf959fe4fe804dc is now removed
执行以下命令删除与节点关联的设备,因为无法删除与其关联的设备:
# heketi-cli device delete <device_id>
例如:
# heketi-cli device delete 56912a57287d07fad0651ba0003cf9aa Device 56912a57287d07fad0651ba0003cf9aa deleted
对节点上的每个设备执行 命令。
使用以下命令删除节点:
# 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
-
当使用 heketi 从 gluster 受信存储池中删除节点时,现有端点不会自动更新。
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 不允许使用另一个设备进行一对一替换。但是,如果设备失败,请按照以下示例了解替换失败设备所需的操作顺序。
使用以下命令查找失败的设备:
# 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
,它属于 ID8faade64a9c8669de204b66bc083b10das
。在与被替换设备相同的节点添加新设备。
# heketi-cli device add --name /dev/vdd --node 8faade64a9c8669de204b66bc083b10d Device added successfully
禁用失败的设备。
# heketi-cli device disable a811261864ee190941b17c72809a5001 Device a811261864ee190941b17c72809a5001 is now offline
删除失败的设备。
# heketi-cli device remove a811261864ee190941b17c72809a5001 Device a811261864ee190941b17c72809a5001 is now removed
在这个阶段,brick 从失败的设备迁移。他基于 brick 分配算法选择合适的设备。因此,可能所有 brick 不能迁移到新添加的设备。
删除失败的设备。
使用以下命令删除该设备:
# heketi-cli device delete a811261864ee190941b17c72809a5001 Device a811261864ee190941b17c72809a5001 deleted
注意-
您可以使用
--force-forget
选项以及Heketi-cli 设备删除 <device-ID>
命令来删除失败的设备。但是,建议仅在 device delete 命令失败时使用这个选项。 -
您必须确定该设备已被移除,或者系统在 heketi 之外的干净使用系统命令,然后仅使用
--force-forget
选项。
-
您可以使用
必须禁用
performance.read-ahead
选项,以允许修复完成。# gluster volume set <VOLUME> performance.read-ahead off
注意将
performance.read-ahead
选项设置为 OFF,直到完成对卷的修复任务为止,一旦修复完成,则将其设置回为 ON 状态的默认状态。- 如果超过 100,000 个条目需要修复,则必须启动额外的 shd。有关如何启动其他自我修复守护进程的详情,请参考 https://access.redhat.com/solutions/3794011
在另一个设备上重复上述步骤序列之前,您必须等待自我修复操作完成。当条目值的数目返回 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 不允许一对一替换另一个节点。但是,如果一个节点失败,请按照以下示例进行替换故障节点及其对应设备所需的操作顺序。
使用以下命令查找出现故障的节点:
# 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。
添加一个新节点,最好具有与要替换节点相同的设备。
# 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
禁用故障节点。
# heketi-cli node disable 8faade64a9c8669de204b66bc083b10d Node 8faade64a9c8669de204b66bc083b10d is now offline
删除故障的节点。
# heketi-cli node remove 8faade64a9c8669de204b66bc083b10d Node 8faade64a9c8669de204b66bc083b10d is now removed
在这个阶段,brick 从故障节点迁移。他基于 brick 分配算法选择合适的设备。
执行以下命令删除与节点关联的设备,因为无法删除与其关联的设备:
# heketi-cli device delete <device_id>
例如:
# heketi-cli device delete 56912a57287d07fad0651ba0003cf9aa Device 56912a57287d07fad0651ba0003cf9aa deleted
对节点上的每个设备执行 命令。
删除出现故障的节点。
# 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
要指定您要创建的端点,请使用基于环境创建的端点更新复制的 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 地址。
执行以下命令来创建端点:
# oc create -f <name_of_endpoint_file>
例如:
# oc create -f sample-gluster-endpoints.yaml endpoints "glusterfs-cluster" created
要验证端点是否已创建,请执行以下命令:
# 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
执行以下命令创建 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
要验证该服务是否已创建,请执行以下命令:
# 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
注意必须为每个需要持久存储的项目创建端点和服务。
从 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 卷以只读模式运行。
编辑 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": {} }
运行以下命令来创建持久性卷:
# oc create -f pv001.json
例如:
# oc create -f pv001.json persistentvolume "glusterfs-4fc22ff9" created
要验证持久性卷是否已创建,请执行以下命令:
# oc get pv
例如:
# oc get pv NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE glusterfs-4fc22ff9 100Gi RWX Available 4s
创建持久性卷声明文件。例如:
# cat pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: glusterfs-claim spec: accessModes: - ReadWriteMany resources: requests: storage: 100Gi selector: matchLabels: storage-tier: gold
执行以下命令将持久性卷绑定到持久性卷声明:
# oc create -f pvc.yaml
例如:
# oc create -f pvc.yaml persistentvolumeclaim"glusterfs-claim" created
要验证持久性卷和持久性卷声明是否已绑定,请执行以下命令:
# 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
现在可在应用程序中使用声明。例如:
# 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。
要验证 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
要验证持久性卷是否挂载到容器中,请执行以下命令:
# 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),则可以省略以下步骤。
执行以下命令为密码创建编码值:
# echo -n "<key>" | base64
其中 "key" 是部署 Red Hat Openshift Container Storage 时创建的 “admin-key” 的值
例如:
# echo -n "mypassword" | base64 bXlwYXNzd29yZA==
创建 secret 文件。下面是一个 secret 文件示例:
# cat glusterfs-secret.yaml apiVersion: v1 kind: Secret metadata: name: heketi-secret namespace: default data: # base64 encoded password. E.g.: echo -n "mypassword" | base64 key: bXlwYXNzd29yZA== type: kubernetes.io/glusterfs
通过执行以下命令在 Openshift 上注册 secret:
# oc create -f glusterfs-secret.yaml secret "heketi-secret" created
3.1.2.1.2. 注册存储类
为持久性卷置备配置 StorageClass 对象时,管理员必须描述要使用的置备程序类型,以及置备属于类的 PersistentVolume 时使用的参数。
要创建存储类执行以下命令:
# 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 节 “扩展持久性卷声明”。
要将存储类注册到 Openshift,请执行以下命令:
# oc create -f glusterfs-storageclass.yaml storageclass "gluster-container" created
要获得存储类的详情,请执行以下命令:
# 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. 创建持久性卷声明
要创建持久性卷声明,请执行以下命令:
创建持久性卷声明文件。如下提供了示例持久性卷声明:
# 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。
执行以下命令注册声明:
# oc create -f glusterfs-pvc-claim1.yaml persistentvolumeclaim "claim1" created
要获取声明的详细信息,请执行以下命令:
# 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. 验证申索创建
要验证是否创建了声明,请执行以下命令:
要获取持久性卷声明和持久性卷的详情,请执行以下命令:
# 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
要验证端点和服务是否创建在声明创建过程中,请执行以下命令:
# 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 中使用声明。
要在应用中使用声明,例如
# cat app.yaml apiVersion: v1 kind: Pod metadata: name: busybox spec: containers: - image: busybox command: - sleep - "3600" name: busybox volumeMounts: - mountPath: /usr/share/busybox name: mypvc volumes: - name: mypvc persistentVolumeClaim: claimName: claim1
# oc create -f app.yaml pod "busybox" created
有关在应用中使用 glusterfs 声明的更多信息,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-storage-examples-gluster-example。
要验证 pod 是否已创建,请执行以下命令:
# oc get pods -n storage-project NAME READY STATUS RESTARTS AGE 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
要验证持久性卷是否挂载到容器中,请执行以下命令:
# 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 的大小。
要扩展持久性卷声明值,请执行以下命令:
要检查现有的持久性卷大小,在应用程序 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。
要编辑持久性卷声明值,请执行以下命令并编辑以下存储参数:
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
要验证,在 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 被删除也是如此。
要删除声明,请执行以下命令:
# oc delete pvc <claim-name>
例如:
# oc delete pvc claim1 persistentvolumeclaim "claim1" deleted
要验证是否删除了声明,请执行以下命令:
# oc get pvc <claim-name>
例如:
# oc get pvc claim1 No resources found.
用户删除绑定到动态置备创建的持久性卷声明(除了删除持久性卷声明外),Kubernetes 也会删除持久卷、端点、服务和实际卷。如果需要验证它,请执行以下命令:
要验证持久性卷是否已删除,请执行以下命令:
# oc get pv <pv-name>
例如:
# oc get pv pvc-962aa6d1-bddb-11e6-be23-5254009fc65b No resources found.
要验证端点是否已删除,请执行以下命令:
# 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。
动态置备卷的卷安全性
动态置备程序增加了两个新参数,即 gidMin
和 gidMax
。这些值允许管理员为存储类中的卷配置 GID 范围。要设置 GID 值并为动态置备的卷提供卷安全性,请执行以下命令:
使用 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"
注意如果没有提供
gidMin
和gidMax
值,则动态置备的卷将在 2000 和 2147483647 之间拥有 GID。- 创建持久性卷声明。更多信息请参阅: 第 3.1.2.1.3 节 “创建持久性卷声明”
- 在 pod 中使用声明。确保此 pod 是无特权的。更多信息请参阅: 第 3.1.2.1.6 节 “在 Pod 中使用 Claim”
要验证 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
键和一个简单的匹配规则的新卷。
步骤
在 heketi 设备上应用所需的标签。
# heketi-cli device settags <device-name> <key>:<value>
示例:
# heketi-cli device settags 1fe1b83e5660efb53cc56433cedf7771 disktype:hdd
从设备中删除应用的标签。
# heketi-cli device rmtags <device-name> <key>
示例:
# heketi-cli device rmtags 1fe1b83e5660efb53cc56433cedf7771 disktype
验证设备上添加的标签。
# 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
使用带标记的设备创建卷。
# 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 替换目的。
-
在创建卷时,您必须传递一个新的卷选项
创建存储类。
创建仅在硬盘上创建卷的存储类。
# 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 节点上执行以下步骤:
要在必须配置启动器的所有节点上安装与启动器相关的软件包,请执行以下命令:
# yum install iscsi-initiator-utils device-mapper-multipath
要启用多路径,请执行以下命令:
# mpathconf --enable
创建以下内容并在 multipath.conf 文件中添加以下内容:
注意如果是升级,请确保仅在所有服务器节点升级后对 multipath.conf 进行更改并重新载入 multipathd。
# cat >> /etc/multipath.conf <<EOF # LIO iSCSI devices { device { vendor "LIO-ORG" user_friendly_names "yes" # names like mpatha path_grouping_policy "failover" # one path per group hardware_handler "1 alua" path_selector "round-robin 0" failback immediate path_checker "tur" prio "alua" no_path_retry 120 } } EOF
执行以下命令启动多路径守护进程并 [re] 加载多路径配置:
# systemctl start multipathd
# systemctl reload multipathd
3.2.1.1.2. 为 Heketi 身份验证创建 Secret
要为 Heketi 身份验证创建 secret,请执行以下命令:
如果在部署 Red Hat Openshift Container Storage 的过程中没有设置 admin-key
值(用于访问 heketi 来获取卷详情的 secret),则可以省略以下步骤。
执行以下命令为密码创建编码值:
# echo -n "<key>" | base64
其中
key
是部署 CNS 时创建的admin-key
的值例如:
# echo -n "mypassword" | base64 bXlwYXNzd29yZA==
创建 secret 文件。下面是一个 secret 文件示例:
# cat glusterfs-secret.yaml apiVersion: v1 kind: Secret metadata: name: heketi-secret namespace: default data: # base64 encoded password. E.g.: echo -n "mypassword" | base64 key: bXlwYXNzd29yZA== type: gluster.org/glusterblock
通过执行以下命令在 Openshift 上注册 secret:
# oc create -f glusterfs-secret.yaml secret "heketi-secret" created
3.2.1.1.3. 注册存储类
为持久性卷置备配置 StorageClass 对象时,管理员必须描述要使用的置备程序类型,以及置备属于类的 PersistentVolume 时使用的参数。
创建存储类。下面是一个存储类文件示例:
# cat > glusterfs-block-storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: gluster-block provisioner: gluster.org/glusterblock-infra-storage reclaimPolicy: Retain parameters: resturl: "http://heketi-storage-project.cloudapps.mystorage.com" restuser: "admin" restsecretnamespace: "default" restsecretname: "heketi-secret" hacount: "3" clusterids: "630372ccdc720a92c681fb928f27b53f,796e6db1981f369ea0340913eeea4c9a" chapauthenabled: "true" volumenameprefix: "test-vol"
其中,
- provisioner
置备程序名称应与
glusterblock 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 实例。所有参数都是可选的。如果省略
restsecretnamespace
和restsecretname
,则使用空密码。 - hacount
-
它是块目标服务器的路径数量。
count
通过 iSCSI 多路径功能提供高可用性。如果路径失败,则 I/O 不会中断,并通过另一个可用路径提供 I/O。 - clusterids
它是集群 ID,在置备卷时会供 heketi 使用。它还可以是用逗号分开的集群 ID 列表。这是一个可选参数。
注意要获取集群 ID,请执行以下命令:
# heketi-cli cluster list
- chapauthenabled
- 如果要使用启用 CHAP 身份验证来置备块卷,则必须将此值设置为 true。这是一个可选参数。
- volumenameprefix
这是一个可选参数。它描述了 heketi 创建的卷的名称。更多信息请参阅: 第 3.2.1.1.6 节 “(可选)为持久性卷提供自定义卷名称前缀”
注意此参数的值无法在 storageclass
中包含
_。
要将存储类注册到 Openshift,请执行以下命令:
# oc create -f glusterfs-block-storageclass.yaml storageclass "gluster-block" created
要获得存储类的详情,请执行以下命令:
# oc describe storageclass gluster-block Name: gluster-block IsDefaultClass: No Annotations: <none> Provisioner: gluster.org/glusterblock-infra-storage Parameters: chapauthenabled=true,hacount=3,opmode=heketi,restsecretname=heketi-secret,restsecretnamespace=default,resturl=http://heketi-storage-project.cloudapps.mystorage.com,restuser=admin Events: <none>
3.2.1.1.4. 创建持久性卷声明
要创建持久性卷声明,请执行以下命令:
创建持久性卷声明文件。如下提供了示例持久性卷声明:
# cat glusterfs-block-pvc-claim.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: claim1 annotations: volume.beta.kubernetes.io/storage-class: gluster-block spec: persistentVolumeReclaimPolicy: Retain accessModes: - ReadWriteOnce resources: requests: storage: 5Gi
- persistentVolumeReclaimPolicy
这是一个可选参数。如果此参数设为 "Retain",则底层的持久性卷也会保留,即使删除了对应的持久性卷声明。
注意当 PVC 被删除时,如果 "persistentVolumeReclaimPolicy:" 设置为 "Retain",则底层 heketi 和 gluster 卷不会被删除。要删除卷,您必须使用 heketi cli,然后删除 PV。
执行以下命令注册声明:
# oc create -f glusterfs-block-pvc-claim.yaml persistentvolumeclaim "claim1" created
要获取声明的详细信息,请执行以下命令:
# oc describe pvc <_claim_name_>
例如:
# oc describe pvc claim1 Name: claim1 Namespace: block-test StorageClass: gluster-block Status: Bound Volume: pvc-ee30ff43-7ddc-11e7-89da-5254002ec671 Labels: <none> Annotations: control-plane.alpha.kubernetes.io/leader={"holderIdentity":"8d7fecb4-7dba-11e7-a347-0a580a830002","leaseDurationSeconds":15,"acquireTime":"2017-08-10T15:02:30Z","renewTime":"2017-08-10T15:02:58Z","lea... pv.kubernetes.io/bind-completed=yes pv.kubernetes.io/bound-by-controller=yes volume.beta.kubernetes.io/storage-class=gluster-block volume.beta.kubernetes.io/storage-provisioner=gluster.org/glusterblock Capacity: 5Gi Access Modes: RWO Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 1m 1m 1 gluster.org/glusterblock 8d7fecb4-7dba-11e7-a347-0a580a830002 Normal Provisioning External provisioner is provisioning volume for claim "block-test/claim1" 1m 1m 18 persistentvolume-controller Normal ExternalProvisioning cannot find provisioner "gluster.org/glusterblock", expecting that a volume for the claim is provisioned either manually or via external software 1m 1m 1 gluster.org/glusterblock 8d7fecb4-7dba-11e7-a347-0a580a830002 Normal ProvisioningSucceeded Successfully provisioned volume pvc-ee30ff43-7ddc-11e7-89da-5254002ec671
3.2.1.1.5. 验证申索创建
要验证是否创建了声明,请执行以下命令:
要获取持久性卷声明和持久性卷的详情,请执行以下命令:
# oc get pv,pvc NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM STORAGECLASS REASON AGE pv/pvc-ee30ff43-7ddc-11e7-89da-5254002ec671 5Gi RWO Delete Bound block-test/claim1 gluster-block 3m NAME STATUS VOLUME CAPACITY ACCESSMODES STORAGECLASS AGE pvc/claim1 Bound pvc-ee30ff43-7ddc-11e7-89da-5254002ec671 5Gi RWO gluster-block 4m
要识别块卷和块托管卷,请参考 https://access.redhat.com/solutions/3897581
3.2.1.1.6. (可选)为持久性卷提供自定义卷名称前缀
您可以为创建的持久性卷提供自定义卷名称前缀。通过提供自定义卷名称前缀,用户现在可以基于以下方法轻松地搜索/过滤卷:
- 任何作为 storageclass 文件中的字段值 "volnameprefix" 提供的字符串。
- 持久性卷声明名称。
- 项目/命名空间名称。
要设置名称,请确保您已将参数 volumenameprefix 添加到存储类文件中。如需更多信息,请参阅 第 3.2.1.1.3 节 “注册存储类”
此参数的值无法在 storageclass 中包含
_。
要验证是否设置了自定义卷名称前缀,请执行以下命令:
# oc describe pv <pv_name>
例如:
# oc describe pv pvc-4e97bd84-25f4-11e8-8f17-005056a55501 Name: pvc-4e97bd84-25f4-11e8-8f17-005056a55501 Labels: <none> Annotations: AccessKey=glusterblk-67d422eb-7b78-4059-9c21-a58e0eabe049-secret AccessKeyNs=glusterfs Blockstring=url:http://172.31.251.137:8080,user:admin,secret:heketi-secret,secretnamespace:glusterfs Description=Gluster-external: Dynamically provisioned PV gluster.org/type=block gluster.org/volume-id=cd37c089372040eba20904fb60b8c33e glusterBlkProvIdentity=gluster.org/glusterblock glusterBlockShare=test-vol_glusterfs_bclaim1_4eab5a22-25f4-11e8-954d-0a580a830003 kubernetes.io/createdby=heketi pv.kubernetes.io/provisioned-by=gluster.org/glusterblock v2.0.0=v2.0.0 StorageClass: gluster-block-prefix Status: Bound Claim: glusterfs/bclaim1 Reclaim Policy: Delete Access Modes: RWO Capacity: 5Gi Message: Source: Type: ISCSI (an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod) TargetPortal: 10.70.46.177 IQN: iqn.2016-12.org.gluster-block:67d422eb-7b78-4059-9c21-a58e0eabe049 Lun: 0 ISCSIInterface default FSType: xfs ReadOnly: false Portals: [10.70.46.142 10.70.46.4] DiscoveryCHAPAuth: false SessionCHAPAuth: true SecretRef: {glusterblk-67d422eb-7b78-4059-9c21-a58e0eabe049-secret } InitiatorName: <none> Events: <none>
glusterBlockShare 的值将附加至命名空间的自定义卷名称前缀,此时为 "test-vol"。
3.2.1.1.7. 在 Pod 中使用 Claim
执行以下步骤以在 pod 中使用声明。
要在应用中使用声明,例如
# cat app.yaml apiVersion: v1 kind: Pod metadata: name: busybox spec: containers: - image: busybox command: - sleep - "3600" name: busybox volumeMounts: - mountPath: /usr/share/busybox name: mypvc volumes: - name: mypvc persistentVolumeClaim: claimName: claim1
# oc create -f app.yaml pod "busybox" created
有关在应用中使用 glusterfs 声明的更多信息,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-storage-examples-gluster-example。
要验证 pod 是否已创建,请执行以下命令:
# oc get pods -n storage-project NAME READY STATUS RESTARTS AGE block-test-router-1-deploy 0/1 Running 0 4h busybox 1/1 Running 0 43s glusterblock-provisioner-1-bjpz4 1/1 Running 0 4h glusterfs-7l5xf 1/1 Running 0 4h glusterfs-hhxtk 1/1 Running 3 4h glusterfs-m4rbc 1/1 Running 0 4h heketi-1-3h9nb 1/1 Running 0 4h
要验证持久性卷是否挂载到容器中,请执行以下命令:
# oc rsh busybox
/ # df -h Filesystem Size Used Available Use% Mounted on /dev/mapper/docker-253:1-11438-39febd9d64f3a3594fc11da83d6cbaf5caf32e758eb9e2d7bdd798752130de7e 10.0G 33.9M 9.9G 0% / tmpfs 3.8G 0 3.8G 0% /dev tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup /dev/mapper/VolGroup00-LogVol00 7.7G 2.8G 4.5G 39% /dev/termination-log /dev/mapper/VolGroup00-LogVol00 7.7G 2.8G 4.5G 39% /run/secrets /dev/mapper/VolGroup00-LogVol00 7.7G 2.8G 4.5G 39% /etc/resolv.conf /dev/mapper/VolGroup00-LogVol00 7.7G 2.8G 4.5G 39% /etc/hostname /dev/mapper/VolGroup00-LogVol00 7.7G 2.8G 4.5G 39% /etc/hosts shm 64.0M 0 64.0M 0% /dev/shm /dev/mpatha 5.0G 32.2M 5.0G 1% /usr/share/busybox tmpfs 3.8G 16.0K 3.8G 0% /var/run/secrets/kubernetes.io/serviceaccount tmpfs 3.8G 0 3.8G 0% /proc/kcore tmpfs 3.8G 0 3.8G 0% /proc/timer_list tmpfs 3.8G 0 3.8G 0% /proc/timer_stats tmpfs 3.8G 0 3.8G 0% /proc/sched_debug
3.2.1.1.8. 删除持久性卷声明
如果在注册 storageclass 时,如果 "persistentVolumeReclaimPolicy" 参数被设置为 "Retain",则底层 PV 和对应卷即使 PVC 被删除也是如此。
要删除声明,请执行以下命令:
# oc delete pvc <claim-name>
例如:
# oc delete pvc claim1 persistentvolumeclaim "claim1" deleted
要验证是否删除了声明,请执行以下命令:
# oc get pvc <claim-name>
例如:
# oc get pvc claim1 No resources found.
用户删除绑定到动态置备创建的持久性卷声明(除了删除持久性卷声明外),Kubernetes 也会删除持久卷、端点、服务和实际卷。如果需要验证它,请执行以下命令:
要验证持久性卷是否已删除,请执行以下命令:
# oc get pv <pv-name>
例如:
# oc get pv pvc-962aa6d1-bddb-11e6-be23-5254009fc65b No resources found.
下一步:如果您要安装 Red Hat Openshift Container Storage 3.11,而您希望使用块存储作为日志记录和指标的后端存储,请参阅 第 7 章 Gluster Block Storage 作为日志记录和指标的后端。
3.2.2. 替换块存储中的块
如果要替换来自资源不足或有故障的节点的块,它可以被替换为到新节点。
要使用新的 IP 更新 Gluster 块 PV,在节点替换中引用 https://access.redhat.com/solutions/5042501
执行以下命令:
执行以下命令从 heketi 获取区域和集群信息
# heketi-cli topology info --user=<user> --secret=<user key>
- --user
- heketi 用户
- --secret
- 指定用户的 secret key
- 获取集群 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
执行以下命令添加设备
# 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
在新节点及其关联的设备添加到 heketi 后,可以从 heketi 中移除错误或不需要的节点
要从 heketi 中删除任何节点,请按照这个工作流操作:
- 节点禁用(通过下下下放置节点来允许节点使用)
- 节点替换(从 Heti 中删除节点及其所有关联设备)
- 设备删除(从 Heketi 节点中删除设备)
- 节点删除(从 Heketi 管理中删除节点)
执行以下命令从 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
执行以下命令获取节点的节点信息,必须从 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
执行以下命令禁止节点被 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
执行以下命令从 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
执行以下命令从 heketi 节点中删除设备:
# heketi-cli device delete <device-id> --user=<user> --secret=<user key>
例如:
# heketi-cli device delete 0fca78c3a94faabfbe5a5a9eef01b99c --user=admin --secret=adminkey Device 0fca78c3a94faabfbe5a5a9eef01b99c deleted
执行以下命令从 Heketi 管理中删除节点:
#heketi-cli node delete <nodeid> --user=<user> --secret=<user key>
例如:
# heketi-cli node delete ab37fc5aabbd714eb8b09c9a868163df --user=admin --secret=adminkey Node ab37fc5aabbd714eb8b09c9a868163df deleted
在其中一个 gluster pod 上执行以下命令将故障节点替换为新节点:
执行以下命令获取托管在 block-hosting-volume 下的块卷列表:
# gluster-block list <block-hosting-volume> --json-pretty
执行以下命令以获取托管块卷的服务器列表,还要保存 GBID 和 PASSWORD 值供以后使用:
# gluster-block info <block-hosting-volume>/<block-volume> --json-pretty
执行以下命令将有问题的节点替换为新节点:
# 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" }
注意只有在被替换的块仍在使用时才执行后续步骤。
如果块卷当前未挂载,请跳过这一步。如果应用程序正在使用块卷,则需要在启动器一端重新加载映射程序设备。
确定 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
在 initiator 节点上执行以下命令查找映射程序设备:
# mount | grep <targetname>
重新载入映射程序设备:
# 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
通过在 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.
要重新发现新节点,请执行以下命令:
# 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
通过执行以下操作登录到新门户:
更新身份验证凭据(从第 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>
登录到新门户
# 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
要验证启用的主机卷是否已替换并成功运行,请在 initiator 中执行以下命令:
# ll /dev/disk/by-path/ip-* | grep <targetname> | grep <“new node ip”>
3.2.3. 块卷扩展
您可以扩展块持久性卷声明,以增加应用程序 pod 上的存储量。执行此操作有两种方法:重新调整大小和在线大小。
3.2.3.1. 离线调整大小
在扩展块 PVC 之前,请确保块托管卷有足够大小。
要获得 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"
要获得块卷 ID,请执行以下命令:
# heketi-cli blockvolume info <block-volume-id>
要获得块托管卷信息,请执行以下命令:
# heketi-cli volume info <block-hosting-volume-id>
注意确定您有足够的可用大小。
- 关闭应用容器集。
要通过 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
注意在 展开 输出中,确保 Size 和 UsableSize 匹配。当大小和 Usable Size 匹配时,可以执行第 4 到 8 步。
将
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
要验证 pod 日志的新大小,请执行以下命令:
# oc logs refresh-block-size-xxxxx
注意确保
df -Th
输出 postxfs_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
运行以下命令检查作业是否成功:
# oc get jobs NAME DESIRED SUCCESSFUL AGE refresh-block-size 1 1 36m
要在成功后删除作业,请执行以下命令:
# oc delete job refresh-block-size job.batch "refresh-block-size" deleted
- 您可以在启动应用程序 pod 后使用新大小。
3.2.3.2. 在线重新定义大小
在扩展块 PVC 之前,请确保块托管卷有足够大小。
要获得 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"
要获得块卷 ID,请执行以下命令:
# heketi-cli blockvolume info <block-volume-id>
要获得块托管卷信息,请执行以下命令:
# heketi-cli volume info <block-hosting-volume-id>
注意确定您有足够的可用大小。
要通过 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
注意在 展开 输出中,确保 Size 和 UsableSize 匹配。当大小和 Usable Size 匹配时,可以执行第 3 到 9 步。
要获得映射到 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
登录到应用容器集的主机节点。
要获得应用程序 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
要登录到应用程序 pod 的主机节点,请执行以下命令:
# ssh <NODE-NAME>
例如:
# ssh dhcp53-203.lab.eng.blr.redhat.com
复制多路径映射设备名称(如 mpatha) , ,current size of individual path(例如 sdd、sde 和 sdf)和映射程序设备以便进一步参考。
# 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
您可以使用第 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
要刷新多路径设备大小,请执行以下命令。
-
从
lsblk
输出中获取多路径映射设备名称,获取第 6 步。 要刷新 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
-
从
要增大文件系统布局,请执行以下命令:
# 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
- 现在,您可以在不重启应用程序 pod 的情况下使用新大小。
第 4 章 关闭 gluster-block 客户端节点
按照以下步骤关闭 gluster-block 客户端节点:
- 撤离 pod。更多信息请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/cluster_administration/#evacuating-pods-on-nodes
- 确保系统中不存在 gluster 块挂载。
- 重新引导节点。更多信息请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/cluster_administration/#rebooting-nodes
第 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 兼容对象存储:
(可选):如果要为 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
执行以下命令标记 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
创建 GlusterFS StorageClass 文件。使用当前设置的
HEKETI_URL
和NAMESPACE
,并设置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。
使用存储类创建持久性卷声明。
# 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
使用模板启动 glusters3 对象存储服务。设置
S3_account
名称、S3_USER
名称和S3_PASSWORD
。PVC
和META_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.
执行以下命令验证 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 主控机。
现在,验证模型已被设置,以一个用户身份登录,如 admin/admin:
# oc login openshift master e.g. https://1.1.1.1:8443 --username=admin --password=admin
为 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 启用为用于日志记录的后端:
- 要在 Openshift Container Platform 中启用日志记录,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-aggregate-logging
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"
- 运行 Ansible playbook。如需更多信息,请参阅https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-aggregate-logging。
要验证,请执行以下命令:
# oc get pods -n openshift-logging
7.3. 将 Gluster 块存储启用为指标的后端
按照下方所述的任务,将 Gluster 块存储作为指标的后端
默认情况下,由于容器原生虚拟化执行三向复制,因此可以从集群中的任何位置访问重启的节点。因此,建议关闭 Cassandra 级别复制以避免容量开销
- 要在 Openshift Container Platform 中启用指标,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-cluster-metrics
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"
- 运行 Ansible playbook。如需更多信息,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-cluster-metrics。
要验证,请执行以下命令:
# oc get pods --namespace openshift-infra
它应该列出以下 pod 正在运行:
heapster-cassandra heapster-metrics hawkular-&*9
7.4. 验证 Gluster 块是否设置为后端
执行以下命令验证 gluster 块是否设置为用于日志记录和指标的后端:
要获得基础架构概述,请执行以下命令:
# oc get pods -n logging -o jsonpath='{range .items[].status.containerStatuses[]}{"Name: "}{.name}{"\n "}{"Image: "}{.image}{"\n"}{" State: "}{.state}{"\n"}{end}'
要获取所有持久性卷声明的详情,请执行以下命令:
# oc get pvc
要获取 pvc 的详细信息,请执行以下命令:
# oc describe pvc <claim_name>
验证卷是否可挂载,并且权限允许读/写。另外,PVC 声明名称应与动态置备的 gluster 块存储类匹配。
部分 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 节点。
创建 /var/lib/glusterd/secure-access 文件。
# touch /var/lib/glusterd/secure-access
在客户端上
在客户端(即红帽 Gluster 存储不在运行)的所有 OpenShift 节点上执行以下操作。
创建 /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 节点。
- 在继续执行后续步骤前,请确保部署了 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
您可以创建静态置备的卷,也可以创建动态置备的卷。有关静态置备卷的更多信息,请参阅 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"
运行以下命令来停止卷:
# 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"的值。
设置要访问该卷的所有服务器的通用名称列表。确保包含被允许访问该卷的客户端的通用名称。
# oc rsh <gluster_pod_name> gluster volume set VOLNAME auth.ssl-allow 'server1,server2,server3,client1,client2,client3'
注意如果将 auth.ssl-allow 选项设为 * 值,则任何通过 TLS 验证的客户端都可以从应用程序端挂载和访问卷。因此,您可以将选项的值设置为 *,或者提供客户端以及受信存储池中节点的通用名称。
在该卷上启用 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
启动卷。
# 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 节点。
- 停止所有具有红帽 Gluster 存储卷的应用 pod。
停止卷。
# oc rsh <gluster_pod_name> gluster volume stop VOLNAME
gluster pod 名称是卷所属的受信存储池其中一个红帽 Gluster 存储 pod 的名称。
设置允许访问卷的客户端的通用名称列表。务必包含所有服务器的通用名称。
# oc rsh <gluster_pod_name> gluster volume set VOLNAME auth.ssl-allow 'server1,server2,server3,client1,client2,client3'
注意如果将 auth.ssl-allow 选项设为 * 值,则任何通过 TLS 验证的客户端都可以从应用程序端挂载和访问卷。因此,您可以将选项的值设置为 *,或者提供客户端以及受信存储池中节点的通用名称。
使用以下命令在卷中启用 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
启动卷。
# oc rsh <gluster_pod_name> gluster volume start VOLNAME
- 启动应用 pod 以使用加密的红帽 Gluster 存储卷。
8.3.2. 启用管理加密
虽然建议使用管理加密,尽管红帽 Gluster 存储只能针对 I/O 加密进行配置,而无需使用管理加密。在现有的安装中,运行服务器和客户端时,调度卷、应用程序、客户端和其他最终用户的停机时间,以启用管理加密。
您目前无法动态更改未加密的和加密连接。如果在连接管理加密时运行,则服务器和客户端上的 brick 和其他本地服务从 glusterd 接收通知。
- 停止所有具有红帽 Gluster 存储卷的应用 pod。
停止所有卷。
# oc rsh <gluster_pod_name> gluster volume stop VOLNAME
停止红帽 Gluster 存储 Pod。
# oc delete daemonset glusterfs-storage
在删除守护进程时,设置 pod 会关闭。要验证 pod 是否已关闭,请执行以下命令:
# oc get pods
在所有 OpenShift 节点上创建 /var/lib/glusterd/secure-access 文件。
# touch /var/lib/glusterd/secure-access
通过执行以下命令创建 Red Hat Gluster Storage daemonset:
注意对于 Ansible 部署,镜像名称和版本必须在模板中指定,然后才能执行 命令。
# oc process glusterfs | oc create -f -
创建守护进程时,pod 已启动。要验证 pod 是否已启动,请执行以下命令:
# oc get pods
启动所有卷。
# oc rsh <gluster_pod_name> gluster volume start VOLNAME
- 启动应用容器集以使用加密红帽 Gluster 存储的管理。
8.4. 禁用加密
您可以在以下两个场景中在 Red Hat Openshift Container Storage 设置中禁用加密:
- 禁用卷的 I/O 加密
- 禁用管理加密
8.4.1. 禁用所有卷的 I/O 加密
执行以下命令禁用卷的服务器和客户端之间的 I/O 加密:
服务器是运行红帽 Gluster 存储容器集的 OpenShift 节点。
客户端是 Red Hat Gluster Storage 未运行的其他 OpenShift 节点。
- 停止所有具有红帽 Gluster 存储卷的应用 pod。
停止所有卷。
# oc rsh <gluster_pod_name> gluster volume stop VOLNAME
重置卷的所有加密选项:
# 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
在所有 OpenShift 节点上使用以下命令删除用于网络加密的文件:
# rm /etc/ssl/glusterfs.pem /etc/ssl/glusterfs.key /etc/ssl/glusterfs.ca
注意在启用管理加密后,删除设置中的这些文件将导致所有 gluster pod 失败 glusterd,因此应避免。
停止红帽 Gluster 存储 Pod。
# oc delete daemonset glusterfs
在删除守护进程时,设置 pod 会关闭。要验证 pod 是否已关闭,请执行以下命令:
# oc get pods
通过执行以下命令创建 Red Hat Gluster Storage daemonset:
注意对于 Ansible 部署,镜像名称和版本必须在模板中指定,然后才能执行 命令。
# oc process glusterfs | oc create -f -
创建守护进程时,pod 已启动。要验证 pod 是否已启动,请执行以下命令:
# oc get pods
启动卷。
# oc rsh <gluster_pod_name> gluster volume start VOLNAME
- 启动应用 pod 以使用加密的红帽 Gluster 存储卷。
8.4.2. 禁用管理加密
您目前无法动态更改未加密的和加密连接。如果在连接管理加密时运行,则服务器和客户端上的 brick 和其他本地服务从 glusterd 接收通知。
执行以下命令来禁用管理加密
- 停止所有具有红帽 Gluster 存储卷的应用 pod。
停止所有卷。
# oc rsh <gluster_pod_name> gluster volume stop VOLNAME
停止红帽 Gluster 存储 Pod。
# oc delete daemonset glusterfs
在删除守护进程时,设置 pod 会关闭。要验证 pod 是否已关闭,请执行以下命令:
# oc get pods
删除所有 OpenShift 节点上的 /var/lib/glusterd/secure-access 文件,以禁用管理加密。
# rm /var/lib/glusterd/secure-access
在所有 OpenShift 节点上使用以下命令删除用于网络加密的文件:
# rm /etc/ssl/glusterfs.pem /etc/ssl/glusterfs.key /etc/ssl/glusterfs.ca
通过执行以下命令创建 Red Hat Gluster Storage daemonset:
注意对于 Ansible 部署,镜像名称和版本必须在模板中指定,然后才能执行 命令。
# oc process glusterfs | oc create -f -
创建守护进程时,pod 已启动。要验证 pod 是否已启动,请执行以下命令:
# oc get pods
启动所有卷。
# oc rsh <gluster_pod_name> gluster volume start VOLNAME
- 启动应用容器集以使用加密红帽 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 是否已正确部署,请执行以下命令:
在 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
要验证 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
要验证端点是否已创建,请执行以下命令:
# 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
要验证持久性卷是否已创建,请执行以下命令:
# oc get pv NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE registry-volume 5Gi RWX Retain Bound default/registry-claim 7d
要获取为 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 项目中执行。
登录到 默认项目 :
# oc project default
例如:
# oc project default Now using project "default" on server "https://cns30.rh73:8443"
执行以下命令创建 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)中有一个服务和一个端点。
编辑 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
执行以下命令创建端点:
# oc create -f gluster-registry-endpoints.yaml endpoints "gluster-registry-endpoints" created
要验证端点的创建,请执行以下命令:
# 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
执行以下命令创建 gluster-registry-service.yaml 文件:
oc get services <heketi-storage-endpoint-name> -o yaml --namespace=<project-name> > gluster-registry-service.yaml
编辑 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: {}
执行以下命令来创建服务:
# oc create -f gluster-registry-service.yaml services "gluster-registry-service" created
执行以下命令验证服务是否正在运行:
# 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
执行以下命令以获取现有 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)}}')
执行以下命令创建卷
# heketi-cli volume create --size=5 --name=gluster-registry-volume --gid=${GID}
为 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
执行以下命令来创建持久性卷:
# oc create -f gluster-registry-volume.yaml
执行以下命令验证并获取所创建持久性卷的详情:
# oc get pv/gluster-registry-volume NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE gluster-registry-volume 5Gi RWX Retain Available 21m
创建新的持久性卷声明。以下是一个持久性卷声明示例,它将用于替换现有的 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
通过执行以下命令创建持久性卷声明:
# oc create -f gluster-registry-claim.yaml
例如:
# oc create -f gluster-registry-claim.yaml persistentvolumeclaim "gluster-registry-claim" created
执行以下命令验证声明是否绑定:
# 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
通过执行以下命令使 registry 只读:
# oc set env -n default dc/docker-registry 'REGISTRY_STORAGE_MAINTENANCE_READONLY={"enabled":true}'
要确认值设为只读,请执行以下命令:
# oc set env -n default dc/docker-registry --list
如果要将数据从旧 registry 迁移到 Red Hat Gluster Storage registry,请执行以下命令:
注意这些步骤是可选的。
通过执行以下命令将 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
运行以下命令来保存 Registry pod 名称:
# export REGISTRY_POD=$(oc get po --selector="docker-registry=default" -o go-template --template='{{printf "%s" ((index .items 0).metadata.name)}}')
通过执行以下命令,将旧 registry 目录中的数据复制到 Red Hat Gluster Storage registry 目录中:
# oc rsh -T $REGISTRY_POD cp -aTv /registry/ /gluster-registry/
通过执行以下命令,从旧的 dc registry 中删除 Red Hat Gluster Storage registry:
# oc volume dc/docker-registry --remove --name=gluster-registry-storage
将现有的 registry-storage 卷替换为新的 gluster-registry-claim PVC:
# oc set volume dc/docker-registry --add --name=registry-storage -t pvc --claim-name=gluster-registry-claim --overwrite
通过执行以下命令使 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 指标,请执行以下命令:
将注解添加到
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
为 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)。
-
重启
prometheus-0
pod,以查询 Prometheus 中的 Heketi 指标。
10.3. 在 OpenShift 3.11 中启用 heketi 指标
在 OCP 3.11 中,Prometheus 使用 servicemonitors,这是 Prometheus Operator 引入的新资源。需要为每个存储命名空间创建 servicemonitor,并描述了要监控的目标集合。
要在 OCP 3.11 中查看 Prometheus 上的 Heketi 指标,请执行以下命令:
在
heketi-storage
服务中添加注解。# oc project app-storage # oc annotate svc heketi-storage prometheus.io/scheme=http # oc annotate svc heketi-storage prometheus.io/scrape=true
使用以下模板在 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
- 如果您有多个 OCS 集群,则需要使用上述步骤为每个 OCS 集群创建一个 servicemonitor。
执行以下命令向 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"
- 几分钟后,Prometheus 会加载新的服务监视器。
10.4. 查看指标
查看任何指标:
- 在 Prometheus 中添加指标名称,再单击 Execute。
在 Graph 选项卡中,卷指标的值显示为图形。
例如,在以下镜像中,检查可用的字节数
kubelet_volume_stats_available_bytes
指标已添加到 Prometheus 的搜索栏中。在点 Execute 时,可用的字节数被描述为图形。您可以在行上悬停鼠标以获取更多详细信息。(要查看镜像详情,请右键单击并选择 View Image.)
部分 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 服务通信。执行以下命令进行端口转发:
运行以下命令,获取 heketi 服务 pod 名称:
# oc get pods
要将本地系统中的端口转发到 pod,请在本地系统的另一个终端中执行以下命令:
# oc port-forward <heketi pod name> 8080:8080
在原始终端中执行以下命令测试与服务器的通信:
# curl http://localhost:8080/hello
这会将本地端口 8080 转发到 pod 端口 8080。
运行以下命令设置 Heketi 服务器环境变量:
# export HEKETI_CLI_SERVER=http://localhost:8080
运行以下命令,从 heketi 获得信息:
# heketi-cli topology info