Tag Archives: Openstack

虽然这个 OpenStack “自动”安装脚本已经写了有一段时间了,但一直也只是躺在 Github 上,没放出来,这几天总结下自己的客座生活,顺便把这个脚本拿出来吧 :-)

先说说这个简陋地轮子的用处:由于经常要测试,不时要往一些新机器装 OpenStack 或者将一些机器重装,我们既不想用 Devstack 装 Git 上的最新版,也不想用 PackStack 安装——感觉不能完全 controll :-)。因为之前跟着官方的文档(真心很长)装,感觉大部分过程都知道,所以就 follow 官方的安装文档写了下面的安装脚本,很简陋,只是用来避免照官方文档手打之苦:-) 。

需要说明的是,这个安装脚本补了一些我们按官方过程走时踩的坑,还做了一些假设,跑脚本前最后先看下,比如我们默认使用 GRE 配置网络,还默认了 mysql 的安装密码,还要求用户配好 hosts。当然可以自己改。

最出坑的地方当然是网络,首先 OpenStack 是可以安装在从只有一个网卡的一台虚拟机上到上千台机器的集群的,脚本默认网络节点有两个网卡,你也可以只用一个,但是 OVS 的网桥可千万不能省:-) 首先,请保证需要开得端口都开着,比如 MySQL 的
3306,HTTP 的80,NTP 的123(如果你像我只前一样在局域网自己搭建 NTP)等等。然后,Neutron 官方文档在 sudo 上有 bug,虽然我提交过了,但是貌似老版的文档并没有更新,就是这句:openstack-config --set /etc/neutron/neutron.conf agent \
root_helper sudo "neutron-rootwrap /etc/neutron/rootwrap.conf"
,一定要加引号,不然 neutron server 启不起来的,还有 neutron 的 sudo 工作也常会出些问题,需要我们干预下,在 sudoer 文件里加一行“neutron ALL=(ALL) NOPASSWD: ALL”,还有默认的“Defaults !visiblepw”也需要改成“Defaults visiblepw”。此外,建立 GRE 通道千万不要在 local ip 上用别名,必须用真实的 ip,不然也不会工作的。再就是 Horizon,为了能用多种域名/IP访问 Horizon,需要设置好 ALLOW-HOSTS,还有为了让 admin 正确登录,需要设置 OPENSTACK_KEYSTONE_DEFAULT_ROLE。最后,SELinux 经常阻止我们正常登录,不想调试像快速解决可以直接关掉它。

还有个深坑啊,就是官方文档居然没有说明我们在用 OVS 改了网后需要设置 network-scripts!怎么设置可以参考我的脚本。然后网络最好开开 namespace,方便些。还有,要用 OVSHybridIptablesFirewallDriver 来实现安全组的话,一定要在 nova 设置写好“libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver”,这点官方文档也没有说!

最后,安装基于 OpenStack Havana (2013.2.2),代码由 Redhat 打包,祝大家安装时能少遇坑,早享受! Read More →

最近在测试自己写的 OpenStack 安装脚本,之前都把控制节点和网络节点合在一起,这次为了把脚本分开,遇到了不少之前没有的问题,好在大部分都通过 Google + Docs 解决了,但是最近发现网络节点的 l3-agent 时常产生与消息服务器(控制节点)断开连接的问题:

2014-02-24 16:53:01.778 2378 ERROR neutron.openstack.common.rpc.impl_qpid [-] Failed to consume message from queue: heartbeat timeout

2014-02-24 16:53:01.784 2378 INFO neutron.openstack.common.rpc.impl_qpid [-] Connected to AMQP server on controller:5672

2014-02-24 18:31:00.829 2377 ERROR neutron.openstack.common.rpc.impl_qpid [-] Failed to consume message from queue: connection aborted

2014-02-24 18:31:00.836 2377 INFO neutron.openstack.common.rpc.impl_qpid [-] Connected to AMQP server on controller:5672

