简化 Ceph 对象部署:使用新的 Cephadm 功能的生产就绪型 Ceph 对象网关 (RGW)
简介 ¶
部署一个生产就绪的对象存储解决方案可能具有挑战性,尤其是在管理复杂的配置要求(包括 SSL/TLS 加密、最佳数据放置和多站点复制)时。 在部署过程中,很容易忽略配置选项,这些选项在系统上线投入生产后至关重要。
传统上,为 Ceph 配置高可用性、安全性和高效的数据处理需要用户根据自身需求手动调整多个参数,例如多站点复制、加密和高可用性。 这种初始复杂性使得实现生产就绪的对象存储配置变得繁琐。
为了应对这些挑战,我们向 Ceph 的编排器引入了几个新功能,以简化 Ceph RGW 及其相关服务的部署。 增强 Ceph 对象网关和 Ingress 服务规范文件,只需几个配置步骤即可实现开箱即用的、生产就绪的 RGW 设置。 这些增强功能包括自动 SSL/TLS 配置、虚拟主机存储桶访问支持、用于经济高效数据存储的擦除编码等。
这些改进旨在为管理员提供无缝的部署体验,确保 Ceph 对象网关和 Ingress 服务(负载均衡器)的安全、可扩展且生产就绪的配置。
在本博客文章中,我们将探讨这些新功能中的每一个,讨论它们解决的问题,并演示如何使用 cephadm 规范文件轻松配置它们,从而在几分钟内实现完全可操作的 Ceph 对象网关设置。
功能亮点 ¶
虚拟主机存储桶访问和自签名证书 ¶
部署 RGW 的主要挑战之一是确保使用虚拟主机风格的 URL 无缝访问存储桶。 对于依赖虚拟主机存储桶访问的应用程序和用户,包含必要的受众替代名称 (SAN) 的适当 SSL/TLS 证书至关重要。 为了简化此过程,我们添加了自动为对象网关生成自签名证书的选项,如果用户未提供自定义证书。 这些自签名证书包含 SAN 条目,允许 TLS/SSL 与虚拟主机存储桶访问无缝协作。
完整的 TLS/SSL 客户端到 RGW 加密 ¶
安全性是任何生产级部署的首要任务,Ceph 社区越来越需要从客户端到对象网关服务的完整 TLS/SSL 加密。 以前,我们的 Ingress 实现仅支持在 HAProxy 级别终止 SSL,这意味着 HAProxy 和 RGW 之间的通信无法加密。
为了解决这个问题,我们添加了可配置的选项,允许用户选择是否重新加密 HAProxy 和 RGW 之间的流量,或者使用直通模式,在这种模式下,TLS 连接从客户端到 RGW 保持不变。 这种灵活性允许用户实现完整的端到端加密,确保敏感数据在传输过程中始终受到保护。
多站点复制配置 ¶
过去,Ceph 多站点部署涉及运行许多命令来配置您的 Realm、zonegroup 和 zone,以及建立参与多站点复制的 zone 之间的关系。 借助 RGW 管理器模块,多站点引导和配置现在可以分两步完成。 对象存储复制博客文章中有一个示例。
在 Squid 版本中,我们还添加了通过 cephadm 规范文件和 RGW 规范文件选项配置专门用于客户端流量的 Ceph 对象网关的可能性
disable_multisite_sync_traffic: True
在博客文章《Ceph 对象存储多站点复制系列。第三部分》中介绍了将 Ceph 对象网关专门用于特定任务的优势
在引导期间,在规范文件中配置您的擦除编码数据池。 ¶
对象存储通常使用擦除编码来降低对象存储解决方案的 TCO。 我们已包含在规范文件中配置擦除编码 (EC) 池的选项。 这允许用户定义 RGW 数据池的 EC 配置文件、设备类和故障域,从而控制数据放置和存储效率。
Ceph 对象部署演练 ¶
如果您不熟悉 Ceph 和 cephadm,那么《使用 Cephadm 和 Ansible 自动化 Ceph 集群部署(第一部分)》博客文章将为您提供 cephadm 的良好概述,以及我们如何使用声明式 YAML 规范文件定义 Ceph 服务的期望状态来部署和配置 Ceph。
下面,我们将逐步介绍使用 cephadm 编排器新增功能部署生产就绪 RGW 设置所需的 CLI 命令。
启用 RGW 管理器模块 ¶
第一步是启用 RGW 管理器模块。 此模块是必需的,才能通过 cephadm 管理 RGW 服务。
# ceph mgr module enable rgw
接下来,我们为对象网关服务创建一个规范文件。 此规范文件包括 realm、zone 和 zonegroup 设置、SSL/TLS、数据池的 EC 配置文件等。
# cat << EOF > /root/rgw-client.spec
service_type: rgw
service_id: client
service_name: rgw.client
placement:
label: rgw
count_per_host: 1
networks:
- 192.168.122.0/24
spec:
rgw_frontend_port: 4443
rgw_realm: multisite
rgw_zone: zone1
rgw_zonegroup: multizg
generate_cert: true
ssl: true
zonegroup_hostnames:
- s3.cephlab.com
data_pool_attributes:
type: ec
k: 2
m: 2
extra_container_args:
- "--stop-timeout=120"
config:
rgw_exit_timeout_secs: "120"
rgw_graceful_stop: true
EOF
在此规范文件中,我们指定 RGW 服务应使用 2+2 配置文件 (k: 2, m: 2) 进行擦除编码,用于数据池,这与复制设置相比可降低存储成本。 我们还生成一个自签名证书 (generate_cert: true),用于 RGW 服务,以确保安全的 SSL/TLS 通信。 通过 zonegroup_hostnames,我们使用指定的域名 bucket.s3.cephlab.com 启用虚拟主机存储桶访问。 借助 config 参数 rgw_gracefull_stop,我们配置对象网关服务的优雅停止。 在优雅停止期间,该服务将等待所有客户端连接关闭(已排空),受 120 秒超时限制。
引导 RGW Realm ¶
创建规范文件后,我们引导 RGW 服务。 此步骤使用规范文件中指定的配置创建和部署 RGW 服务。
# ceph rgw realm bootstrap -i rgw-client.spec
验证 RGW 服务 ¶
cephadm bootstrap 命令将异步应用规范文件中定义的配置。 很快,RGW 服务将启动并运行,我们可以使用 ceph orch ps 命令 验证其状态。
# ceph orch ps --daemon_type rgw
NAME HOST PORTS STATUS REFRESHED AGE MEM USE MEM LIM VERSION IMAGE ID CONTAINER ID
rgw.client.ceph-node-05.yquamf ceph-node-05.cephlab.com 192.168.122.175:4443 running (32m) 94s ago 32m 91.2M - 19.2.0-53.el9cp fda78a7e8502 a0c39856ddd8
rgw.client.ceph-node-06.zfsutg ceph-node-06.cephlab.com 192.168.122.214:4443 running (32m) 94s ago 32m 92.9M - 19.2.0-53.el9cp fda78a7e8502 82c21d350cb7
此输出显示 RGW 服务在指定的节点上运行,并且可以通过配置的 4443/tcp 端口访问。
验证数据池 ¶
要验证 RGW 数据池是否已正确配置为使用擦除编码,我们可以使用以下命令
# ceph osd pool ls detail | grep data
pool 24 'zone1.rgw.buckets.data' erasure profile zone1_zone_data_pool_ec_profile size 4 min_size 3 crush_rule 1 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 258 lfor 0/0/256 flags hashpspool stripe_width 8192 application rgw
查看擦除编码配置文件 ¶
要获取有关数据池使用的擦除编码配置文件的更多详细信息,我们可以运行以下命令
# ceph osd erasure-code-profile get zone1_zone_data_pool_ec_profile
crush-device-class=
crush-failure-domain=host
crush-num-failure-domains=0
crush-osds-per-failure-domain=0
crush-root=default
jerasure-per-chunk-alignment=false
k=2
m=2
plugin=jerasure
technique=reed_sol_van
w=8
这确认擦除编码配置文件配置为 k=2 和 m=2,并使用 Reed-Solomon 技术。
配置 Ingress 服务 ¶
最后,我们必须配置 Ingress 服务以将流量负载均衡到多个 RGW 守护程序。 我们为 Ingress 服务创建一个规范文件
# cat << EOF > rgw-ingress.yaml
service_type: ingress
service_id: rgw
placement:
hosts:
- ceph-node-06.cephlab.com
- ceph-node-07.cephlab.com
spec:
backend_service: rgw.client
virtual_ip: 192.168.122.152/24
frontend_port: 443
monitor_port: 1967
use_tcp_mode_over_rgw: True
EOF
此规范文件使用虚拟 (浮动) IP (VIP) 地址 192.168.122.152 设置 Ingress 服务,并指定它应使用 TCP 模式与对象网关通信,以确保在整个过程中保持 SSL/TLS。 通过 backend_service,我们指定要用作 HAproxy 后端的 RGW 服务,因为 Ceph 集群可以运行多个不相关的 RGW 服务。
测试负载均衡器和 SSL/TLS 配置 ¶
我们的 Ingress 服务堆栈使用 keepalived 实现 VIP 的 HA,HAproxy 负责负载均衡
# ceph orch ps --service_name ingress.rgw
NAME HOST PORTS STATUS REFRESHED AGE MEM USE MEM LIM VERSION IMAGE ID CONTAINER ID
haproxy.rgw.ceph-node-06.vooxuh ceph-node-06.cephlab.com *:443,1967 running (58s) 46s ago 58s 5477k - 2.4.22-f8e3218 0d25561e922f 4cd458e1f6b0
haproxy.rgw.ceph-node-07.krdmsb ceph-node-07.cephlab.com *:443,1967 running (56s) 46s ago 56s 5473k - 2.4.22-f8e3218 0d25561e922f 4d18247e7615
keepalived.rgw.ceph-node-06.cwraia ceph-node-06.cephlab.com running (55s) 46s ago 55s 1602k - 2.2.8 6926947c161f 50fd6cf57187
keepalived.rgw.ceph-node-07.svljiw ceph-node-07.cephlab.com running (53s) 46s ago 53s 1598k - 2.2.8 6926947c161f aaab5d79ffdd
当我们在运行服务的 ceph-node-06 上检查 haproxy 配置时,我们确认我们正在使用 TCP 直通配置我们的对象网关服务的后端。
# ssh ceph-node-06.cephlab.com cat /var/lib/ceph/93d766b0-ae6f-11ef-a800-525400ac92a7/haproxy.rgw.ceph-node-06.vooxuh/haproxy/haproxy.cfg | grep -A 10 "frontend frontend"
...
backend backend
mode tcp
balance roundrobin
option ssl-hello-chk
server rgw.client.ceph-node-05.yquamf 192.168.122.175:4443 check weight 100 inter 2s
server rgw.client.ceph-node-06.zfsutg 192.168.122.214:4443 check weight 100 inter 2s
要验证 SSL/TLS 配置是否正常工作,我们可以使用 curl 测试端点。 我们可以看到,CA 不受运行 curl 命令的客户端系统信任
# curl https://192.168.122.152
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it.
要解决此问题,我们需要将 cephadm 根 CA 证书添加到客户端系统的信任存储中
# ceph orch cert-store get cert cephadm_root_ca_cert > /etc/pki/ca-trust/source/anchors/cephadm-root-ca.crt
# update-ca-trust
更新信任存储后,我们可以再次测试
# curl https://s3.cephlab.com
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID></Owner><Buckets></Buckets></ListAllMyBucketsResult>
这确认自签名 SSL/TLS 证书配置正常工作,并且可以使用 HTTPS 访问 RGW 服务。 正如您所见,我们已配置 DNS 子域 s3.cephlab.com 和通配符 *.s3.cephlab.com 指向我们的 VIP 地址 192.168.122.152。 此外,重要的是要提及,您可以配置多个 VIP 地址,因此并非所有流量都通过单个 haproxy LB 节点,当使用 VIP IP 列表时,您需要使用选项:virtual_ips_list
结论 ¶
cephadm 编排器中的这些新功能代表着 Ceph RGW 部署更加易于访问、安全和生产就绪的重要一步。 通过自动化复杂的配置(例如 SSL/TLS 加密、虚拟主机存储桶访问、多站点复制和擦除编码),管理员现在可以部署一个准备好投入生产的 RGW 设置,而无需进行手动干预。
有关 Squid 版本的更多详细信息,请查看 Laura Flores 的 博客文章
请注意,此处描述的一些功能可能在 Squid 19.2.2 版本之前不可用。
脚注 ¶
作者谨此感谢 IBM 对社区的支持,通过促使我们有时间创建这些帖子。