SharedFS
- Launchpad 条目: nova-sharedfs
- 创建时间: 2012年2月26日
- 贡献者: Andrew Bogott
总结
提供一个用于创建可共享文件系统的 API。提供一个用于管理实例访问这些文件系统的 API。文件系统将由特定于系统的驱动程序管理。实例如何发现和挂载文件系统还有待确定。
发布说明
原理
Openstack 目前缺乏任何用于管理文件系统级别存储的系统(例如 lustre、NFS、gluster)。此功能的重要用途包括
- 使用文件级别而不是块级别资源将存储添加到实例。
- 在给定项目的所有实例之间创建共享 /home 目录。
- 任何需要系统间共享文件访问的应用程序。
用户故事
- 实例用户意识到他需要更多存储空间。他创建了一个新的、巨大的 gluster 卷,并使用仪表板将其附加到他的实例。
- 项目的管理员希望自由地创建和销毁实例,而不会破坏用户数据。她创建了一个大型共享 NFS 系统,并配置实例将 /home 挂载到该卷上。
- 在多个实例上运行的代理需要协作处理一个巨大的数据集。该数据集存储在共享文件系统上,所有实例都可以访问该文件系统。
前提条件
实例需要文件系统特定的支持(例如,NFS 或 gluster 客户端)。在实例上安装客户端或驱动程序不在本设计范围内。
设计
给定的文件系统需要一个自定义驱动程序,其中包含关于创建、销毁和导出卷以及管理任何必要的安全设置的必要知识。
可能需要提供文件系统特定的驱动程序在每个实例上运行。
文件系统可以通过 API 调用创建和销毁。创建时,FS 可以具有 'instance'(实例)、'project'(项目)或 'global'(全局)的范围。创建文件系统的 API 调用还需要有关此 FS 在实例内挂载位置的信息。
(可能在 folsom 之后实现的魔法)
项目范围的 FS 会自动附加到并在该项目中创建的任何实例上挂载。
如果不是项目范围的,FS 可以通过 API 调用附加到实例或实例。附加后,FS 将出现在实例的本地文件系统中。)
实现
Create a file system
PUT /v1.1/<tenant_id>/os-filesystem/homeforproject1
# Sample body (project-wide):
{'fs_entry' :
{'size': '4Gb',
'scope': 'project',
'project' : 'project1'}
}
# Sample response (project-wide):
{'fs_entry' :
{'name': 'homeforproject1',
'size': '4Gb',
'scope': 'project',
'project' : 'project1'}
}
PUT /v1.1/<tenant_id>/os-filesystem/project2storage
# Sample body (instance):
{'fs_entry' :
{'size': '80Gb',
'scope': 'instance'}
}
# Sample response (instance):
{'fs_entry' :
{'name': 'project2storage',
'size': '80Gb',
'scope': 'instance
}
}
Get list of available file systems
GET /v1.1/<tenant_id>/os-filesystem
# Sample response:
{'fs_entries':
{'name': 'project2storage',
'size': '80Gb',
'scope': 'instance
}
{'name': 'homeforproject1'
'size': '4Gb',
'scope': 'project',
'project' : 'project1'
}
}
Delete a file system
DELETE /v1.1/<tenant_id>/os-filesystem/project2storage
Normal Response Code: 202
Failure Response Code: 404 (FS to be deleted not found.)
Failure Response Code: 403 (Insufficient permissions to delete.)
List instances connected to a file system
GET /v1.1/<tenant_id>/os-filesystem/homeforproject1/instances
# Sample response:
{'instance_entries':
{'id': 'instance00001'}
{'id': 'instance00002'}
{'id': 'instance00002'}
}
Connect an instance to a file system
PUT /v1.1/<tenant_id>/os-filesystem/homeforproject1/instances/<instance_id>
# Sample response:
{'instance_entry':
{'id': 'instance00001'}
Remove an instance from a file system
DELETE /v1.1/<tenant_id>/os-filesystem/homeforproject1/instances/<instance_id>
Normal Response Code: 202
Failure Response Code: 404 (Instance or FS not found.)
Failure Response Code: 403 (Insufficient permission)
FS 驱动程序接口将类似于现有的 nova-volume 驱动程序接口。它需要以下内容
do_setup(self, context)
check_for_setup_error()
create_fs(fs_name)
delete_fs(fs_name)
list_fs()
attach(fs_name, ip_list)
unattach(fs_name, ip_list)
list_attachments(fs_name)
UI 变更
支持这些功能的命令很可能与管理卷的相同命令是同一部分。今天那是 'nova' 工具,但在 Folsom 中很可能成为特定于卷的东西。
代码变更
在大多数情况下,这将是一个独立的 API。它可能需要查询 Nova 数据库才能管理附加和分离。
为了支持项目范围的共享,我们需要以某种方式连接实例的创建和删除。这可能涉及也可能不涉及修改 nova 代码;可能只是使用队列通知来处理。
迁移
测试/演示计划
未解决的问题
尚不清楚如何在实例上挂载文件系统,更不清楚如何动态地执行此操作,而不仅仅是在实例创建时执行。EC2 元数据可用于启动配置,但目前无法在运行时更改。
1) 通过 ssh 从服务器端推送内容
2) 假设实例上存在一个代理,该代理会轮询文件系统更改
3) 使用 cloud-init 推送一个简单的代理
总有一天会有一个用于安装和与来宾代理通信的既定标准。这显然是正确的解决方案。与此同时,我们可能将自己限制在 Ubuntu 客户端,并使用选项 3。