跳转到: 导航, 搜索

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。

BoF 议程和讨论