Jan 112013
 

Openstack的Dashboard项目Horizon,其实做的很不错。其实如果你熟悉他的代码,对他进行一下简单修改,可以实现很多你需要的功能。很多时候,并不需要做太大的改动。

很多人都是根据Openstack的dashboard来判断有什么功能,其实Dashboard只是Openstack的部分功能,很多你需求的功能,可能很简单就可以实现,基本没啥代码量。当你读Openstack的代码,你带着下面这些需求去看,估计效果更好。如果你实现了下面这些功能,至少说明你已经开始熟悉Openstack。需要记住一点就是下面的功能,全部都是通过调用API实现。

下面的这些功能,你就可以拿来练手。我大概估算一下工作量,如果一个python程序员,从熟悉Openstack开始,加上大家交流,我估计3个月,应该就可以基本搞定下面的功能。这基本都是基于Openstack的Horizon来修改。以下的内容,我公司的开发人员,基本都已经玩了一遍。

大概是3,4百行的代码修改量。

1:虚拟机自动获得Floating IP

当你创建虚拟机的时候,默认是获得一个fix ip,公网的IP,需要手工获得。如何能实现自动获得IP呢?其实nova默认就有这个功能,你只需要在nova.conf 文件加上一个参数就可以实现。现在Grizzly,也在努力实现这个功能。这个功能在HPcloud上已经实现。我同事已经验证了这个功能。这个其实不需要增加一行代码。

2:默认安全组的改进

这个其实是让很多新手比较困惑的地方。默认的安全组是没任何规则,不允许访问。是否可以默认加上ssh和允许ping的规则呢? HPcloud,默认的每个新的用户,都是打开22端口和允许ping。实现这个其实也不难,找对相应的文件的位置,修改就可以,通过调用API来实现。

3:安全组添加UI改进

现在安全组添加完一条规则,马上就关闭页面,如果添加多条规则,很不方便。这个其实是考验你的web水平。现在Grizzly已经决定改进这个地方。这个实现起来,应该是很简单的。

https://blueprints.launchpad.net/horizon/+spec/security-group-rules

4:把虚拟机创建在指定的物理服务器

如果你是管理员,你是可以通过命令行,指定虚拟机在那台物理服务器上创建。如果你希望在Dashboard里实现那么你需要做不少工作。首先你需要把所有的服务器列出来,你才能去选择。需要实现通过API的方式,把你zone里的服务器列出来,产生一个列表,让用户选择。当你把服务器列出来后,后面就简单了,你只需要把参数传过去就可以。

当你机器数量比较少的时候,这样玩是没问题的。而且用户也习惯这种方式。

5:虚拟机关机

默认虚拟机是不能关机的,这其实也是运营模式决定的。不过其实nova 的api是提供虚拟机关机的功能。你只需要调用API接口就可以实现。

6:变更虚拟机配置 Resize

这也是经常提到的问题。为了统一的管理,其实一般都是几个固定的配置,你可以根据你的要求,对配置进行变更。是否支持运行状态下变更配置,这其实基本是由Hyper-V决定。vmware是可以支持cpu,硬盘,网卡,内存的在线添加。对于KVM来说,就只能支持磁盘和网卡。

变更配置,在Openstack里是Resize, 他是要调整虚拟机的硬盘,内存和cpu。对于nova来说,Resize还是比较复杂的,出于运维,管理和成本的考虑,Resize,会对虚拟机进行一个迁移,这样你还需要处理网络的问题。

目前nova是提供了这个功能,不过要很好实现,目前还是很麻烦。最简单的方式就是本地resize,这样你至少就不需要考虑网络。这个我同事基本已经实现了,本地实现resize。

关于Resize,sina修复了两个bug,这个可以看看,https://www.openstack.org/blog/2012/10/how-sina-contributes-to-openstack/

7:热迁移

其实以前大家都认为热迁移的实现,都是需要有共享存储,其实现在各个虚拟化引擎,都已经实现不需要共享存储,也可以实现热迁移。据专家说:KVM下实现热迁移,比Xen好很多。

Nova目前是支持热迁移了,无论是有共享存储还是本地存储。如果是本地存储,为了减少网络的传输压力,如果你的image是qcow2的格式,你可以利用这个特性。至少在演示的时候很酷,本地存储,一下子就迁移过去。

目前这种迁移,其实都是手工去触发。你需要把虚拟机迁移到那台机器上。其实这种操作,也就适合小规模的环境或者是在维护的时候。

在vmware的世界里,热迁移叫VMotion,不过据朋友介绍,当你的虚拟机内存达到16G的时候,你其实就很难迁移,可能是几个小时都无法迁移过去。这其实更多的是一个玩具。

8:冷迁移

这个其实也简单。本地存储,共享存储,都是可以实现。nova都提供相应的API,你只需要在Web实现就可以。不过这种迁移,如何实现对现有的系统影响更少。这是一个问题,尤其是硬盘的IO上。

