注意

本文档适用于 Ceph 的开发版本。

RGW 服务

部署 RGW

Cephadm 将对象网关 (RGW) 部署为一组守护程序,用于管理单集群部署或多站点部署中的特定“域”和“区域”。 (有关域和区域的更多信息,请参阅多站点。)

请注意,使用 cephadm 时,radosgw 守护程序是通过监视器配置数据库配置的,而不是通过 ceph.conf 或命令行配置的。如果尚未进行此配置(通常在 client.rgw.<something> 部分中),则 radosgw 守护程序将使用默认设置启动(例如,绑定到端口 80)。

要使用任意服务名称“名称”部署一组 radosgw 守护程序,请运行以下命令

ceph orch apply rgw *<name>* [--realm=*<realm-name>*] [--zone=*<zone-name>*] --placement="*<num-daemons>* [*<host1>* ...]"

简单设置

例如,要为具有任意服务 ID foo 的单集群 RGW 部署部署两个守护程序(默认值)

ceph orch apply rgw foo

指定网关

一个常见的场景是拥有一组带有标签的主机充当网关,并有多个 radosgw 实例运行在连续的端口 8000 和 8001 上

ceph orch host label add gwhost1 rgw  # the 'rgw' label can be anything
ceph orch host label add gwhost2 rgw
ceph orch apply rgw foo '--placement=label:rgw count-per-host:2' --port=8000

另请参阅:守护程序并置

指定网络

RGW 服务可以通过 YAML 服务规范配置其绑定的网络。

示例规范文件

service_type: rgw
service_id: foo
placement:
  label: rgw
  count_per_host: 2
networks:
- 192.169.142.0/24
spec:
  rgw_frontend_port: 8080

传递前端额外参数

RGW 服务规范可用于通过使用 rgw_frontend_extra_args 参数列表将额外参数传递给前端。

示例规范文件

service_type: rgw
service_id: foo
placement:
  label: rgw
  count_per_host: 2
spec:
  rgw_realm: myrealm
  rgw_zone: myzone
  rgw_frontend_type: "beast"
  rgw_frontend_port: 5000
  rgw_frontend_extra_args:
  - "tcp_nodelay=1"
  - "max_header_size=65536"

注意

cephadmspec 部分中的参数与 rgw_frontend_extra_args 中的参数组合成一个由空格分隔的参数列表,用于设置 rgw_frontends 配置参数的值。

多站点区域

要在 myhost1myhost2 上部署服务于多站点 myorg 域和 us-east-1 区域的 RGW

ceph orch apply rgw east --realm=myorg --zonegroup=us-east-zg-1 --zone=us-east-1 --placement="2 myhost1 myhost2"

请注意,在多站点情况下,cephadm 只部署守护程序。它不会创建或更新域或区域配置。要创建新的域、区域和区域组,请使用 RGW 模块或发出以下形式的命令

radosgw-admin realm create --rgw-realm=<realm-name>
radosgw-admin zonegroup create --rgw-zonegroup=<zonegroup-name>  --master
radosgw-admin zone create --rgw-zonegroup=<zonegroup-name> --rgw-zone=<zone-name> --master
radosgw-admin period update --rgw-realm=<realm-name> --commit

有关放置规范的详细信息,请参阅守护程序放置。有关设置多站点 RGW 的更多信息,请参阅多站点

另请参阅 多站点

设置 HTTPS

RGW 服务与其他 cephadm 管理的服务一样,支持三种配置 HTTPS 证书的方式,所有这些方式都通过 cephadm 证书管理器 (certmgr) 进行管理

  • cephadm 签名(默认):如果 ssl 设置为 true 但未指定证书,cephadm 会自动为 RGW 服务生成并签署证书。

  • 内联:用户可以在规范中将 certificate_source 设置为 inline,并使用 ssl_certssl_key 字段将证书和私钥直接嵌入到规范中。

  • 引用:用户可以在 certmgr 中注册自己的证书和密钥,并在规范中将 certificate_source 设置为 reference

选项 1:内联证书和密钥

service_type: rgw
service_id: myrgw
spec:
  ssl: true
  certificate_source: inline
  ssl_cert: |
    -----BEGIN CERTIFICATE-----
    (PEM cert contents here)
    -----END CERTIFICATE-----
  ssl_key: |
    -----BEGIN PRIVATE KEY-----
    (PEM key contents here)
    -----END PRIVATE KEY-----

应用规范

ceph orch apply -i myrgw.yaml

注意

