0
Openstack Metadata Service分析
声明:
本博客欢迎转发,但请保留原作者信息!
博客地址:http://t.51gocloud.com
新浪微博:@线超博
内容系本人学习、研究和总结,如有雷同,实属荣幸!
1、什么是metadata service
metadate service最早概念是AWS提出的,通过这一服务可以为虚拟机提供元数据,包含虚拟机id、主机名、密钥、IP地址、用户自定义脚本等。
【元数据获取方式】:在虚拟机内部,通过http请求访问http://169.254.169.254/latest/meta-data/
$ curl http://169.254.169.254/latest/meta-data/ ami-id ami-launch-index ami-manifest-path block-device-mapping/ hostname instance-action instance-id instance-type kernel-id local-hostname local-ipv4 mac network/ placement/ public-hostname public-ipv4 public-keys/ reservation-id security-groups services/
AWS metadata服务介绍:http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
2、openstack metadata service框架
2.1 cloud-init
cloud-init是专为云环境中虚拟机的初始化而开发的工具,它可以从metadata service读取相关数据并据此对虚拟机进行配置。常见的配置包括:设定虚拟机的hostname、hosts文件、设定SSH密钥、更新软件包、调整系统盘文件系统大小(调整至创建时候的大小)等。
openstack也支持cloud-init组件,虚拟机内部安装完cloiud-init组件后,系统启动过程中,会首先运行cloud-init组件进行系统配置。
VM内部通过169.254.169.254这个地址来获取metadata,此时Openstack创建的VM内部的路由情况分为了两种:
(1)VM subnet连接在了router
在这种情况下,虚拟机启动后,内部包含了一条如下路由:
169.254.169.254 via 10.0.0.1 dev eth0
10.0.0.1(subnet的网关)地址在router命名空间里
在router命名空间里,iptables包含了一条nat转换,将169.254.169.254:80的数据包转给9697端口,9697为neutron-ns-metadata-proxy服务
(2)VM subnet未连接router
在这种情况下,虚拟机启动后,内部包含了一条如下路由:
169.254.169.254 via 10.0.0.2 dev eth0
在dhcp命名空间内,发现dhcp地址的网卡上配置了两个IP,10.0.0.2(dhcp服务ip)和169.254.169.254(metadata服务ip)。dhcp agent会启动一个neutron-metadata-agent进程监听80端口,专门为这种情况提供metadata服务
2.2 neutron-ns-metadata-proxy
这个组件主要在metadata请求中,增加route-id和network-id信息,然后通过Unix domain socket将请求转发给neutron-metadata-agent。
代码:neutron/agent/metadata/namespace_proxy.py
通过2.1分析,每一个router命名空间会对应一个neutron-ns-metadata-proxy,每一个dhcp命名空间也会对应一个neutron-ns-metadata-proxy。这里是否会存在性能问题?
2.3 neutron-metadata-agent
主要根据route-id、network-id、IP地址,获取port信息,然后根据port反查到对应虚拟机id和租户id,最后请求再次转发至nova-api-metadata服务。
代码:neutron/agent/metadata/agent.py
2.4 nova-api-metadata
这个服务在nova-api模块里,根据虚拟机id以及租户id,对metadata请求作出响应,返回虚拟机metadata信息。