对于迁移,无论是冷迁移,热迁移,Resize,其实网络和volume都是麻烦的事情,尤其在quantum的网络里。目前这个应该是要花费大量的时间。

9:虚拟机设置root密码

默认nova是采用密钥登陆。这肯定是一个方向。不过用户的习惯,有时候很难改变。他可能更加希望可以创建虚拟机的时候设置密码。

其实nova默认也是提供这个功能。你可以设置虚拟机的root的密码。也可以随机生成密码。你需要做的是如何告诉用户,随机密码是什么。

linux的ssh登陆,密码和密钥,你只能二选一,所以你做image的时候,需要进行设置。

10:集成监控Nagios

Openstack缺乏监控,如何加上监控,集成在Dashboard里?这个应该比想象中简单。因为Horizon默认就考虑到这个。你看一下代码就可以实现。你的模板需要默认启用snmp,这样你的虚拟机都可以监控。考验的就是你对Nagios熟悉。这种方式,在企业内部使用,应该是非常方便的。

Intel的一个Openstack修改版本,已经实现了这个功能。效果其实很不错。

11:多Region实现

当你的环境下有几个环境,或者有Xen和KVM,如何用一个Dashbaord来管理。现在新浪的搞的Stacklab就是类似的方式实现的。

其实这个也很简单,不需要配置任何东西,只需要配置一下就可以。如果如果你希望多个环境使用统一的用户验证,估计需要调整一下。这个是不需要修改代码。

12:用户修改密码

目前用户是没法修改自己的密码,只有管理员可以修改自己的密码。这个功能其实是一定要加上的。实现起来应该不难。目前管理员是可以重设用户的密码,就说明已经有接口,看一下如何实现就可以。需要你了解一下keystone的接口。

13:批量创建虚拟机时候的计算机名字

如果你使用qcow2 镜像格式,批量创建虚拟机是一件比较爽的事情。唯一的问题就是创建出来的虚拟机的命令都是一样。希望可以实现在你指定的计算机名字后面加上数字来区别。邮件列表里有老外提问,不过没有解决。Hpcloud不允许客户自己定义计算机名,是随机生成。

这个同事已经实现。不过只是linux的虚拟机。windows的虚拟机,如果解决呢?现在看来还是有可能实现的。慢慢研究。

13:snapshot备份改进

目前Dashboard里是提供的snapshot的功能。如果你采用qcow2的格式,那么他实际的过程是把base部分和增量部分合并,保存到glance里。这里面是无法实现增量的备份。

一直以来,用户都需要通过快照的方式实现备份,由于虚拟机比较大,所以必须实现增量。

新浪目前已经在实现如何增量备份虚拟机。正在把代码加入Grizzly中 ,这个贡献可真不小啊。https://blueprints.launchpad.net/cinder/+spec/local-storage-volume

非常值得期待。

14: 修改调度

如果才能最大化利用资源,充分利用机器的所有的cpu和内存。我们需要修改它的调度。

假设我有两组机器,1组是新机器,1组是旧机器。我希望实现配置1的虚拟机,都是在新组机器创建,配置2的虚拟机都是在旧的那组机器创建。我如何修改调度去实现这个需求。

目前这个需求实现还是比较困难。正在想办法。

