分享

openstack metadata实现原理

victorye81 发表于 2015-3-2 23:43:19 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 5 44786
有人可以讲讲openstack metadata的实现原理吗?
为什么只能在第一次启动虚拟机的时候使用,后续虚拟机重启却不能使用该服务达到相应效果?

感谢!

已有(5)人评论

跳转到指定楼层
victorye81 发表于 2015-3-3 23:47:01
xuanxufeng 发表于 2015-3-3 00:40
看看注入的时候,是不是有错误DEBUG下。
详细参考下面:

感谢,用法解释的很详细了。
再问一个问题:cloudinit在整个metadata注入过程中是如何发起请求,L3 agent是如何监听请求,netadataserver如何响应请求的过程能否剖析下呢?
另外,Cloudinit是在这几种使用模式下是否都需要参与工作呢?
回复

使用道具 举报

xuanxufeng 发表于 2015-3-3 00:40:52
看看注入的时候,是不是有错误DEBUG下。

详细参考下面:




Openstack文件和元数据注入

说明:
openstack在创建实例的时候可以将文件注入到实例中,也可以传一些参数到实例,这在有些情况下会非常有用,比如修改root密码,注入ssh密钥,对实例的个性化定制(后面会举例子)
Note: 只有注入文件失败才会使创建实例过程失败
对注入的支持可以有loop,guestfs, nbd, mount等,其中 mount 不安全。缺省使用:
img_handlers=”loop,nbd,guestfs”
对于nbd,在ubuntu下只需要加载内核模块(modprobenbd)和安装qemu-nbd
在centos下就比较麻烦了,需要手工编译 nbd 和qemu-nbd
Guestfs方法比较简单,只需要安装正确的包就可以,ubuntu下安装guestmount, centos需要安装libguestfs和fuse
本文档是以nova命令行的方式,图形对有些参数的支持还没有
使用nova命令需要设置以下参数
export OS_USERNAME=user
export OS_PASSWORD=pass
export OS_TENANT_NAME='tenant'
export OS_AUTH_URL=http://localhost:5000/v2.0
1. 注入ssh密钥
a)   创建密钥(ssh-keygen)
b)   添加密钥对
i.   novakeypair-add --pub_key .ssh/id_rsa.pub mykey
c)   创建实例的时候注入密钥
i.   novaboot --key_name mykey --image id_of_image --flavor 1 name_of_instance
Note: id_of_image可以通过novaimage-list取得
2. 注入文件
假如我要注入.vimrc这个文件到新创建的实例中,可以:
nova boot --file/root/.vimrc=/root/.vimrc --image id_of_image --flavor 1 name_of_instance
Note: 可以注入多个文件(最多5个),只要写多个--file<dst-path=src-path>
3. 注入元数据
可以通过--meta给实例中传入键值对,注入后会写在/meta.js文件里,以类似python字典的方式存储在虚拟机的/meta.js文件中
nova boot --meta key2=value2 --metakey1=value1 --image id_of_image --flavor 1 name_of_instance
Cat /meta.js  # 虚拟机中
{"key2": "value2","key1": "value1"}
4. 示例:
假如我们想让新创建的实例运行一个初始化脚本,但这个脚本会根据不用的需求有所变化,我们可以这样做
在创建镜像模板的时候在/etc/rc.local中加入
/opt/init.py
Init.py可以读取注入的元数据(meta.js)比如
{"url":"http://example.com/init.sh"}
得到初始化脚本的地址,下载下来并执行,这样的好处是对不同的需要可以有多个初始化文件,而不用修改模板
5. DEBUG
将操作过程中遇到的报错信息帖出来帮助除错
报错信息:
2012-06-04 17:48:14 TRACEnova.rpc.amqp Failed to mount filesystem: Unexpected error while running command.
2012-06-04 17:48:14 TRACEnova.rpc.amqp Command: sudo nova-rootwrap guestmount--rw -a /var/lib/nova/instances/instance-00000075/disk -m /dev/sda1/tmp/tmpJNUwS9
2012-06-04 17:48:14 TRACEnova.rpc.amqp Exit code: 1
2012-06-04 17:48:14 TRACE nova.rpc.amqpStdout: ''
2012-06-04 17:48:14 TRACEnova.rpc.amqp Stderr: 'Traceback (most recent call last):\n  File "/usr/bin/nova-rootwrap", line5, in <module>\n   pkg_resources.run_script(\'nova==2012.2\', \'nova-rootwrap\')\n  File "/usr/lib/python2.6/site-packages/pkg_resources.py",line 461, in run_script\n   self.require(requires)[0].run_script(script_name, ns)\n  File"/usr/lib/python2.6/site-packages/pkg_resources.py", line 1194, inrun_script\n    execfile(script_filename,namespace, namespace)\n  File"/usr/lib/python2.6/site-packages/nova-2012.2-py2.6.egg/EGG-INFO/scripts/nova-rootwrap",line 69, in <module>\n   env=filtermatch.get_environment(userargs))\n  File"/usr/lib64/python2.6/subprocess.py", line 639, in __init__\n    errread, errwrite)\n  File"/usr/lib64/python2.6/subprocess.py", line 1228, in_execute_child\n    raisechild_exception\nOSError: [Errno 2] No such file or directory\n'
解决办法:安装libguestfs-mount(CentOS)
报错信息
Command: sudo nova-rootwrap fusermount -u /tmp/tmpJNUwS9
Exit code: 1
Stdout: ''
2012-06-04 17:52:02 TRACEnova.rpc.amqp   File"/usr/lib/python2.6/site-packages/nova-2012.2-py2.6.egg/nova/virt/disk/api.py",line 258, in inject_files
2012-06-04 17:52:02 TRACEnova.rpc.amqp     img.umount()
2012-06-04 17:52:02 TRACE nova.rpc.amqp   File"/usr/lib/python2.6/site-packages/nova-2012.2-py2.6.egg/nova/virt/disk/api.py",line 222, in umount
2012-06-04 17:52:02 TRACEnova.rpc.amqp    os.rmdir(self.mount_dir)
2012-06-04 17:52:02 TRACEnova.rpc.amqp OSError: [Errno 16] Device or resourcebusy: '/tmp/tmpIfnkPL'
2012-06-04 17:52:02 TRACEnova.rpc.amqp
解决办法:安装fuse(CentOS)

