NovaVMware/DeveloperGuide
目录
开发者 DevStack + vSphere 指南
这是一个为对使用 OpenStack 和 vSphere (ESX, ESXi, 和 vCenter) 驱动程序进行开发的开发者准备的简短指南。
vSphere 环境和清单
设置一个 vSphere 5.1 (或更高版本) 开发环境。为了开发目的,你需要拥有以下一种类型的清单
注意:集群应该启用 DRS,并且“完全自动化”放置已开启。另外,如果你无法让两个或多个 ESX 主机工作,你仍然可以使用集群中的一个主机,但你将无法观察 VM 放置行为,因为除了孤立的主机之外,没有其他地方可以放置 VM。
开发环境
获取 Ubuntu 12.04 (推荐) 虚拟机设置
这个 Ubuntu 工作站可以作为虚拟机本身运行,但它应该具有公共互联网访问权限(理想情况下是直接的,但如果不需要将代码提交回 OpenStack,则 http 代理是可行的,如果你需要,请参阅故障排除页面,了解可能有所帮助的步骤)。它还应该具有与 vSphere 主机相当高的带宽链路,因为它需要将镜像从 Ubuntu 工作站流式传输到 vSphere 主机。
我们建议你的 Ubuntu 工作站具有
- 至少 10 GB 磁盘,20+ GB 更好。
- 至少一个 vCPU,2 个更好。
- 4 GB 内存。
可选设置
如果你使用的是远程工作站(未在你的物理计算机上本地运行),你可能需要遵循 网络故障排除 下的一些额外步骤
在你的新虚拟机中安装 Devstack (http://devstack.org/)
启动后,运行
sudo apt-get install git git clone http://github.com/openstack-dev/devstack.git cd devstack
为 DevStack 设置 localrc
在你的 devstack 目录中创建一个名为“localrc”的文件,内容如下(对于每个带有 $variable_name 的项目,你需要输入特定于你的环境的值,其余的可以保持不变)。
文件 ~/devstack/localrc
ENABLED_SERVICES=g-api,g-reg,key,n-api,n-crt,n-cpu,n-net,n-cond,n-sch,n-novnc,n-cauth,rabbit,mysql,horizon VIRT_DRIVER=vsphere VMWAREAPI_IP=$your_vCenter_ip_address VMWAREAPI_USER=root VMWAREAPI_PASSWORD=$password_goes_here VMWAREAPI_CLUSTER=$your_cluster_name DATABASE_PASSWORD=nova RABBIT_PASSWORD=nova SERVICE_TOKEN=nova SERVICE_PASSWORD=nova ADMIN_PASSWORD=nova HOST_IP=$your_development_vm_ip
注意:如果你想使用特定的数据存储,请配置 VMWAREAPI_DATASTORE_REGEX
注意:如果你正在使用 trivial 清单示例,请省略 VMWAREAPI_CLUSTER 行。
注意:如果你希望将日志写入磁盘(而不仅仅可以通过 screen 访问),请使用 define SCREEN_LOGDIR 指向你希望日志所在的路径。例如
SCREEN_LOGDIR=/var/log
启动堆栈 (第一次)
./stack.sh
第一次启动时这将花费很长时间,因为它会下载所有代码和依赖项。注意:第一次启动可能会失败。
凭据和环境变量
在你的环境变量中获取 OpenStack API 凭据
$ source openrc demo demo
每当你使用 openstack CLI 客户端(例如“nova”、“glance”或“quantum”)进行调用时都需要此凭据。你可以随时从 devstack 目录重新运行此命令,以便在以后重新登录。如果你想要管理员凭据,请使用 admin ($ source openrc admin admin)
Glance 初始设置
获取一个 VMDK 作为磁盘镜像并使用 Glance API 将其上传到 OpenStack。最新的代码(8月中旬)有一个更改,它会在你第一次运行 devstack 时上传镜像。Glance 启动后,运行以下命令查看你是否在 glance 中有一个预配置的镜像
$ glance image-list
获取一个初始 VMDK 用于工作
关于哪些 VMDK 磁盘适用于 OpenStack + vSphere,有很多“陷阱”,因此我们强烈建议你使用提供的镜像开始。在附录中,有关于创建/转换你自己的镜像的信息。
下载 1 GB debian 磁盘镜像(登录此镜像的用户/密码为 nicira/nicira)。
http://partnerweb.vmware.com/programs/vmdkimage/debian-2.6.32-i686.vmdk
将文件放在你的主目录下 ~/
注意:如果你正在使用嵌套的虚拟机,你需要获取 32 位镜像才能使用或排除故障:如何在 vSphere 5.1 中启用嵌套 ESXi 和其他虚拟机 - 更多信息请参见:http://www.virtuallyghetto.com/2012/08/how-to-enable-nested-esxi-other.html#sthash.NJ2VNiwt.dpuf
将你的 VMDK 上传到 glance
建议使用 Devstack 提供的 upload_images.sh 脚本将镜像上传到 Glance
https://github.com/openstack-dev/devstack/blob/master/tools/upload_image.sh
upload_image.sh 有一个依赖项
https://github.com/openstack-dev/devstack/blob/master/functions
该脚本将内省提供的镜像以提取元数据。它期望 URL 作为唯一参数。URL 的方案可以是 http(s) 或 file。当提供一个 flat 磁盘 (*-flat.vmdk) 时,该脚本将尝试检索关联的描述符 (*.vmdk) 以查找正确的元数据。用户也可以指定描述符:在这种情况下,该脚本将尝试查找 flat 磁盘。如果提供了一个 *-flat.vmdk 磁盘并且找不到描述符,则“ide”将被用作默认的 adapter_type,而“preallocated”将被用作默认的 disk_type。
执行示例
$ cd ~/devstack $ ./tools/upload_image.sh http://partnerweb.vmware.com/programs/vmdkimage/debian-2.6.32-i686.vmdk $ ./tools/upload_image.sh file:///home/user/images/debian-2.6.32-i686.vmdk $ ./tools/upload_image.sh "http://partnerweb.vmware.com/programs/vmdkimage/trend-tinyvm1-flat-;ide;.vmdk"
可以提供特定的元数据:镜像文件名格式为 <name>-<disk type>;<storage adapter>;<network adapter>.vmdk 默认情况下,Nova 驱动程序将使用 adapter_type "lsiLogic" 和 disk_type "preallocated"
为了避免元数据问题,强烈建议提供一个 monolithicSparse 或 monolithicFlat 磁盘,其中描述符和 flat 磁盘位于同一目录中。有关 VMware 驱动程序支持的磁盘类型的信息,请参阅 https://docs.openstack.org/trunk/config-reference/content/vmware.html 。有关磁盘类型的常规信息:http://sanbarrow.com/vmdk-basics.html。
或者,可以直接调用 Glance 客户端(以下命令使用 Glance 客户端的 V1 版本)
$ glance image-create --name Debian --is-public=True --container-format=bare --disk-format=vmdk --property vmware-disktype="preallocated" < debian-2.6.32-i686.vmdk
这将打印出一个 <image-id> 以供下面使用。如果你忘记了它,可以随时运行“glance image-list”来查看所有现有的镜像。
还有一个基于 IDE 的镜像可以使用。
wget "http://partnerweb.vmware.com/programs/vmdkimage/trend-tinyvm1-flat-;ide;.vmdk"
注意 vmware_adaptertype 设置为 "ide"
$ glance image-create --name trend-thin --is-public=True --container-format=bare --disk-format=vmdk --property vmware_adaptertype="ide" < "trend-tinyvm1-flat-;ide;.vmdk"
Nova 启动
使用上面的“<image-id>”启动 VM
$ nova boot --image <image-id> --flavor 1 test1
现在你可以使用其他 nova 客户端命令与镜像交互。例如
$ nova list +--------------------------------------+-------+--------+------------+-------------+------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+-------+--------+------------+-------------+------------------+ | 9bb724bf-298d-4a63-a653-dab7fcbd9ac7 | test1 | ACTIVE | None | NOSTATE | private=10.0.0.2 | +--------------------------------------+-------+--------+------------+-------------+------------------+
注意:如果你的磁盘很大,将镜像从 glance 流式传输到数据存储可能需要很长时间(例如,对于 1 GB 的 thick 镜像,大约需要 7 分钟)。这只会发生在第一次在新数据存储上使用新的镜像 UUID 时。你可以通过查看 filestore 的 vmware_base 目录中的文件大小来监控进度。
完成此操作后,你可以使用 vCenter 查看 VM。上述 Debian 镜像的用户名/密码为 nicira/nicira 。
你可以通过访问你的 Ubuntu 主机上的端口 80 来访问 OpenStack Web GUI(称为 horizon),但目前通过 Horizon 进行 VNC 访问已损坏(请参阅:https://review.openstack.org/#/c/30036/ 获取修复此问题的补丁)。
使用 Screen
使用 screen 与单个 openstack 服务交互
$ screen -x stack
参见:https://gnu.ac.cn/software/screen/manual/screen.html <- 如何使用
- “Control + a”进入命令模式... 输入此命令以获取每个新命令字符
字符 0 到 9 切换选项卡
- 字符 'd' 分离会话
- 字符 '[' 进入“复制模式”,允许你导航屏幕跟踪并 'escape' 退出复制模式。
- 字符 '"' 显示一个屏幕列表,你可以使用上下箭头导航
例如,nova-compute 服务在 n-cpu 选项卡上运行,通常是编号 6。因此要导航到它,按 Ctrl+a 然后按 '6',你将切换到它。然后你可以与 n-cpu 的终端交互。
使用开发环境
如果你想重置你的环境,请运行
./unstack.sh ./stack.sh
- stack.sh 的这次运行会更快 (~1 分钟),因为它会重置所有数据库和状态,但不需要重新下载软件包或源代码。
- 运行 ./unstack 后,请务必清理所有数据存储并删除意外留下的所有文件。这将防止许多人们在生产环境中看不到的问题。(例如:部分上传的 VMDK。)
注意:重置环境时不会自动更新源代码。这很有价值,因为你可以手动通过 git 管理源代码,拥有许多分支等。
远程调试器
要使用 pycharm 远程调试器(可能还有 eclipse),请在你的 nova 代码中进行以下更改
index 0e7ecdc,87edf9b..0000000 --- a/nova/cmd/__init__.py +++ b/nova/cmd/__init__.py @@@ -31,8 -31,4 +31,8 @@@
os.environ['EVENTLET_NO_GREENDNS'] = 'y import eventlet -eventlet.monkey_patch(os=False) +if '--debug-host' and '--debug-port' in sys.argv: + eventlet.monkey_patch(all=False,socket=True,time=True,os=False,thread=False) +else: + eventlet.monkey_patch(os=False) +
diff --combined nova/cmd/compute.py index 61cf434,f03a9bd..0000000 --- a/nova/cmd/compute.py +++ b/nova/cmd/compute.py @@@ -33,19 -33,10 +33,19 @@@
from nova.openstack.common import log a
from nova import service
from nova import utils
+cli_opts = [
+ cfg.StrOpt('debug-host',
+ default=None,
+ help='Connect to debug host'),
+ cfg.IntOpt('debug-port',
+ default=None,
+ help='Connect to debug host port'),
+ ]
+
CONF = cfg.CONF
CONF.import_opt('compute_topic', 'nova.compute.rpcapi')
CONF.import_opt('use_local', 'nova.conductor.api', group='conductor')
-
+CONF.register_cli_opts(cli_opts)
def block_db_access():
class NoDB(object):
@@@ -72,16 -63,6 +72,16 @@@ def main()
objects_base.NovaObject.indirection_api = \
conductor_rpcapi.ConductorAPI()
+ if CONF.debug_host:
+ from pydev import pydevd
+ print ('Listening on ' + str(CONF.debug_port) + ' for host ' +
+ CONF.debug_host)
+ pydevd.settrace(host=CONF.debug_host,
+ port=CONF.debug_port,
+ stdoutToServer=False,
+ stderrToServer=False)
+
+
server = service.Service.create(binary='nova-compute',
topic=CONF.compute_topic,
db_allowed=False)
然后在 pycharm 中,创建一个远程调试会话,主机为 localhost,端口为你想要的任何端口。当你运行它时,使用 --debug_host <你的 IP> 和 --debug_port <你的端口>。就是这样!
测试
安装 python 支持库
apt-get 库
$ sudo apt-get install python-dev libmysqlclient-dev python-pip build-essential $ sudo apt-get install libxml2-dev libxslt1-dev libpq-dev
基于 pip 的工具安装
$ sudo pip install --upgrade pip $ sudo pip install --upgrade virtualenv $ sudo pip install MySQL-python $ sudo pip install tox $ sudo pip install python-subunit
pip 代理故障排除
如果你在这里收到连接被拒绝 - 尝试此操作
export PIP_INDEX_URL="http://pypi.openstack.org/openstack"
如果你收到以下错误:“pip 的 wheel 支持需要 setuptools >= 0.8 用于 dist-info 支持”,请尝试此命令
sudo pip install setuptools --no-use-wheel --upgrade
安装 OpenStack 库
$ cd /opt/stack/nova $ sudo pip install -i http://pypi.openstack.org/openstack -r requirements.txt -r test-requirements.txt
注意:确保 requires 列表中的所有内容都已安装。一些安装程序有单独的问题,你可能需要一次清除一个问题。特别是 lxslt 有一些可能需要注意的问题。
使用 TOX 进行测试
参见:https://wiki.openstack.org/wiki/ProjectTestingInterface
在提交代码审查之前需要运行的重要测试是
tox -e py26,py27 tox -e pep8
目前 run_tests.sh 是运行测试的更好方法。
使用 run_tests.sh 进行测试
$ cd /opt/stack/nova $ ./run_tests.sh
... 或 ...
$ ./run_tests.sh nova.tests.virt.vmwareapi
... 只运行 vmware 单元测试。
注意:如果你想在你的正常(非虚拟)环境中使用 python 包,请传递 -N 标志
代码覆盖率测试和信息
使用 tox
$ cd /opt/stack/nova $ tox -e cover (code coverage)
查看 cover 目录下的 html 报告,了解该模块的代码覆盖率。文件 index.html 包含整体覆盖率报告
注意:测试可能需要 10、20 或长达 65 分钟(具体取决于你的硬件、网络和系统),并且不会产生任何输出直到完成。这是正常的。你的系统可能会变得迟缓,但不应该完全死机,系统挂起可能表明测试环境配置不当。测试将在 Mac OSX 上运行。在配置良好的 Ubuntu 12.04 机器上,2 个核心和 2GB 内存应该需要 10 到 20 分钟才能完成。
使用 run_tests.sh
$ cd /opt/stack/nova $ ./run_tests.sh --coverage
附加设置
如果您使用的是 Ubuntu 12.04 并且需要使用 Python 2.6(OpenStack 需要它用于一些测试脚本),请通过以下方式安装旧版本的 python
$ sudo add-apt-repository ppa:fkrull/deadsnakes $ sudo apt-get update $ sudo apt-get install python2.6 python2.6-dev
禁用详细日志记录子系统
将此行添加到 nova.conf 以禁用 amqp 日志记录(例如)
default_log_levels=amqp=WARN,amqplib=WARN,sqlalchemy=WARN,boto=WARN,suds=INFO,keystone=INFO,eventlet.wsgi.server=WARN,nova.openstack.common.rpc.amqp=WARN
故障排除
一些工作场所可能需要使用特殊的网络和/或代理设置,并且这些设置在您移动时可能会发生变化。这些问题可能导致 apt-get、git 和 OpenStack 的其他部分出现问题。如果您所在的地点需要特殊的代理规则,请设置 apt-get 使用代理。您可能还需要根据公司的特定防火墙规则设置其他代理设置。
日志记录
您可能需要监视 devstack 的日志文件。以下是如何以最少麻烦的方式设置文件日志记录。
要设置屏幕窗口的日志记录,请将 shell 变量 SCREEN_LOGDIR 设置为要放置日志文件的目录。日志文件将以类似于 screen-$SERVICE_NAME-$TIMESTAMP.log 的名称出现在该目录中,并且符号链接 screen-$SERVICE_NAME.log 将链接到最新的日志文件。日志会保留 LOGDAYS 变量指定的时间长短。
SCREEN_LOGDIR 和 LOGDAYS 都是 shell 变量,因此您需要在 shell 或 localrc 中设置它们。如果只想让日志这次有效,请使用 shell 命令。如果始终希望出现日志文件,请使用 localrc。
假设您已经创建了一个目录...
$ mkdir ~/log
然后,如果您只想记录这次日志,在您的 bash shell 中说...
$ export SCREEN_LOGDIR=~/log $ export LOGDAYS=2
...或者如果您始终想要日志文件,在您的 localrc 中添加以下行...
SCREEN_LOGDIR=~/log LOGDAYS=2
stack.sh 脚本将自动为您轮换日志文件。
MySQL 问题
如果您在使用 Keystone 时遇到问题,请尝试...
$ mysql -u root -pnova
...如果这不起作用,您可能有一个损坏的 mysql 安装。如果您在让 mysql 正常工作时遇到问题,请尝试清除 OpenStack 版本的安装并手动安装数据库。以下是如何完全删除所有内容并从头开始安装 mysql-server。
$ ./unstack $ sudo apt-get purge mysql-server
...您可能需要使用名称 mysql-server-5.5 代替...
$ sudo apt-get autoremove $ sudo apt-get install mysql-server-5.5 $ sudo mysql_install_db $ sudo mysqladmin -u root password 'nova' $ sudo service mysql restart $ ./stack
Keystone 问题
如果您在通过 curl 检查您的 keystone 连接时遇到问题,那么是您的代理设置。尝试在 /etc/environment 中设置以下内容
no_proxy=localhost,127.0.0.0/8,127.0.1.1,127.0.1.1*,local.home
通用数据库问题
如果您在测试或其他数据库密集型活动中遇到问题,您可能需要遵循
http://codeinthehole.com/writing/how-to-set-up-mysql-for-python-on-ubuntu/
rootwrap 问题
如果网络突然停止工作并出现如下错误
Traceback (most recent call last):
File "/usr/bin/nova-rootwrap", line 59, in <module>
from nova.rootwrap import wrapper
ImportError: No module named rootwrap
那么有东西将一个损坏的 rootwrap 添加到了 /usr/bin。删除 /usr/bin/nova-rootwrap,它将使用 /usr/local/bin 中的正确版本
检查 nova-compute 是否正在运行
$ screen -x
请注意 n-cpu 运行的选项卡。通常是 #6,但有时可能会是不同的选项卡。切换到 n-cpu 的选项卡。ctl+a 然后 6。如果您看到
$ cd /opt/stack/nova && sg '/usr/local/bin/nova-compute --config-file /etc/nova/nova.conf' || touch "/opt/stack/status/stack/n-cpu.failure" sg: group '/usr/local/bin/nova-compute --config-file /etc/nova/nova.conf' does not exist $
...那么 nova-compute 没有启动。您可以手动启动 nova-compute,方法是编辑命令以读取
$ cd /opt/stack/nova && /usr/local/bin/nova-compute --config-file /etc/nova/nova.conf || touch "/opt/stack/status/stack/n-cpu.failure"
...这对于开发是允许的(但不适用于生产环境)。
网络故障排除
远程访问的工作站需要一个 IP 地址才能 SSH 或 VNC 到其中进行工作。这些说明大多假定是本地可访问的 VM 或物理机。如果您正在使用远程托管的 Ubuntu 开发人员工作站,您可能需要考虑特殊的网络问题。如果您发现 nova-network 正在窃取您在环境中的工作站 IP(并非在所有环境中都会出现,因此将其放在此处作为故障排除步骤),那么为 nova-network 设置第二个接口。
配置假的网卡
配置一个假的接口,以便 nova-network 不会窃取您需要远程访问主机的真实 IP。在 Ubuntu 上
$ sudo ip tuntap add dev tapfoo mode tap $ sudo ifconfig tapfoo $some_ip up
注意:为接口分配一个适合您环境的 IP 地址。
现在您已经有了假的以太网接口,更改您的 localrc 并重新运行 ./stack.sh,以便您可以在新的接口上启动 nova-network。
添加到您的 localrc 文件
FLAT_INTERFACE=tapfoo
配置代理
一些工作场所可能需要使用特殊的网络和/或代理设置,并且这些设置在您移动时可能会发生变化。这些问题可能导致 apt-get、git 和 OpenStack 的其他部分出现问题。如果您所在的地点需要特殊的代理规则,请设置 apt-get 使用代理。您可能还需要根据公司的特定防火墙规则设置其他代理设置。
自签名证书
如果您想连接到带有自签名证书的 vSphere,从 Liberty 开始,您必须禁用 nova 和 cinder 的证书验证
[[post-config|$NOVA_CONF]] [vmware] insecure = true [[post-config|$CINDER_CONF]] [vmdk] vmware_insecure = true
附录
转换镜像
使用 qemu-img 将其他磁盘镜像转换为 vmdk
可以使用 qemu-img 实用程序将多种格式(例如 qcow2)的磁盘镜像转换为 vmware nova 驱动程序可用的 VMDK 格式。
例如,以下命令可用于将 qcow2 Ubuntu Precise 云镜像(可从 http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img 下载)转换为 vmdk
qemu-img convert -f raw ~/Downloads/precise-server-cloudimg-amd64-disk1.img -O vmdk precise-server-cloudimg-amd64-disk1.vmdk
将稀疏 vmdk 转换为与 ESX 兼容的格式
由于 VC 驱动程序中处理稀疏 vmdk 磁盘的方式存在一个错误(通过以下建议 补丁 修复,目前正在审核),因此在将其上传到 glance 以供驱动程序使用之前,必须先将稀疏磁盘转换为预配置或预分配磁盘。
有几种方法可以执行此类转换
1. 使用 vSphere CLI(有时称为远程 CLI 或 rCLI)工具。
撰写本文时的最新版本是 5.1,链接是 此处。
假设稀疏磁盘在 ESX 主机可访问的数据存储上可用,以下命令将其转换为预分配格式
vmkfstools --server=ip_of_some_ESX_host -i /vmfs/volumes/datastore1/sparse.vmdk /vmfs/volumes/datastore1/converted.vmdk
(请注意,来自相同 CLI 包的 vifs 工具可用于上传要转换的磁盘并下载转换后的磁盘(如果需要))
2. 直接在 ESX 主机上使用 vmkfstools
如果 ESX 主机上启用了 SSH 服务,可以通过 scp 将稀疏磁盘上传到 ESX 数据存储,并且 ESX 本地 vmkfstools 可以用于执行转换
(在通过 ssh 登录到主机后)
vmkfstools -i /vmfs/volumes/datastore1/sparse.vmdk /vmfs/volumes/datastore1/converted.vmdk
3. vmware-vdiskmanager
vmware-vdiskmanager 是随 VMware Fusion 和 VMware Workstation 捆绑在一起的实用程序。以下是将稀疏磁盘转换为预分配格式的示例
'/Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager' -r sparse.vmdk -t 4 converted.vmdk
在上述所有情况下,转换后的 vmdk 实际上是一对文件,描述符文件 converted.vmdk 和实际虚拟磁盘数据文件 converted-flat.vmdk。要上传到 glance 的文件是 converted-flat.vmdk。
上传镜像到 glance 时指定正确的适配器类型
当前,存在一个限制,即带有 ide 适配器类型的 OS 启动 vmdk 磁盘无法附加到虚拟 SCSI 控制器,同样,带有其中一个 scsi 适配器类型(例如 busLogic、lsiLogic)的磁盘无法附加到 IDE 控制器。因此,在将镜像上传到 glance 时设置正确的 vmware_adaptertype 属性非常重要。特别是,通过 qemu-img 转换的其他格式的 vmdk 磁盘将始终是具有 IDE 适配器类型的单片稀疏 vmdk。因此,使用上述 Precise Ubuntu 镜像的示例,在 qemu-img 转换和转换为预分配磁盘之后,将 vmdk 磁盘上传的命令应如下所示
glance image-create --name precise-cloud --is-public=True --container-format=bare --disk-format=vmdk --property vmware_disktype="preallocated" --property vmware_adaptertype="ide" < converted-flat.vmdk
获取与 vmdk 关联的适配器类型
如果 vmdk 是一个单片文件(例如由 qemu-img 转换生成),则可以通过以下方式检索适配器类型
head -20 some_monolithic.vmdk
并查找 ddb.adapterType=XXX 属性
如果 vmdk 具有描述符/数据文件对(foo.vmdk 和 foo-XXXX.vmdk)。可以检查描述符文件 foo.vmdk 以获取相同的 ddb.adapterType 属性)