经过学习,好像未来的Grizzly版本,已经解决了这个问题:http://www.cloudcomp.ch/2013/02/how-do-you-organise-your-openstack-deployment/

  36 Responses to “Openstack Dashboard 二次开发”

  1. 您好,请问在指定物理机上创建虚拟机的具体命令是什么?E版本可以支持吗? 我在文档里没找到

    • 不好意思,是我看文档不细致,现在找到了。着这里:http://docs.openstack.org/essex/openstack-compute/admin/content/specify-host-to-boot-instances-on.html

  2. 你好,我想请问下目前nova的flavor都是固定的,比如m1.small等等,如果想要让用户在启动实例的时候能够自己定制cpu,内存的话应该从哪方面入手?

    • 在一个生产环境,其实是不建议这样做。这样做弊端很多,应该去避免。相信openstack不会支持类似的功能。

  3. 沙克老湿~
    请教个问题。在ubuntu12.04.1 下部署的openstack,在控制节点架了一个nfs共享作为实例的存储目录。想实现resize功能。修改了/virt/libvirt/connection.py两行源码之后,可以实现resize,但是实例起来后fixed ip地址变成内网路由器分配的地址。网络不通了。看了你的文章提到了你的同事在单节点上resize成功的。找了openstack bug列表,有点乱。还有个小问题,openstack自动创建的br100的配置文件在哪?一直没找到在哪。。。指教指教,感激不尽!

    • 我自己其实没测试过resize。这个功能应该到的Grizzly,才算是真正修复。

  4. 沙克老师 Nagios集成在dashboard,能不能说的再详细点 我不是很清楚

  5. 你好,我想问一下,我看到虚拟机的IP地址有固定IP、floating IP还有access_ip_v4,这几个地址有什么区别呢?如果我创建虚拟机的时候就想指定IP地址,能实现吗?需要修改代码吗?

    • 先搞明白这些地址的意思,你再去考虑所谓的开发吧。

      • 好的,谢谢,沙克老师,由于现在项目时间紧迫,能否麻烦你指点一下,access_ip_v4的用处是什么?

  6. 本地resize是指什么?怎么实现的?

  7. H 版已经可以做到修改自己的密码了。

    还需要稍稍修改一下 settings.password 里面的代码和keystone的policy.json

    • 现在因为keystone的bug,还无法出现在dashboard里。

      • 他的注释是说

        # TODO(mrunge): remove restriction, when keystone v3 has a update own user
        # function and checks passwords properly.
        if keystone.VERSIONS.active == 2:
        —-dashboard.Settings.register(PasswordPanel)

        我看过相关的代码,v3看起来是可以修改自己的密码的。
        用了一下,暂时没有出什么问题。

        • 很奇怪,relesnote说这个特性还不能在v3使用。

          • 代码已经在里面,是因为keystone的bug,临时把他关闭。主要原因是修改密码的时候,原来的密码可以乱填就可以修改。

          • 懂了。 我也找到了不个bug的报告。

            那么,如果 keystone 不直接暴露给用户的话,应该可以在horizon这边做一下密码校验?

  8. 你好,我现在需要从一份windowsimg文件创建多个实例,但是每个实例的计算机名希望不一样,要不相同的计算机名,可以ping通,会有一个问题就是无法看到这个组,也就不能访问。把计算机名改成不一样的就可以了,如何在boot的时候直接设定不同的计算机名

    • 这个其实已经实现,通过windows的cloud init。你可以体验一下。Openstack测试windows2012 R2虚拟机,先要下载image文件,http://t.cn/8kHLKX4,我在linux下无法解压这个文件,只能在windows解压后,16G,上传到linux下,upload到glance上。最麻烦就是获得windows镜像的密码,参考文档http://t.cn/8kHLKXc 就可以搞定。

  9. 您好,
    OpenStack Dashbaord里,点击Access&Security, 然后选择Floating IPs,就会列出当前可用的floating ip。 我想知道这个功能怎么实现的呢,有那部分代码吗。

    因为我们自己搭建了一个Openstack dashbaord, 但是因为需要我们现在要弄个新的简单的dashboard,想要创建的时候点击一个button就能列出可用的floating ip, 跟Openstack的那个功能很类似, 但是不知道代码怎么写

    谢谢

  10. 我要去给客户培训 Dashboard 二次开发,有相关文档共享一下吗?

    • 现在的Horizon照样子画葫芦,我们都会。Horizon缺乏前端的校验,目前J版本在完善。还有就是图表功能,由于license的问题,不会做的太好看。别的都挺好的。

      我们给一家公司改过一次,用horizon管理ibm的Powervc,折腾了很久。

      • 沙克老师,你好,有个问题请教一下——

        openstack_auth是怎么把request对象加入到KeystoneBackend类的?
        openstack_auth/backend.py 内的get_user函数,有一段注释“Note: this required monkey-patching the “contrib.auth“ middleware to make the “request“ object available to the auth backend class.”。
        但是,我看contrib.auth下的代码还是没发现。

  11. 陈沙克老师,如何实现snmp监控虚拟机的信息呢?必须要在虚拟机里安装snmp么?

  12. 沙克老师,你好,有个问题请教一下。
    我是用rdo方式安装的icehouse版本,用的是nova-network的多主机模式,我已经用命令行增加了浮动IP段,并且可以用命令行成功获取和分配浮动IP
    但是现在增加浮动ip只能通过命令行的方式,在Horizon用使用那个添加浮动ip的功能总是失败。
    错误:Unable to associate floating IP.
    请问这是什么原因,谢谢

  13. 老师,我有一个问题:
    用openstack dashboard登录时,只需要输入用户名和密码。
    而使用keystoneclient进行身份验证时,
    keystone = client.Client(username=username, password=password,tenant_name=tenant_name, auth_url=auth_url),tenant_name和auth_url是必须的,这是为什么呢?

  14. 沙克老师:
    最近开始接触openstack二次开发方面的内容,准备先从horizon源码开始起步,我想在pycharm的Ide环境下实现对horizon源码的简单调试,请问能否实现?我在导入源码后,运行mannage.py,pycharm会提示许多依赖包没有装,用Ide执行安装又不能成功,很是苦恼,请问我的问题出在什么地方,是不是horizon就无法在Ide下调试呢?

  15. 您好,沙克老师,你好,有个问题请教一下。
    我在使用kilo版本keystone v3的时候 一切换项目就发生Unauthorized: Unauthorized

    重新登录就好了,是不是切换项目后必须要重新获取token

  16. 我用Fuel部署的openstack juno 版本,在dashboard界面的Project菜单上没有Network的功能选项,admin菜单中也没有,是什么原因

 Leave a Reply

(required)

(required)