Manila+CephFS+NFS-Ganesha 部署配置

简介

环境简述

  • 系统:CentOS 7.5
  • manila: Rocky 版
  • ceph:luminous 版
  • nfs-ganesha:v2.6.1(ceph 官方源)

先决条件

  • P 版或更高版本的 manila
  • K 版或更高版本的 Ceph
  • 2.5 或更高版本的 NFS-Ganesha
  • 配置了文件系统的 Ceph 集群( http://docs.ceph.com/docs/master/cephfs/createfs/
  • 运行 manila-share 服务的服务器安装了 ceph-common 软件包
  • 客户虚拟机中安装了 NFS 客户端
  • 确保 Ceph 集群的公共网络和运行 manila 共享服务的服务器之间的网络连接
  • 确保 Ceph 集群的公共网络和 NFS-Ganesha 服务器之间的网络连接
  • NFS-Ganesha 服务器与 manila 之间的网络连接

cephfs

cephfs 安装

Ceph 集群的安装在此不做具体介绍,可参考官方文档进行操作:

下面就 CephFS 的创建做部分说明:

一个 Ceph 文件系统需要至少两个 RADOS 存储池,一个用于数据、一个用于元数据。配置这些存储池时需考虑:

  • 为元数据存储池设置较高的副本水平,因为此存储池丢失任何数据都会导致整个文件系统失效。
  • 为元数据存储池分配低延时存储器(像 SSD ),因为它会直接影响到客户端的操作延时。

创建存储池

用默认设置为文件系统创建两个存储池

1
2
$ ceph osd pool create cephfs_data <pg_num>
$ ceph osd pool create cephfs_metadata <pg_num>

创建文件系统

创建好存储池后,就可以用 fs new 命令创建文件系统了

1
$ ceph fs new <fs_name> <metadata> <data>

查看状态

文件系统创建完毕后, MDS 服务器就能达到 active 状态了,比如在一个单 MDS 系统中:

1
2
$ ceph mds stat
cephfs-1/1/1 up {0=a=up:active}

cephfs 配置

授权 Manila 驱动程序与 Ceph 通信

运行以下命令为要使用的驱动程序实例创建 Ceph 标识

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# read -d '' MON_CAPS << EOF
allow r,
allow command "auth del",
allow command "auth caps",
allow command "auth get",
allow command "auth get-or-create"
EOF

# ceph auth get-or-create client.manila -o manila.keyring \
mds 'allow *' \
osd 'allow rw' \
mon "$MON_CAPS"

在 Ceph 后端启用快照支持

如果要在 manila 中使用快照,请先在 Ceph 中启用快照,要启用快照需在 Ceph 集群服务器上执行以下命令

1
ceph mds set allow_new_snaps true --yes-i-really-mean-it

nfs-ganesha

nfs-ganesha 安装

nfs-ganesha 的安装可以安装在 ceph 集群端,也可以安装在 manila-share 端,只不过对应的 manila 驱动配置稍微有点不同而已,以下步骤以安装在 ceph 集群端为例

配置源

在文件夹 /etc/yum.repos.d 下编辑文件 ganesha.repo 添加 ceph 官方提供的源

如果觉得国外的源下载速度慢,可以更换为国内的源,例如网易的源 http://mirrors.163.com/ceph/nfs-ganesha/rpm-V2.6-stable/luminous/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[ganesha]
name=ganesha packages for $basearch
baseurl=https://download.ceph.com/nfs-ganesha/rpm-V2.6-stable/luminous/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[ganesha-noarch]
name=ganesha noarch packages
baseurl=https://download.ceph.com/nfs-ganesha/rpm-V2.6-stable/luminous/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[ganesha-source]
name=ganesha source packages
baseurl=https://download.ceph.com/nfs-ganesha/rpm-V2.6-stable/luminous/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

更新软件包缓存

添加好源后最好通过以下命令更新一下软件包缓存

1
yum makecache

安装

更新好软件包缓存后,执行以下命令进行 nfs-ganesha 的安装

只安装 nfs-ganesha 包是不够的,至少还需要 nfs-ganesha-ceph 这个包,至于同一个源里的其他包,目前对于 manila 来说,nfs-ganesha 至少需要这两个包才能正常使用。另外,libcephfs2 也是必需的包,但是在安装 Ceph 集群时应该就已经安装好了,所以一般不需要再进行手动安装,若报相应包缺失,再手动安装即可

1
yum install nfs-ganesha nfs-ganesha-ceph

nfs-ganesha 配置

  • 执行以下命令重新启动 messagebus
1
  systemctl restart messagebus
  • 使用以下命令查看 messagebus 服务是否正常运行
1
  systemctl status messagebus
  • 执行以下命令重新启动 systemd-logind
1
  systemctl restart systemd-logind
  • 使用以下命令查看 systemd-logind 服务是否正常运行
1
  systemctl status systemd-logind
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  > Nov 12 10:01:01 c1 dbus[798287]: [system] Activating via systemd: service name='org.freedesktop.login1' unit='dbus-org.freedesktop.login1.service'
  > Nov 12 10:01:26 c1 dbus[798287]: [system] Failed to activate service 'org.freedesktop.login1': timed out
  > ```
  >
  > 以上问题是 dbus 的服务重启后,systemd-logind 服务没有重启导致,可以查看 systemctl status systemd-logind 的状态,解决方法就是重启该服务
  >
  > 参考链接:[http://serverfault.com/questions/707377/slow-ssh-login-activation-of-org-freedesktop-login1-timed-out](http://serverfault.com/questions/707377/slow-ssh-login-activation-of-org-freedesktop-login1-timed-out)

- 执行以下命令重新启动 `nfs-ganesha` 

  ```bash
  systemctl enable nfs-ganesha
  systemctl restart nfs-ganesha
  • 使用以下命令查看 nfs-ganesha 服务是否正常运行
1
  systemctl status nfs-ganesha

manila

manila 安装

具体安装步骤可参考官方文档:

在 Controller 节点

数据库
  • 进入数据库
1
$ mysql -u root -p
  • 创建数据库
1
MariaDB [(none)]> CREATE DATABASE manila;
  • 赋予数据库权限
1
2
3
4
5
# <MANILA_DBPASS>为自定义密码
MariaDB [(none)]> GRANT ALL PRIVILEGES ON manila.* TO 'manila'@'localhost' \
  IDENTIFIED BY 'MANILA_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON manila.* TO 'manila'@'%' \
  IDENTIFIED BY 'MANILA_DBPASS';
  • 退出数据库
1
MariaDB [(none)]> exit
安装 Manila 组件
  • 重新加载 admin 用户的管理凭据
1
$ source /openstack/admin-openrc
  • 创建 manila 用户
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ openstack user create --domain default --password-prompt manila
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | e0353a670a9e496da891347c589539e9 |
| enabled             | True                             |
| id                  | 83a3990fc2144100ba0e2e23886d8acc |
| name                | manila                           |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+
  • 为项目 service 与用户 manila 添加角色 admin
1
$ openstack role add --project service --user manila admin
  • 创建 compute 服务实体

共享文件系统服务需要两个服务实体。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ openstack service create --name manila \
  --description "OpenStack Shared File Systems" share
  +-------------+----------------------------------+
  | Field       | Value                            |
  +-------------+----------------------------------+
  | description | OpenStack Shared File Systems    |
  | enabled     | True                             |
  | id          | 82378b5a16b340aa9cc790cdd46a03ba |
  | name        | manila                           |
  | type        | share                            |
  +-------------+----------------------------------+
  
$ openstack service create --name manilav2 \
  --description "OpenStack Shared File Systems V2" sharev2
  +-------------+----------------------------------+
  | Field       | Value                            |
  +-------------+----------------------------------+
  | description | OpenStack Shared File Systems V2 |
  | enabled     | True                             |
  | id          | 30d92a97a81a4e5d8fd97a32bafd7b88 |
  | name        | manilav2                         |
  | type        | sharev2                          |
  +-------------+----------------------------------+
  • 创建 compute 服务的访问端点 endpoint

共享文件系统服务每个服务实体都需要 endpoint。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
$ openstack endpoint create --region RegionOne \
  share public http://controller:8786/v1/%\(tenant_id\)s
  +--------------+-----------------------------------------+
  | Field        | Value                                   |
  +--------------+-----------------------------------------+
  | enabled      | True                                    |
  | id           | 0bd2bbf8d28b433aaea56a254c69f69d        |
  | interface    | public                                  |
  | region       | RegionOne                               |
  | region_id    | RegionOne                               |
  | service_id   | 82378b5a16b340aa9cc790cdd46a03ba        |
  | service_name | manila                                  |
  | service_type | share                                   |
  | url          | http://controller:8786/v1/%(tenant_id)s |
  +--------------+-----------------------------------------+

$ openstack endpoint create --region RegionOne \
  share internal http://controller:8786/v1/%\(tenant_id\)s
  +--------------+-----------------------------------------+
  | Field        | Value                                   |
  +--------------+-----------------------------------------+
  | enabled      | True                                    |
  | id           | a2859b5732cc48b5b083dd36dafb6fd9        |
  | interface    | internal                                |
  | region       | RegionOne                               |
  | region_id    | RegionOne                               |
  | service_id   | 82378b5a16b340aa9cc790cdd46a03ba        |
  | service_name | manila                                  |
  | service_type | share                                   |
  | url          | http://controller:8786/v1/%(tenant_id)s |
  +--------------+-----------------------------------------+

$ openstack endpoint create --region RegionOne \
  share admin http://controller:8786/v1/%\(tenant_id\)s
  +--------------+-----------------------------------------+
  | Field        | Value                                   |
  +--------------+-----------------------------------------+
  | enabled      | True                                    |
  | id           | f7f46df93a374cc49c0121bef41da03c        |
  | interface    | admin                                   |
  | region       | RegionOne                               |
  | region_id    | RegionOne                               |
  | service_id   | 82378b5a16b340aa9cc790cdd46a03ba        |
  | service_name | manila                                  |
  | service_type | share                                   |
  | url          | http://controller:8786/v1/%(tenant_id)s |
  +--------------+-----------------------------------------+
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
$ openstack endpoint create --region RegionOne \
  sharev2 public http://controller:8786/v2/%\(tenant_id\)s
  +--------------+-----------------------------------------+
  | Field        | Value                                   |
  +--------------+-----------------------------------------+
  | enabled      | True                                    |
  | id           | d63cc0d358da4ea680178657291eddc1        |
  | interface    | public                                  |
  | region       | RegionOne                               |
  | region_id    | RegionOne                               |
  | service_id   | 30d92a97a81a4e5d8fd97a32bafd7b88        |
  | service_name | manilav2                                |
  | service_type | sharev2                                 |
  | url          | http://controller:8786/v2/%(tenant_id)s |
  +--------------+-----------------------------------------+

$ openstack endpoint create --region RegionOne \
  sharev2 internal http://controller:8786/v2/%\(tenant_id\)s
  +--------------+-----------------------------------------+
  | Field        | Value                                   |
  +--------------+-----------------------------------------+
  | enabled      | True                                    |
  | id           | afc86e5f50804008add349dba605da54        |
  | interface    | internal                                |
  | region       | RegionOne                               |
  | region_id    | RegionOne                               |
  | service_id   | 30d92a97a81a4e5d8fd97a32bafd7b88        |
  | service_name | manilav2                                |
  | service_type | sharev2                                 |
  | url          | http://controller:8786/v2/%(tenant_id)s |
  +--------------+-----------------------------------------+

$ openstack endpoint create --region RegionOne \
  sharev2 admin http://controller:8786/v2/%\(tenant_id\)s
  +--------------+-----------------------------------------+
  | Field        | Value                                   |
  +--------------+-----------------------------------------+
  | enabled      | True                                    |
  | id           | e814a0cec40546e98cf0c25a82498483        |
  | interface    | admin                                   |
  | region       | RegionOne                               |
  | region_id    | RegionOne                               |
  | service_id   | 30d92a97a81a4e5d8fd97a32bafd7b88        |
  | service_name | manilav2                                |
  | service_type | sharev2                                 |
  | url          | http://controller:8786/v2/%(tenant_id)s |
  +--------------+-----------------------------------------+
  • 安装软件包
1
# yum install openstack-manila python-manilaclient

在 Share 节点

安装 Manila 组件
  • 安装软件包
1
# yum install openstack-manila-share python2-PyMySQL

以上为 manila 安装大致步骤,具体配置如下

manila 配置

在 Controller 节点

  • 配置 Manila 服务
1
$ vim /etc/manila/manila.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[DEFAULT]
# 配置 RabbitMQ 消息队列访问,<RABBIT_PASS>为 RabbitMQ 的密码
transport_url = rabbit://openstack:RABBIT_PASS@controller
# Controller 节点的 IP 地址
my_ip = <IP 地址>
auth_strategy = keystone
default_share_type = default_share_type
share_name_template = share-%s
rootwrap_config = /etc/manila/rootwrap.conf
api_paste_config = /etc/manila/api-paste.ini

[database]
## <MANILA_DBPASS>为 manila 数据库的密码
connection = mysql+pymysql://manila:MANILA_DBPASS@controller/manila

[keystone_authtoken]
# <MANILA_PASS>为 manila 用户的密码
memcached_servers = controller:11211
auth_uri = http://controller:5000
auth_url = http://controller:5000
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = manila
password = MANILA_PASS

[oslo_concurrency]
lock_path = /var/lock/manila
  • 同步数据库
1
# su -s /bin/sh -c "manila-manage db sync" manila
  • 重启 Manila 服务并设置开机自启
1
2
# systemctl enable openstack-manila-api.service openstack-manila-scheduler.service
# systemctl start openstack-manila-api.service openstack-manila-scheduler.service

在 Share 节点

  • 配置 Manila 服务
1
$ vim /etc/manila/manila.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[DEFAULT]
# <RABBIT_PASS>为 RabbitMQ 的密码
transport_url = rabbit://openstack:RABBIT_PASS@controller
# Compute 节点的 IP 地址
my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
auth_strategy = keystone
default_share_type = default_share_type
rootwrap_config = /etc/manila/rootwrap.conf

[database]
## <MANILA_DBPASS>为 manila 数据库的密码
connection = mysql://manila:MANILA_DBPASS@controller/manila

[keystone_authtoken]
# <MANILA_PASS>为 manila 用户的密码
memcached_servers = controller:11211
auth_uri = http://controller:5000
auth_url = http://controller:5000
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = manila
password = MANILA_PASS

[oslo_concurrency]
lock_path = /var/lib/manila/tmp
  • 配置 Manila share 后端存储
1
$ vim /etc/manila/manila.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[DEFAULT]
# 在 [DEFAULT]下的 enabled_share_protocols 中加入需要的共享协议
enabled_share_protocols = NFS,CIFS
# 在 [DEFAULT]下的 enabled_share_backends 中加入需要使用的驱动
enabled_share_backends = cephfsnfs

[cephfsnfs]
driver_handles_share_servers = False
share_backend_name = CEPHFSNFS
share_driver = manila.share.drivers.cephfs.driver.CephFSDriver
cephfs_protocol_helper_type = NFS
cephfs_conf_path = /etc/ceph/ceph.conf
cephfs_auth_id = manila
cephfs_cluster_name = ceph
cephfs_enable_snapshots = True
cephfs_ganesha_server_is_remote= True
cephfs_ganesha_server_ip = GANESHA_IP
cephfs_ganesha_server_username = root
cephfs_ganesha_server_password = GANESHA_PASS
  • 设置 driver_handles_share_servers 为 False,因为驱动程序不管理共享服务器的生命周期

  • 设置 cephfs_protocol_helper_type 为 NFS 允许 NFS 协议访问 CephFS 支持的共享

  • cephfs_auth_id 转换为授权驱动程序与 Ceph 通信时创建的 Ceph 身份

  • 如果 NFS-ganesha 服务器与 manila-share 服务位于同一位置,cephfs_ganesha_server_is_remote 的值则为 False,如果 NFS-ganesha 服务器是远程的,则为 True,并且要再添加cephfs_ganesha_server_ip, cephfs_ganesha_server_usernamecephfs_ganesha_server_password 选项(或者是 cephfs_ganesha_path_to_private_key 选项)

  • cephfs_ganesha_server_ip 是 NFS-ganesha 服务器的 ip 地址,即使 ganesha 服务器与 manila-share 服务位于同一位置,也建议设置此选项

  • 每次修改配置后都需要重启 manila-share 服务才能生效

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
>   # centos
>   # systemctl restart openstack-manila-share.service
>   
>   # ubuntu
>   # service manila-share restart
>   ```

- 启动 Manila 服务并设置开机自启

```bash
# systemctl enable openstack-manila-share.service
# systemctl start openstack-manila-share.service
  • 创建 CephFS NFS 共享类型
1
2
  manila type-create cephfsnfstype false
  manila type-key cephfsnfstype set vendor_name=Ceph storage_protocol=NFS
  • 启用快照支持

快照需要在 /etc/manila/manila.conf 文件的后端驱动配置中启用 cephfs_enable_snapshots = True ,同时后端 Ceph 也需要启用快照功能

另外,对于每个 share-type 在创建时需要单独添加参数允许进行相关的 snapshot 操作,如 --snapshot_support--create_share_from_snapshot_support--revert_to_snapshot_support--mount_snapshot_support 等参数,也可以如下使用 type-key 命令配置 extra_specs

1
  manila type-key cephfsnfstype set snapshot_support=True
  • 配置 Ceph

然后将 Ceph 集群服务器上生成的 manila.keyring 文件(见上面的 cephfs 配置操作)和 ceph.conf 文件(一般为 /etc/ceph/ceph.conf)复制到运行 manila-share 服务的服务器上的 /etc/ceph 文件夹下,同时为 manila-share 服务和 manila.keyring 文件设置相同的所有者,最后再在 manila-share 服务器上的 ceph.conf 文件中加入以下内容

1
2
3
4
5
6
  [client.manila]
  client mount uid = 0
  client mount gid = 0
  log file = /opt/stack/logs/ceph-client.manila.log
  admin socket = /opt/stack/status/stack/ceph-$name.$pid.asok
  keyring = /etc/ceph/manila.keyring

为了与 Ceph 后端通信,CephFS 驱动程序实例(在 manila.conf 中表示为后端驱动程序部分)需要其自己的 Ceph 身份验证 ID,该 ID 不在同一控制器节点中运行的其他 CephFS 驱动程序实例中使用,说白了就是对于不同的驱动程序实例不要使用相同的认证标识

建议修改 Ceph 客户端的管理套接字文件和日志文件位置,以便它们分别与马尼拉服务的 pid 文件和日志文件位于同一位置

  • 安装 ceph-common

manila-share 节点上还需要安装 ceph-common

  • 配置源

    在文件夹 /etc/yum.repos.d 下编辑文件 ceph-stable.repo 添加 ceph 官方提供的源

    如果觉得国外的源下载速度慢,可以更换为国内的源,例如网易的源 http://mirrors.163.com/ceph/rpm-luminous/el7/

    1
    2
    3
    4
    5
    
    [ceph_stable]
    baseurl = https://download.ceph.com/rpm-luminous/el7/$basearch
    gpgcheck = 1
    gpgkey = https://download.ceph.com/keys/release.asc
    name = Ceph Stable repo
  • 更新软件包缓存

    添加好源后最好通过以下命令更新一下软件包缓存

    1
    
    yum makecache
  • 安装

    更新好软件包缓存后,执行以下命令进行 ceph-common 的安装

    1
    
    yum install ceph-common libcephfs2 libcephfs-devel
  • 重启 manila-share 服务

    1
    
    systemctl start openstack-manila-share.service

参考链接