较旧的 rgw_frontend_ssl_certificate 字段仍受支持以实现向后兼容性,但它已被弃用。新部署应改用 ssl_cert / ssl_key

选项 2:引用已注册的证书/密钥

首先,在 certmgr 中注册证书和密钥

ceph orch certmgr cert set --cert-name rgw_ssl_cert --service-name rgw.<service_id> -i $PWD/server_cert.pem
ceph orch certmgr key set --key-name rgw_ssl_key  --service-name rgw.<service_id> -i $PWD/server_key

然后在 RGW 规范中使用 reference

service_type: rgw
service_id: myrgw
spec:
  ssl: true
  certificate_source: reference

应用规范

ceph orch apply -i myrgw.yaml

选项 3:cephadm 签名(默认)

如果设置了 ssl: true 但未提供证书,cephadm 将自动为 RGW 服务生成并签署证书。

service_type: rgw
service_id: myrgw
spec:
  ssl: true
  certificate_source: cephadm-signed

这将使用 cephadm 签名的证书部署 RGW。

设置带有通配符 SAN 的 HTTPS

使用 cephadm 签名的证书时,通配符主题备用名称 (SAN) 可以选择性地包含在生成的证书中。对于 RGW 服务,可以通过应用以下规范文件来启用此功能

service_type: rgw
service_id: foo
placement:
  label: rgw
  count_per_host: 1
spec:
  ssl: true
  certificate_source: cephadm-signed
  rgw_frontend_port: 8080
  wildcard_enabled: true  # Enables wildcard SANs in the certificate
  zonegroup_hostnames:
  - s3.cephlab.com

然后应用此 yaml 文档

ceph orch apply -i myrgw.yaml

wildcard_enabled 标志确保在自签名证书中包含通配符 SAN 条目,从而允许在虚拟主机模式下访问存储桶。默认情况下,此标志处于禁用状态。示例:通配符 SAN - (*.s3.cephlab.com)

用于 RGW 服务的 Cephadm ceph orch 规范现在支持以下可选配置

spec:
  qat:
    compression: hw | sw

压缩

hw:启用硬件 QAT 卸载(如果节点上存在 QAT 硬件和 VF)

sw:启用 QAT 软件回退模式

qat 块中目前不支持其他键。

禁用多站点同步流量

有一个 RGW 配置选项名为 rgw_run_sync_thread,它告诉 RGW 守护程序不要传输多站点复制数据。如果您希望该 RGW 守护程序专用于 I/O 而不是多站点同步操作,这将很有用。RGW 规范文件包含一个设置 disable_multisite_sync_traffic,当设置为“True”时,它会告诉 cephadm 将为该 RGW 服务部署的所有 RGW 守护程序的 rgw_run_sync_thread 设置为 false。例如

service_type: rgw
service_id: foo
placement:
  label: rgw
spec:
  rgw_realm: myrealm
  rgw_zone: myzone
  rgw_zonegroup: myzg
  disable_multisite_sync_traffic: True

注意

这只会阻止 RGW 守护程序发送复制数据。除非已将其从区域组和区域复制终结点中删除,否则守护程序仍可以接收复制数据。

关闭时排空客户端连接

当 RGW 守护程序因任何原因停止时,包括在 cephadm 升级过程中,RGW 提供了一个设置来延迟关闭,因为 RGW 守护程序会尝试完成正在进行的客户端请求。此设置默认处于关闭状态,但可以通过向 RGW 进程传递 --stop-timeout=<timeout-in-seconds> 或为 RGW 守护程序设置 rgw_exit_timeout_secs 配置选项来手动激活。此值可以在 RGW 服务规范文件中通过在规范文件中指定 rgw_exit_timeout_secs 参数来配置。例如

service_type: rgw
service_id: foo
placement:
  label: rgw
spec:
  rgw_realm: myrealm
  rgw_zone: myzone
  rgw_zonegroup: myzg
  rgw_exit_timeout_secs: 120

将告诉 cephadm 为 rgw.foo 服务部署的 RGW 守护程序最多等待 120 秒以完成当前的客户端请求。请注意,RGW 守护程序在此期间将拒绝新的客户端请求。

注意

在 cephadm 部署中,此设置默认为启用,时间为 120 秒。如果要禁用此功能,必须在规范中将 rgw_exit_timeout_secs 设置为 0

注意

此设置在规范中的修改不会被服务中的 RGW 守护程序获取,直到使用 ceph orch redeploy <service-name>ceph orch daemon redeploy <daemon-name> 命令重新部署它们。

