简化 Ceph 对象部署:使用新的 Cephadm 功能的生产就绪型 Ceph 对象网关 (RGW)

2024年12月28日 Daniel Parkes, Anthony D'Atri (IBM)

简介

部署一个生产就绪的对象存储解决方案可能具有挑战性,尤其是在管理复杂的配置要求(包括 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=2m=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 对社区的支持,通过促使我们有时间创建这些帖子。