就像上面的日志显示那样,常常忽然连不上,然后再隔零点几秒又显示连接成功,让人看着非常不爽。前几天恰好看到了淘测试的一篇日志 GBA历代得主 ,里面提到淘宝的集群曾遇到过每个服务器都开了 NTP 同步时间,估计是连外网的 NTP 服务器对时把,造成了时间存在微小差异,导致心跳超时,我就心想我们的网络节点需要连 Qpid 服务器(控制节点),总是差那么零点几秒就会重连成功,而且我们的机器也都是开着 NTP 对时,是不是一个问题呢?

于是我就是试着用控制节点作为我们内网的授时服务器,整个内网都与整个授时服务器同步时间,这样用局域网速度应该会快很多,鸟哥的书固然好,但好像还是有些问题,我的配置过程如下:

一、修改控制节点的 /etc/ntpd.conf 文件,开放内网的访问(查询):

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

至于连接哪个 NTP 服务器看喜好了,我一般使用的是 cn.pool.ntp.org。

二、开放防火墙123端口,设置完规则不要忘了保存:

iptables -A INPUT -p udp dport 123 sport 123 -j ACCEPT
iptables -A OUTPUT -p udp sport 123 dport 123 -j ACCEPT

三、重启ntp服务,用 ntpstat 和 ntpq -p 查看下我们的授时服务器与上层连接的状态,我这里 delay 一般在20~50左右(单位为毫秒),由于与 sysnet.edu.cn (屏幕没有显示全)延时最小,所以使用的是这个(在屏幕上用*注明):

> ntpstat:
synchronised to NTP server (202.112.31.197) at stratum 3
time correct to within 96 ms
polling server every 1024s> ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*dns2.synet.edu. 202.118.1.46 2 u 420 1024 377 21.951 0.367 13.759
+dns.sjtu.edu.cn 202.112.29.82 3 u 567 1024 377 49.529 11.216 14.545
+Hshh.org 127.67.113.92 2 u 661 1024 377 48.000 -26.821 9.765

ntpq 的返回结果比较复杂,这里顺便解释下,refid 表示这个授时服务连接上一层授时服务器,在服务器名前加 * 表示是当前使用的服务器,st 指得是 stratum,里面的数字表示这个授时服务器的等级,详见鸟哥的介绍。t 这一列里边的 u 表示是 unicast 单播,在 NTP 服务中是最常见的方法,when 表示从上次连接已经过去了多久,单位是秒,poll 表示连接间隔,reach 表示是否成功,正常的话这里应该是377,delay 表示延时(应该是估计的吧)单位是毫秒,offset 表示本地与服务器的时间差,同样是毫秒,jitter 表示在反复获取时间时,获得的时间的差异,这个差异可能比较随机,详见 NTP 官网的 FAQ。 Read More →

在 OpenStack 官方的 RedHat/CentOS/Fedora 平台安装指南上,关于消息中间件里举例用的是 Qpid 所以我也就跟着用 Qpid 作为消息中间件,当然文档也指出了 RabbitMQ、ZeroMQ 均可以。后来才知道原来 RedHat 的 RDO 部署时用的就是 Qpid,不过 RDO 社区也有人指出 Qpid 存在一些 bug 影响使用,应当考虑 RabbitMQ 的文章(链接)。不是很清楚 RedHat 为什么选择 Qpid 作为默认,不过据小道消息说 Qpid 有 RedHat 在 support,我去翻了下 Qpid 托管在 Github 上的 Git 仓库,8个 contributor(让我这种混迹于 OpenStack 社区的人感觉规模真是……),只查到一个是受雇于 RedHat,倒是好几个摩根的……不过也许这就可以说明 RedHat 和 Qpid 关系不错了。

不管怎么样,我花了些时间,稍研究了下 Qpid,下面是一些笔记。 Read More →

实习的实验环境是VM vSphere,也就是在虚拟机上实验部署OpenStack,会遇到一些在安装说明上不涉及的问题,在这里记录下。

1. 启动虚拟机时显示 no valid host ,尽管机器是OK的。
如果是原模原样照着说明装必然会出此错误,因为虚拟机上启虚拟机只能使用qemu,而默认却并非如此,所以需要在 /etc/nova/nova.conf 里设置虚拟后台技术为qemu。

