注意

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

NFS 服务

注意

仅支持 NFSv4 协议。

管理 NFS 的最简单方法是通过 ceph nfs cluster ... 命令;请参阅 通过 NFS 导出 CephFS 和 RGW。本文档介绍了如何直接管理 cephadm 服务,这仅在不寻常的 NFS 配置中才需要。

部署 NFS ganesha

Cephadm 部署 NFS Ganesha 守护程序(或一组守护程序)。NFS 的配置存储在 .nfs 池中,导出通过 ceph nfs export ... 命令和仪表板进行管理。

要部署 NFS Ganesha 网关,请运行以下命令

ceph orch apply nfs *<svc_id>* [--port *<port>*] [--placement ...]

例如,要部署 NFS,服务 ID 为 foo,默认端口为 2049,默认放置单个守护程序

ceph orch apply nfs foo

有关放置规范的详细信息,请参阅 守护程序放置

服务规范

或者,可以使用 YAML 规范应用 NFS 服务。

service_type: nfs
service_id: mynfs
placement:
  hosts:
    - host1
    - host2
networks:
- 1.2.3.4/24
ip_addrs:
  host1: 10.0.0.100
  host2: 10.0.0.101
spec:
  port: 12345
  monitoring_port: 567
  monitoring_ip_addrs:
    host1: 10.0.0.123
    host2: 10.0.0.124
  monitoring_networks:
  - 192.168.124.0/24

在此示例中,我们在 host1host2 上运行服务器,使用的非默认 port 为 12345(而不是默认的 2049)。您可以使用 ip_addrsnetworks 部分将 NFS 数据端口绑定到特定的 IP 地址。如果提供了 ip_addrs 并且指定的 IP 分配给主机,则将使用该 IP。如果 IP 不存在但指定了 networks,则将选择与给定网络之一匹配的 IP。如果两个条件都不满足,守护程序将不会在该节点上启动。可以使用 monitoring_port 参数自定义默认的 NFS 监控端口。此外,您可以指定 monitoring_ip_addrsmonitoring_networks 参数以将监控端口绑定到特定的 IP 地址或网络。如果提供了 monitoring_ip_addrs 并且指定的 IP 地址分配给主机,则将使用该 IP 地址。如果 IP 地址不存在且指定了 monitoring_networks,则将使用与指定网络之一匹配的 IP 地址。如果两个条件都不满足,默认绑定将发生在所有可用的网络接口上。

TLS/SSL 示例

这是包含 TLS/SSL 配置的 NFS 服务规范示例

service_type: nfs
service_id: mynfs
placement:
  hosts:
  - ceph-node-0
spec:
  port: 12345
  ssl: true
  certificate_source: inline|reference|cephadm-signed
  ssl_cert: |
    -----BEGIN CERTIFICATE-----
    (PEM cert contents here)
    -----END CERTIFICATE-----
  ssl_key: |
    -----BEGIN PRIVATE KEY-----
    (PEM key contents here)
    -----END PRIVATE KEY-----
  ssl_ca_cert:
    -----BEGIN PRIVATE KEY-----
    (PEM key contents here)
    -----END PRIVATE KEY-----
  tls_ktls: true
  tls_debug: true
  tls_min_version: TLSv1.3
  tls_ciphers: AES-256

此示例配置了一个启用 TLS 加密的 NFS 服务,使用内联证书。

TLS/SSL 参数

以下参数可用于配置 NFS 服务的 TLS/SSL 加密

  • ssl (boolean):启用或禁用 SSL/TLS 加密。默认为 false

  • certificate_source (string):指定 TLS 证书的来源。选项包括

    • cephadm-signed:使用 cephadm 内部 CA 签名的证书

    • inline:使用 ssl_certssl_keyssl_ca_cert 字段直接在规范中提供证书

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

  • ssl_cert (string):PEM 格式的 SSL 证书。使用 inline 证书来源时必需。

  • ssl_key (string):PEM 格式的 SSL 私钥。使用 inline 证书来源时必需。

  • ssl_ca_cert (string):PEM 格式的 SSL CA 证书。使用 inline 证书来源时必需。

  • custom_sans (list):要包含在证书中的自定义主题备用名称 (SAN) 列表。

  • tls_ktls (boolean):如果可用,启用内核 TLS (kTLS) 以提高性能。默认为 false

  • tls_debug (boolean):启用 TLS 调试输出。有助于排查 TLS 问题。默认为 false

  • tls_min_version (string):指定接受的最低 TLS 版本。示例:TLSv1.3、TLSv1.2

  • tls_ciphers (string):指定 TLS 连接允许的密码套件。示例::-CIPHER-ALL:+AES-256-GCM