服务规范

class ceph.deployment.service_spec.RGWSpec(service_type='rgw', service_id=None, placement=None, rgw_realm=None, rgw_zonegroup=None, rgw_zone=None, rgw_frontend_port=None, rgw_frontend_ssl_certificate=None, rgw_frontend_type=None, rgw_frontend_extra_args=None, unmanaged=False, ssl=False, certificate_source=None, ssl_cert=None, ssl_key=None, custom_sans=None, preview_only=False, config=None, networks=None, subcluster=None, extra_container_args=None, extra_entrypoint_args=None, custom_configs=None, only_bind_port_on_networks=False, rgw_realm_token=None, update_endpoints=False, zone_endpoints=None, zonegroup_hostnames=None, data_pool_attributes=None, rgw_user_counters_cache=False, rgw_user_counters_cache_size=None, rgw_bucket_counters_cache=False, rgw_bucket_counters_cache_size=None, generate_cert=False, disable_multisite_sync_traffic=None, wildcard_enabled=False, rgw_exit_timeout_secs=120, qat=None)

配置(多站点)Ceph RGW 的设置

service_type: rgw
service_id: myrealm.myzone
spec:
    rgw_realm: myrealm
    rgw_zonegroup: myzonegroup
    rgw_zone: myzone
    ssl: true
    rgw_frontend_port: 1234
    rgw_frontend_type: beast
    rgw_frontend_ssl_certificate: ...

另请参阅:服务规范

data_pool_attributes

在 rgw 域引导命令中创建的 <zone-name>.rgw.buckets.data 池的属性

disable_multisite_sync_traffic

用于使 RGW 不执行多站点复制,以便它可以专用于 IO

generate_cert

如果未提供证书/密钥,是否应为用户生成证书/密钥

networks: List[str]

网络身份列表,指示守护程序仅绑定到该列表中的特定网络。如果集群分布在多个网络中,您可以添加多个网络。请参阅 网络和端口指定网络指定网络

only_bind_port_on_networks

是否将绑定的 IP 限制为“networks”参数中指定的 IP

placement: PlacementSpec

请参阅 守护进程放置

rgw_bucket_counters_cache

要按存储桶跟踪操作指标,配置值 rgw_bucket_counters_cache 必须设置为 true

rgw_bucket_counters_cache_size

用于设置每个存储桶计数器缓存中的条目数

rgw_exit_timeout_secs

RGW 在被告知关闭时等待尝试完成客户端请求的时间

rgw_frontend_extra_args: List[str] | None

rgw_frontend 的额外参数列表,形式为 opt=value。请参阅 HTTP 前端

rgw_frontend_port: int | None

RGW 守护程序的端口

rgw_frontend_ssl_certificate: str | List[str] | None

SSL 证书列表

rgw_frontend_type: str | None

civetweb 或 beast(默认值:beast)。请参阅 HTTP 前端

rgw_realm: str | None

与此服务关联的 RGW 域。如果规范直接应用于 cephdam,则需要手动创建。如果是 rgw 模块,则会自动创建域。

rgw_user_counters_cache

要按用户跟踪操作指标,配置值 rgw_user_counters_cache 必须设置为 true

rgw_user_counters_cache_size

用于设置每个用户计数器缓存中的条目数

rgw_zone: str | None

与此服务关联的 RGW 区域。如果规范直接应用于 cephdam,则需要手动创建。如果是 rgw 模块,则会自动创建区域。

rgw_zonegroup: str | None

与此服务关联的 RGW 区域组。如果规范直接应用于 cephdam,则需要手动创建。如果是 rgw 模块,则会自动创建区域组。

ssl

启用 SSL

RGW 高可用性服务

ingress 服务允许您通过最少的配置选项为 RGW 创建高可用性终结点。orchestrator 将部署和管理 haproxy 和 keepalived 的组合,以在浮动虚拟 IP 上提供负载平衡。

如果 RGW 服务配置为启用 SSL,则 ingress 服务将在后端配置中使用 sslverify none 选项。信任验证被禁用,因为后端是通过 IP 地址而不是 FQDN 访问的。

../../../_images/HAProxy_for_RGW.svg

有 N 个主机部署了 ingress 服务。每个主机都有一个 haproxy 守护程序和一个 keepalived 守护程序。虚拟 IP 会自动配置在这些主机中的一个上。