回复

使用道具 举报

rsgg03 发表于 2015-3-3 00:32:01
引用:
  1. openstack里的metadata,是提供一个机制给用户,可以设定每一个instance 的参数。
  2. 具体可以参见openstack的相关api和以下的蓝图:
  3. https://blueprints.launchpad.net/nova/+spec/openstack-api-metadata
  4. 比如你想给instance设置某个属性,比如主机名。metadata的一个重要应用,是设置每个instance的ssh公钥。公钥的设置有两种方式:
  5. 1、创建instance时注入文件镜像
  6. 2、启动instance后,通过metadata获取,然后用脚本写入
复制代码


个人认为可能性不大,是否做了哪些设置,细心观察其他变化

回复

使用道具 举报

victorye81 发表于 2015-3-3 23:49:59

再问一下,metadata是否只能在虚拟机初次创建时使用呢?后续重启虚拟机是否还能使用metadata服务或者更改用户metadata达到新的效果?感谢
回复

使用道具 举报

rsgg03 发表于 2015-3-4 01:40:57
victorye81 发表于 2015-3-3 23:49
再问一下,metadata是否只能在虚拟机初次创建时使用呢?后续重启虚拟机是否还能使用metadata服务或者更改 ...



cloud-init是一个在启动的时候定制你的Iaas平台中虚拟机的包,它可以帮助你重新定义你的虚拟机而不需要重新安装,只需要加入对应的配置项即可。
虚拟机启动时会发起请求,metadata服务向nova-conductor查询后,返回metadata agent,再由metadata agent返回给metadata proxy,然后返回给虚拟机的。
参考:

openstack中的metadata server


metadata在OpenStack中的使用

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条