2. 启动了虚拟机后,ssh也能登进去,但是ping不出来。(似乎是这个症状)
vSphere建的网卡默认不是混杂模式,网卡如果不是混杂模式是不允许目的地址不是本机MAC的数据包通过网卡的,所以需要将本机的MAC设为混杂模式。

3. 启动虚拟机如果在计算节点启动,返回:Timeout while waiting on RPC response – topic: “network.compute1″, RPC method: “deallocate_for_instance” info: “
似乎是消息服务器的问题,看日志是rpc的call()等待超时,网上有人说是消息服务器崩溃了,需要重启所有服务,我稍微修改了了下代码,不断查日志,最后不知到是因为动哪的原因结果就好了。 Read More →

今天上午刚把Keystone装利索了,做了几个简单实验,因为实验室虚拟机紧张,也没拿别的机器去做测试,然后跑虚拟机的服务器又是个Windows Server,用起来不爽,自己机器和虚拟机不是一个网段的,ping都ping不同所以只能放弃别的实验了。

安装Keystone基本上很正常,按着官方的 OpenStack Installation Guide for Red Hat Enterprise Linux, CentOS, and Fedora – havana 在 CentOS6.5 上装没有遇到什么问题,唯一的问题就是设置了hostname为controller后,有几个设置操作涉及到这个controller,比如:
openstack-config --set /etc/keystone/keystone.conf \
sql connection mysql://keystone:KEYSTONE_DBPASS@controller/keystone

还有:
export OS_SERVICE_ENDPOINT=http://controller:35357/v2.0
请各位看官们注意,如果你没有设置hosts的话,这里是必然会有问题的,我开始不知道怎么图样图森破居然丧心病狂的以为OpenStack是不是如此牛X,居然能用hostname直接访问,就像loaclhost?后来才想起来localhost也是在hostname里定义的……所以不要忘了在hosts文件里加这么一行:
192.168.0.1 controller
这样后面的操作才能正常啊。当然,你也可以在操作时都用127.0.0.1,不过用controller显然更加赏心悦目啊。

然后,每跑完命令都可以在MySQL里看一看,正常的来说,走完Manual的整个keystone部分后 table status 应该是这样的:


+------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
| Name                   | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation         | Checksum | Create_options | Comment |
+------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
| credential             | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| domain                 | InnoDB |      10 | Compact    |    1 |          16384 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| endpoint               | InnoDB |      10 | Compact    |    3 |           5461 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| group                  | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| group_domain_metadata  | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| group_project_metadata | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| migrate_version        | MyISAM |      10 | Dynamic    |    1 |            104 |         104 | 281474976710655 |         4096 |         0 |           NULL | 2014-01-13 21:11:26 | 2014-01-13 21:11:30 | NULL       | latin1_swedish_ci |     NULL |                |         |
| policy                 | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| project                | InnoDB |      10 | Compact    |    2 |           8192 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| role                   | InnoDB |      10 | Compact    |    2 |           8192 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| service                | InnoDB |      10 | Compact    |    1 |          16384 |       16384 |               0 |            0 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| token                  | InnoDB |      10 | Compact    |   13 |           8822 |      114688 |               0 |        32768 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| trust                  | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| trust_role             | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| user                   | InnoDB |      10 | Compact    |    1 |          16384 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:30 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| user_domain_metadata   | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| user_group_membership  | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| user_project_metadata  | InnoDB |      10 | Compact    |    1 |          16384 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
+------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
 

你可以把表里面的值都翻出来看一看,与 kestone user-list 、 keystone tenant-list 什么的做个对比,可以看到 keystone 确实就是一直在搞数据库。然后假设你退出了(Verify 那一页的两个 unset),再登陆可以这样:
keystone --os-username=admin --os-password=ADMIN_PASS \
--os-auth-url=http://controller:35357/v2.0 token-get

或者:
keystone --os-username=admin --os-password=ADMIN_PASS \
--os-tenant-name=admin --os-auth-url=http://controller:35357/v2.0 token-get

不过最简单的:建立一个keystonerc,里面设置好:
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_TENANT_NAME=admin
export OS_AUTH_URL=http://controller:35357/v2.0

这样再登入只需要 source keystonerc 即可。 Read More →