NFS with CephFS
CephFS 命名空间可以使用 NFS-Ganesha NFS 服务器 通过 NFS 协议导出。 本文档提供有关手动配置 NFS-Ganesha 集群的信息。 管理 NFS-Ganesha 集群和 CephFS 导出的最简单和首选的方法是使用 ceph nfs ...
命令。 有关详细信息,请参阅 :doc:/mgr/nfs
。 由于部署是使用 cephadm 或 rook 完成的。
先决条件
- Ceph文件系统
- NFS 服务器主机上的
libcephfs2
、nfs-ganesha
和nfs-ganesha-ceph
包。 - NFS-Ganesha 服务器主机连接到 Ceph public network
备注
建议使用 3.5 或更高稳定版本的 NFS-Ganesha 包和 pacific (16.2.x) 或更高稳定版本的 Ceph 包。
配置 NFS-Ganesha 以导出 CephFS
NFS Ganesha提供了一个文件系统抽象层(FSAL)来插入不同的存储后端。FSAL_CEPH是CephFS的插件FSAL。对于每个NFS Ganesha导出,FSAL_CEPH使用libcephfs客户端装载NFS Ganesha导出的CephFS路径。
使用Cephfs设置NFS Ganesha,包括为NFS Ganesha创建的Ceph客户端设置NFS Ganesha和Ceph的配置文件和CephX访问凭据,以访问Cephfs。
NFS Ganesha配置
下面是一个配置有FSAL_CEPH的ganesha.conf示例。它适用于独立NFS Ganesha服务器,或NFS Ganesha服务器的主动/被动配置,由某种集群软件(如Pacemaker)进行管理。有关选项的重要细节将作为注释添加到示例配置中。有以下选项:
- 尽可能减少 Ganesha 缓存,因为 libcephfs 客户端(FSAL_CEPH)也主动缓存
- 从存储在 RADOS 对象中的 Ganesha 配置文件中读取
- 在 RADOS OMAP 键值接口中存储客户端恢复数据
- 强制 NFSv4.1+ 访问
- 启用读委托(至少需要 v13.0.1
libcephfs2
包和 v2.6.0 稳定的nfs-ganesha
和nfs-ganesha-ceph
包)
#
# 可以使用 FSAL_CEPH 为 CephFS 提供 NFS 网关。 以下示例配置作为配置的起点应该很有用。
# 此基本配置适用于独立 NFS 服务器,或由某种集群软件(例如pacemaker、docker 等)管理的
# 主动/被动配置。
#
# 还要注意,也可以在 RADOS 中放置一个配置文件,并给出ganesha 从中获取它的 rados URL。
# 例如,如果配置文件存储在名为“nfs-ganesha”的 RADOS 池中,在名为“ganesha-namespace”
# 的命名空间中,对象名称为“ganesha-config”:
#
# %url rados://nfs-ganesha/ganesha-namespace/ganesha-config
#
# 如果我们只导出CEPFS(或RGW),请将配置和恢复数据存储在RADOS中,并强制使用NFSv4.1+进行访问
# 我们可以避免任何形式的本地存储,ganesha可以作为非特权用户运行(即使在锁定的容器中)。
#NFS_CORE_PARAM
{# 如果禁用 NLM,Ganesha 可以提前解除NFS宽限期。Enable_NLM = false;# rquotad在这里没有添加任何价值。 CephFS不支持per-uid配额。Enable_RQUOTA = false;# 在这个配置中,我们仅导出 NFSv4。在实践中,最好使用 NFSv4.1+ 来获得会话的好处。Protocols = 4;
}NFSv4
{# 现代版本的 libcephfs 支持委托,但目前不建议在集群配置中使用它们。 默认情况下它们# 被禁用,但可以为单例或主动/被动配置重新启用。# Delegations = false;# 可以在这种配置下使用任何恢复后端,但可以将其存储在RADOS中是一个很好的功能,可以轻# 松地将守护程序迁移到另一台主机。## 对于单节点或主动/被动配置,首选 rados_ng 驱动程序。 对于主动/主动集群配置,可以# 使用 rados_cluster 后端。 有关更多信息,请参阅 ganesha-rados-grace 帮助页。RecoveryBackend = rados_ng;# NFSv4.0 客户端不发送 RECLAIM_COMPLETE,因此我们最终不得不等待整个宽限期#(如果有的话)。 避开他们。Minor_Versions = 1,2;
}# libcephfs 客户端会尽可能主动地缓存信息,因此 ganesha 主动缓存相同的对象几乎没有什么好处。
# 这样做也会损害缓存的一致性。 在这里,我们尽可能多地禁用属性和目录缓存。
MDCACHE {# 尽可能减小 dirent 缓存的大小。Dir_Chunk = 0;
}EXPORT
{# 此导出的唯一导出 ID 号Export_ID=100;# 我们只对这种配置中的NFSv4感兴趣Protocols = 4;# NFSv4不允许UDP传输Transports = TCP;## 通往Cepfs树的路径。## 请注意,FSAL_CEPH 不支持子树检查,因此无法验证客户端提供的文件句柄是否可通过导出的子树访问。## 出于这个原因,我们只是在这里导出“/”。Path = /;## 伪根路径。 这是导出将出现在 NFS 伪根命名空间中的位置。#Pseudo = /cephfs_a/;# 我们希望能够读写Access_Type = RW;# 立即超时属性缓存条目Attr_Expiration_Time = 0;# 启用读委托? libcephfs v13.0.1 及更高版本允许 ceph 客户端设置委托。 虽然可以允许RW委托,# 但不建议在 ganesha 获得 CB_GETATTR 支持之前启用它们。## 还要注意,委托在集群配置中可能不安全,因此最好在解决此问题之前禁用它们:## http://tracker.ceph.com/issues/24802## Delegations = R;# NFS 服务器通常决定将来自 root 用户的传入请求“压缩”到“nobody”用户。 可以禁用它,但现在,# 我们将其保持启用状态。# Squash = root;FSAL {# FSAL_CEPH 导出Name = CEPH;## Ceph 文件系统有一个与之关联的名称字符串,现代版本的 libcephfs 可以根据名称挂载它们。# 默认是挂载集群中的默认文件系统(通常是第一个创建的)。## Filesystem = "cephfs_a";## Ceph 集群有自己的身份验证方案 (cephx)。Ganesha 充当 cephfs 客户端。 这是要使用# 的客户端用户名。 需要在运行 ganesha 之前创建此用户。## 通常,ceph 客户端的名称类似于“client.foo”。 此设置不应包含“client.”前缀。## 参考:## http://docs.ceph.com/docs/jewel/rados/operations/user-management/## 默认设置为 NULL,这意味着用户 ID 在 libcephfs 中设置为默认值(通常为“admin”)。## User_Id = "ganesha";## 用于会话的密钥(如果有)。 如果未设置,它将使用 cephx 密钥环文件的正常搜索路径来查找密钥:## Secret_Access_Key = "YOUR SECRET KEY HERE";}
}# FSAL_CEPH 的配置块
CEPH
{# 此ceph集群的ceph.conf文件的路径。# Ceph_Conf = /etc/ceph/ceph.conf;# 用户文件创建掩码。 这些位将被新创建的inode上的 unix 权限屏蔽掉。# umask = 0;
}#
# 这是 RADOS RecoveryBackend 的配置块。 这仅在将客户端恢复记录存储在 RADOS 对象中时使用。
#
RADOS_KV
{# 此ceph集群的 ceph.conf 文件的路径。# Ceph_Conf = /etc/ceph/ceph.conf;# recoverybackend 有自己的 ceph 客户端。 默认是让libcephfs自动生成用户ID。请注意, # RADOS_KV 块没有Secret_Access_Key设置。 必须使用 cephx 密钥环文件进行认证访问。# UserId = "ganesharecov";# 包含恢复对象的 ceph 存储池的池 ID。默认为“nfs-ganesha”。# pool = "nfs-ganesha";# 考虑在此处为每个正在运行的守护程序设置一个唯一的 nodeid,特别是如果该守护程序最终可能迁# 移到具有不同主机名的主机(即,如果您正在运行具有 rados_ng/rados_kv 和/或横向扩展的 # rados_cluster 的主动/被动集群 )。 默认是使用运行 ganesha 的节点的主机名。# nodeid = hostname.example.com
}# rados://URL访问的配置块。它也使用自己的客户端来访问对象,独立于FSAL_CEPH和RADOS_KV客户端。
RADOS_URLS
{# 此ceph集群的 ceph.conf 文件的路径。# Ceph_Conf = /etc/ceph/ceph.conf;# RADOS_URLS也使用他们自己的 ceph 客户端。 认证访问需要 cephx 密钥环文件。# UserId = "ganeshaurls";# 我们还可以让ganesha监视RADOS对象以获取通知,并在收到通知时强制重新加载配置。将其设# 置为有效的rados://URL 以启用此功能。# watch_url = "rados://pool/namespace/object";
}
libcephfs 客户端的配置
libcephfs 客户端的 ceph.conf
包含一个 [client]
部分,其中设置了 mon_host
选项以让客户端连接到 Ceph 集群的监视器,通常通过 ceph config generate-minimal-conf
生成。 例如:
[client]mon host = [v2:192.168.1.7:3300,v1:192.168.1.7:6789], [v2:192.168.1.8:3300,v1:192.168.1.8:6789], [v2:192.168.1.9:3300,v1:192.168.1.9:6789]
使用 NFSv4 客户端挂载
最好使用 NFSv4.1+ 协议挂载 NFS-Ganesha 导出以获得会话的好处。
挂载 NFS 资源的约定是特定于平台的。 以下约定适用于 Linux 和一些 Unix 平台:
mount -t nfs -o nfsvers=4.1,proto=tcp <ganesha-host-name>:<ganesha-pseudo-path> <mount-point>