每个 keepalived 守护程序每隔几秒检查同一主机上的 haproxy 守护程序是否响应。Keepalived 还会检查主 keepalived 守护程序是否运行正常。如果“主”keepalived 守护程序或活动的 haproxy 没有响应,则将选举在备份模式下运行的其余 keepalived 守护程序之一作为主守护程序,并将虚拟 IP 转移到该节点。

活动的 haproxy 充当负载均衡器,在所有可用的 RGW 守护程序之间分配所有 RGW 请求。

先决条件

  • 一个现有的 RGW 服务。

部署中

使用命令

ceph orch apply -i <ingress_spec_file>

服务规范

服务规范是具有以下属性的 YAML 块

service_type: ingress
service_id: rgw.something    # adjust to match your existing RGW service
placement:
  hosts:
    - host1
    - host2
    - host3
spec:
  backend_service: rgw.something            # adjust to match your existing RGW service
  virtual_ip: <string>/<string>             # ex: 192.168.20.1/24
  frontend_port: <integer>                  # ex: 8080
  monitor_port: <integer>                   # ex: 1967, used by haproxy for load balancer status
  virtual_interface_networks: [ ... ]       # optional: list of CIDR networks
  use_keepalived_multicast: <bool>          # optional: Default is False.
  vrrp_interface_network: <string>/<string> # optional: ex: 192.168.20.0/24
  health_check_interval: <string>           # optional: Default is 2s.
  ssl: true
  certificate_source: inline                # optional: Default is cephadm-signed
  ssl_cert: |                               # optional: SSL certificate and key
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
  ssl_key: |
    -----BEGIN PRIVATE KEY-----
    ...
    -----END PRIVATE KEY-----
  enable_stats: true
  monitor_ssl: <bool>
  monitor_cert_source: inline                       # optional: default is reuse_service_cert
  monitor_ssl_cert: |                               # optional: SSL certificate and key
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
  monitor_ssl_key: |
    -----BEGIN PRIVATE KEY-----
    ...
    -----END PRIVATE KEY-----
  monitor_networks: [..]
  monitor_ip_addrs:
    host: <ip>
service_type: ingress
service_id: rgw.something    # adjust to match your existing RGW service
placement:
  hosts:
    - host1
    - host2
    - host3
spec:
  backend_service: rgw.something      # adjust to match your existing RGW service
  virtual_ips_list:
  - <string>/<string>                 # ex: 192.168.20.1/24
  - <string>/<string>                 # ex: 192.168.20.2/24
  - <string>/<string>                 # ex: 192.168.20.3/24
  frontend_port: <integer>            # ex: 8080
  monitor_port: <integer>             # ex: 1967, used by haproxy for load balancer status
  virtual_interface_networks: [ ... ] # optional: list of CIDR networks
  first_virtual_router_id: <integer>  # optional: default 50
  health_check_interval: <string>     # optional: Default is 2s.
  ssl_cert: |                         # optional: SSL certificate and key
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
    -----BEGIN PRIVATE KEY-----
    ...
    -----END PRIVATE KEY-----

