1. 概述
cephfs直接使用不变,需要安装较多的依赖,相对来说nfs更加通用。 FSAL_CEPH 调用 libcephfs2 将 NFS 转义为 Cephfs 协议再存入到 Ceph 中,通过这种途径来实现cephfs导出为NFS
2. 前提条件
- 有一个cephfs集群
- 安装 nfs-ganesha nfs-ganesha-ceph libcephfs2
- nfs-ganesha服务需要能连接到ceph的public网络
- 安装nfs必要软件 rpcbindnfs-utils
3. 版本说明
- nfs-ceph 2.8 nautilus
4. 安装
4.1. 配置yum源
cat /etc/yum.repos.d/storage.repo
[nfsganesha]
name=nfsganesha
baseurl=https://mirrors.cloud.tencent.com/ceph/nfs-ganesha/rpm-V2.8-stable/nautilus/x86_64/
gpgcheck=0
enable=1
yum clean all
yum repolist
4.2. 安装软件
yum install nfs-ganesha nfs-ganesha-ceph libcephfs2 -y
5. 配置
配置文件 /etc/ganesha/ganesha.conf
EXPORT
{
        Export_ID=1;
        # cephfs的目录
        Path = /;
        # nfs-ganesha挂载的目录
        Pseudo = /cephfs;
        Access_Type = RW;
        protocols = 3, 4;
        transports = "UDP", "TCP";
        Squash = no_root_squash;
        FSAL {
                # 访问ceph用户对应的secretkey  
                secret_access_key = "AQDk18FgMo7NABAA4ufuz3O6/0lE4vsVgHs1yQ==";  
                # 访问ceph的用户  
                user_id = "admin";  
                name = "CEPH";  
                # cephfs 的fsname  
                filesystem = "cephfs";  
        }        
}
LOG {                         
        Facility {
                name = FILE;  
                destination = "/var/log/ganesha/ganesha.log";  
                enable = active;  
        }
}
启动服务
systemctl enable nfs-ganesha nfs-utils rpcbind 
systemctl start nfs-ganesha nfs-utils rpcbind
6. 使用
mkdir /opt/ganesha
mount -t nfs 172.16.2.237:/cephfs  /opt/ganesha**
查看挂载
df
# output
172.16.2.237:/cephfs 6576680960 96047104 6480633856    2% /opt/ganesha
进入挂载点就可以进行文件系统操作了
性能测试结果见, 小集群下性能差距非常小 https://docs.qq.com/doc/DR3RlaGh2ZXpqV1pT
7. 部署问题
7.1. nfs挂载之后无法创建文件、文件夹
touch  aax
touch: 无法创建"aax": 权限不够
解决方式参照 https://github.com/ceph/ceph-ansible/issues/5300
在 ganesha的配置中添加 Squash = no_root_squash; 重启服务即可
这个配置项是nfs的配置项,客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行!
8. 剩下的问题
- 如何调用api使得nfs-ganesha生成配置且重新加载
ceph中的实现是将nfs-ganesha的配置存储为ceph的对象,新建修改删除操作的都是ceph上的对象
    需要注意⚠️: 创建nfs-ganesha配置之后还需另外在cephfs上创建对应的目录;删除nfs-ganesha配置之后cephfs对应的目录也不会手动删除,如需清理则需另外操作删除 
- nfs-ganesha如何对指定目录做quota
早期ceph版本在nfs-ganesha配置 client_quota = true即可,后来社区把这个参数取消了,强制使用cephfs的quota,所以设置好cephfs的quota,在nfs-ganesha不用做什么即可达到目的
- nfs-ganesha如何实现高可用
nfs-ganesha 本身是个无状态服务,当前有以下几种方式实现高可用
    - pacemaker + corosync
- ctds + lvs
- haproxy
- keepalived
- k8s service+pod
 既然可以用k8s service来实现,是否也可以通过简单的ha+keepalived来实现(待验证) 