注意

启用 ssl 时,必须指定 certificate_source。如果使用 inline 证书,则必须提供所有三个证书字段(ssl_certssl_keyssl_ca_cert)。

然后可以通过运行以下命令应用规范

ceph orch apply -i nfs.yaml

高可用性 NFS

为现有 nfs 服务部署 ingress 服务将提供

  • 可用于访问 NFS 服务器的稳定虚拟 IP

  • 如果发生主机故障,则在主机之间进行故障转移

  • 跨多个 NFS 网关的负载分配(尽管这很少是必需的)

可以为现有 NFS 服务(本例中为 nfs.mynfs)部署 NFS 入口,其规范如下

service_type: ingress
service_id: nfs.mynfs
placement:
  count: 2
spec:
  backend_service: nfs.mynfs
  frontend_port: 2049
  monitor_port: 9000
  virtual_ip: 10.0.0.123/24

几点注意事项

  • virtual_ip 必须包含 CIDR 前缀长度,如上例所示。虚拟 IP 通常会在第一个被识别的网络接口上配置,该接口在同一子网中具有现有 IP。您还可以指定 virtual_interface_networks 属性以匹配其他网络中的 IP;有关详细信息,请参阅 为虚拟 IP 选择网络接口

  • monitor_port 用于访问 haproxy 负载状态页面。默认用户为 admin,但可以通过规范中的 admin 属性进行修改。如果未通过规范中的 password 属性指定密码,则可以通过以下方式找到自动生成的密码

    ceph config-key get mgr/cephadm/ingress.*{svc_id}*/monitor_password
    

    例如

    ceph config-key get mgr/cephadm/ingress.nfs.myfoo/monitor_password
    
  • 后端服务(本例中为 nfs.mynfs)应包含一个非 2049 的 port 属性,以避免与可能放置在同一主机上的入口服务冲突。

NFS 与虚拟 IP 但没有 haproxy

Cephadm 还支持部署带有 keepalived 但没有 haproxy 的 nfs。这提供了一个由 keepalived 支持的虚拟 IP,nfs 守护程序可以直接绑定到该 IP,而不是让流量流经 haproxy。

在此设置中,您要么想使用 nfs 模块设置服务(请参阅 创建 NFS Ganesha 集群),要么先放置入口服务,以便 nfs 守护程序可以绑定到虚拟 IP。入口服务应包含属性 keepalive_only,并设置为 true。例如

service_type: ingress
service_id: nfs.foo
placement:
  count: 1
  hosts:
  - host1
  - host2
  - host3
spec:
  backend_service: nfs.foo
  monitor_port: 9049
  virtual_ip: 192.168.122.100/24
  keepalive_only: true

然后,可以创建指定 virtual_ip 属性的 nfs 服务,该属性将指示它绑定到该特定 IP。

service_type: nfs
service_id: foo
placement:
  count: 1
  hosts:
  - host1
  - host2
  - host3
spec:
  port: 2049
  virtual_ip: 192.168.122.100

请注意,在这些设置中,应确保在 nfs 放置中包含 count: 1,因为只有一个 nfs 守护程序可以绑定到虚拟 IP。

支持 HAProxy 协议的 NFS

Cephadm 支持部署具有额外 HAProxy 协议支持的高可用性模式的 NFS。这与高可用性 NFS 的工作方式相同,但也支持 NFS 导出上的客户端 IP 级别配置。此功能需要 NFS-Ganesha v5.0 或更高版本。

要使用此模式,您要么想使用 nfs 模块设置服务(请参阅 创建 NFS Ganesha 集群),要么手动创建服务,并将额外参数 enable_haproxy_protocol 设置为 true。NFS 服务和入口服务都必须将 enable_haproxy_protocol 设置为相同的值。例如

service_type: ingress
service_id: nfs.foo
placement:
  count: 1
  hosts:
  - host1
  - host2
  - host3
spec:
  backend_service: nfs.foo
  monitor_port: 9049
  virtual_ip: 192.168.122.100/24
  enable_haproxy_protocol: true
service_type: nfs
service_id: foo
placement:
  count: 1
  hosts:
  - host1
  - host2
  - host3
spec:
  port: 2049
  enable_haproxy_protocol: true

延伸阅读

由 Ceph 基金会为您呈现

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