此服务规范的属性如下

  • service_type

    必需且设置为“ingress”

  • service_id

    服务的名称。我们建议以您正在控制 ingress 的服务命名此服务(例如,rgw.foo)。

  • placement hosts

    希望运行 HA 守护程序的主机。将在这些主机上部署一个 haproxy 和一个 keepalived 容器。这些主机不需要与部署 RGW 的节点匹配。

  • virtual_ip

    ingress 服务可用的 CIDR 格式的虚拟 IP(和网络)。

  • virtual_ips_list

    ingress 服务可用的 CIDR 格式的虚拟 IP 地址。每个虚拟 IP 地址将是运行 ingress 服务的节点上的主 IP 地址。虚拟 IP 地址的数量必须小于或等于 ingress 节点的数量。

  • virtual_interface_networks

    网络列表,用于识别用于虚拟 IP 的以太网接口。

  • frontend_port

    用于访问 ingress 服务的端口。

  • ssl

    为 ingress 服务启用 SSL。

  • certificate_source

    证书来源可以是以下之一:“inline”、“reference”或“cephadm-signed”。- 如果设置为“inline”,则 YAML 配置必须包含 ssl_cert 和 ssl_key。- 如果设置为“reference”,则证书和密钥必须已存在于证书存储中。- 如果设置为“cephadm-signed”,Cephadm 将自动生成证书和密钥。默认情况下,来源设置为“cephadm-signed”。

  • ssl_cert

    SSL 证书,如果启用了 SSL 且 certificate_source 不是“cephadm-signed”。这应该具有证书 .pem 格式。

  • ssl_key

    SSL 密钥,如果启用了 SSL 且 certificate_source 不是“cephadm-signed”。这应该具有密钥 .pem 格式。

  • use_keepalived_multicast

    默认值为 False。默认情况下,cephadm 将部署 keepalived 配置以使用单播 IP,使用主机的 IP。选择的 IP 将与 cephadm 用于连接机器的 IP 相同。但是,如果首选多播,我们可以将 use_keepalived_multicast 设置为 True,Keepalived 将使用多播 IP (224.0.0.18) 在实例之间通信,使用与 VIP 所在的接口相同的接口。

  • vrrp_interface_network

    默认情况下,cephadm 会将 keepalived 配置为使用与 VIP 相同的接口进行 VRRP 通信。如果需要另一个接口,可以通过 vrrp_interface_network 设置,并提供一个网络来识别要使用的以太网接口。

  • first_virtual_router_id

    默认值为 50。当部署超过 1 个 ingress 时,此参数可用于确保每个 keepalived 具有不同的 virtual_router_id。在使用 virtual_ips_list 的情况下,每个 IP 将创建自己的虚拟路由器。因此,第一个将具有 first_virtual_router_id,第二个将具有 first_virtual_router_id + 1,依此类推。有效值范围从 1 到 255。

  • health_check_interval

    默认值为 2 秒。此参数可用于设置 haproxy 与后端服务器之间健康检查的间隔。

  • enable_stats

    默认值为 False,必须设置为启用 haproxy 统计信息。

  • monitor_ssl

    为监视启用 ssl。只有在启用服务 SSL 时才能为监视启用 SSL。

  • monitor_cert_source

    监视器证书来源可以是以下之一:“reuse_service_cert”、“inline”、“reference”或“cephadm-signed”。- 如果设置为“reuse_service_cert”,则将使用服务证书。- 如果设置为“inline”,则 YAML 配置必须包含 ssl_cert 和 ssl_key。- 如果设置为“reference”,则证书和密钥必须已存在于证书存储中。- 如果设置为“cephadm-signed”,Cephadm 将自动生成证书和密钥。默认情况下,来源设置为“reuse_service_cert”。

  • monitor_ssl_cert

    监视器 SSL 证书,如果启用了监视器 SSL 且 monitor_cert_source 不是“cephadm-signed”。这应该具有证书 .pem 格式。

  • monitor_ssl_key

    监视器 SSL 密钥,如果启用了监视器 SSL 且 monitor_cert_source 不是“cephadm-signed”。这应该具有密钥 .pem 格式。

  • monitor_ip_addrs

    如果提供了 monitor_ip_addrs 并且指定了 IP 地址分配给主机,则将使用该 IP 地址。如果 IP 地址不存在,则将检查“monitor_networks”。

  • monitor_networks

    如果指定了 monitor_networks,则将使用与指定网络之一匹配的 IP 地址。如果 IP 不存在,则将使用默认主机 IP。

为虚拟 IP 选择网络接口

您不能简单地提供用于配置虚拟 IP 的网络接口名称,因为接口名称在不同主机之间可能会有所不同(和/或重新启动)。相反,cephadm 将根据已配置的其他现有 IP 地址来选择接口。

通常,虚拟 IP 将配置在具有相同子网中现有 IP 的第一个网络接口上。例如,如果虚拟 IP 是 192.168.0.80/24,并且 eth2 具有静态 IP 192.168.0.40/24,则 cephadm 将使用 eth2。

在某些情况下,虚拟 IP 可能不属于与现有静态 IP 相同的子网。在这种情况下,您可以提供要与现有 IP 匹配的子网列表,并且 cephadm 会将虚拟 IP 放在第一个匹配的网络接口上。例如,如果虚拟 IP 是 192.168.0.80/24,并且我们希望它与机器在 10.10.0.0/16 中的静态 IP 位于同一接口上,则可以使用如下规范

service_type: ingress
service_id: rgw.something
spec:
  virtual_ip: 192.168.0.80/24
  virtual_interface_networks:
    - 10.10.0.0/16
  ...

此策略的一个后果是您目前无法在没有现有 IP 地址的接口上配置虚拟 IP。在这种情况下,我们建议在正确的接口上配置一个不可路由网络中的“虚拟”IP 地址,并在网络列表中引用该虚拟网络(见上文)。

ingress 的有用提示

  • 建议至少有三个 radosgw 守护程序以实现可用性和负载均衡。

  • 我们建议为 ingress 服务至少提供三个主机。

延伸阅读

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入