启动问题
在制作镜像中其中有一个要求是给镜像系统安装cloud-init,当时也没有明白有什么用。只是在安装完成后,重启系统卡在了这个画面
系统在启动时,运行了cloud-init,但是cloud-init无法连接到某个服务器获取metadata。遂扒文查看cloud-init的作用。
简单的说,
如果安装了cloud-init,虚拟机就会去访问169.254.169.254,会在网络节点上做NAT转换,直接访问nova的metadata服务。那为什么需要用cloud-init?比如你想给instance设置某个属性,比如主机名。metadata的一个重要应用,是设置每个instance的ssh公钥。公钥的设置有两种方式:
1、创建instance时注入文件镜像
2、启动instance后,通过metadata获取,然后用脚本写入
第二种方式更加灵活,可以给非root用户注入公钥,而这个功能就是cloud-init来访问metadata来实现的。
可以看到,获取metadata的api接口是:
http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
可是,这个IP地址,在我们 openstack 是不存在的。为什么可以获取到metadata呢?
这是由于Amazon的原因,最早metadata是亚马逊提出来的,参见:
http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
后来很多人给亚马逊定制了一些操作系统的镜像,比如 ubuntu, fedora, centos 等等,而且将里面获取 metadta 的api地址也写死了。所以opentack为了兼容,保留了这个地址 169.254.169.254。然后通过iptables nat映射到真实的api上,查看iptables可以看到。
关于metadata的服务器的一些配置在nova.conf中可以看到:
metadata_listen = 0.0.0.0
metadata_listen_port = 8775
metadata cache问题
有一个云主机固定ip为192.168.139.8,hostname为zwj。后来删除了这个云主机。紧接着,我又新建了一个云主机,很巧,分配到的固定ip也是192.168.139.8。很奇怪的是,这个云主机的hostname竟然还是zwj!。询问了盼哥,原来metadata cache是有一定时间的,线上版本默认为一天。所以才会导致该问题的出现。在最新版中的nova.conf中加入了新的配置项
metadata_cache_expiration = 15
总的来说,cloud-init并不是一个很重要的功能,在云主机的镜像制作过程中这个是非必须的。