nfs-ganesha导出cephfs为nfs

Posted by elrond on June 26, 2021

1. 概述

cephfs直接使用不变,需要安装较多的依赖,相对来说nfs更加通用。 FSAL_CEPH 调用 libcephfs2 将 NFS 转义为 Cephfs 协议再存入到 Ceph 中,通过这种途径来实现cephfs导出为NFS

2. 前提条件

  • 有一个cephfs集群
  • 安装 nfs-ganesha nfs-ganesha-ceph libcephfs2
  • nfs-ganesha服务需要能连接到ceph的public网络
  • 安装nfs必要软件 rpcbind nfs-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来实现(待验证)

9. 参考文档