找回密码
 注册
查看: 4933|回复: 0

openstack中的metadata server

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2017-7-9 10:27:09 | 显示全部楼层 |阅读模式
虚拟机启动时候需要注入hostname、password、public-key、network-info之类的信息,以便虚拟机能够被租户管理。对于这些信息的注入openstack提供了两种方式, guestfs-inject以及metadata-server。8 y; t+ M8 E2 v; P' |' D+ |
: W, H# {' ]7 z* ^& ?" p
guestfs-inject的使用很受限制尤其是并不是所有镜像都能够支持这种方式,I版本也以及取消了这种方式; metadata-server使用上更为灵活,但是他们都依赖镜像内部必须装有cloud-init组件,尽管如此,由于aws力挺metadata-server,所以这已经成为了虚拟机 信息注入方案事实上的标准。
$ m0 c2 _* _& D2 `# f1 A  O( Q& m' j2 z( y& u
本文主要探讨metadata-server在openstack中如何实现。
7 c+ H0 ^( U1 W- Q- ]; p) I4 A) h0 @+ u$ f
1. cloud-init0 N* x2 y+ ^6 d$ q- S* ?5 m6 t
/ J4 W, W8 D) x9 c' [8 {
cloud-init是一个在启动的时候定制你的Iaas平台中虚拟机的包,它可以帮助你重新定义你的虚拟机而不需要重新安装,只需要加入对应的配置项即可。在Ec2中有很多镜像都安装了cloud-init来方便用户定制自己的虚拟机。它可以让你在虚拟机启动的时候设置语言环境,设置主机名,甚至生成私钥,添加用户自己的ssh公钥到虚拟机.ssh/authorized_keys, 设置临时挂载点等等。1 p) G) W2 A! j5 ~

9 \3 P( g, U" q1 N* `' H2 q; |cloud-init 项目地址: https://launchpad.net/cloud-init
4 g# |# R* S9 o) ^8 c% O
8 |9 l5 Z8 K7 T% p2 t3 Wcloud-init 文档地址: http://cloudinit.readthedocs.org0 \2 Y; N  G% I7 U

, v7 X6 Q2 Y" }" {( R2. metadata元数据服务. ]( q; ~& m& i0 [
/ {# X. O; g% t
metadata字面上是元数据,是一个不容易理解的概念。在除了openstack的其他场合也经常会碰到。openstack里的metadata,是提供一个机制给用户,可以设定每一个instance 的参数。
" C8 d" F2 X: V$ i9 q# z$ t0 v. L6 g7 o  A( n
Amazon首先提出了metadata的概念,并搭建了metadata的服务,这个服务的公网IP是169.254.169.254,通常虚拟机通过cloud-init发出的请求是:
$ F1 h# j# g$ b5 b6 ~) y
( t( O+ X1 R$ U, g6 L2 |http://169.254.169.254/latest/meta-data* Y# H8 G1 ^( n

: x2 k+ n6 l4 P/ a/ w6 J; p- W后来很多人给亚马逊定制了一些操作系统的镜像,比如 ubuntu, fedora, centos 等等,而且将里面获取 metadta 的api地址也写死了。所以opentack为了兼容,保留了这个地址 169.254.169.254。然后通过iptables nat映射到真实的api上。
9 J6 ^! h6 Q6 _
3 _7 B4 Z2 J0 D2 e; n$ P/ ^7 u! Bmetadata在openstack中的BP: https://blueprints.launchpad.net ... nstack-api-metadata
* \: m. e/ l+ H5 X( [( |! C
9 }( K0 B; C2 I3 P- H: Lnova中的metadata-server
3 S$ x. Z3 B& u3 D: k3 z. X1 z( K/ E" t2 W9 i
metadata-server的具体实现是在nova-api组件中,nova.conf中与metadata有关的配置如下:" h  z6 ~  S& X* B
enabled_apis=ec2,osapi_compute,metadata
0 A9 p- z' h: y8 m/ I
9 ~' _( h3 ~2 g- R: c1 s# OpenStack metadata service manager
& ^: c  Y. t: X: i8 q+ I/ N% x+ }3 v( j0 jmetadata_manager=nova.api.manager.MetadataManager
& `, l+ c5 c" A. {* S/ \8 Y( H! s8 u, r1 h9 _" n
# IP address for metadata api to listen) b+ \+ b( E& A. V$ B
metadata_listen=0.0.0.0+ d( q, ?/ x8 ?/ _

% }2 z9 y: w' _/ U# port for metadata api to listen) q9 w0 s& c; |, t; C2 d
metadata_listen_port=8775
/ X0 n$ Q- J' `) J! U  ^# ?7 {& _% W7 K& E, s! G; j
# Number of workers for metadata service) r7 R) j5 E2 X: t- m
metadata_workers=& }' d. M# d+ ]7 {% {3 O) q! d4 }2 X+ w
4 y3 N: V7 J: ^' \9 `, E0 I
# 和neutron-metadata-agent 通信相关6 K: |2 }" _$ C
service_neutron_metadata_proxy=True
1 o' p+ O5 m" Pneutron_metadata_proxy_shared_secret=
* k: U  O7 V2 f
% {& e) M) p8 Q/ x) m
4 O7 i  E/ c; H, y& |* Q具体的代码实现在 api/metadata 下:) i1 [; d& k/ x" U
$ j# [, R* u4 M. W/ Q' D, H7 a; T
metadata=metadata {
: Y8 G6 [7 e: m( ~  __init__.py
+ o6 {; Z& V# B+ l. j5 J! p8 D  base.py; @' N2 ^5 c  G! M6 Y0 }0 w
  handler.py* v" z. V2 C9 |9 `  {  b: T; C1 F, L
  password.py
7 U& t) [- p! [) d3 v' ^5 ?  vendordata_json.py
8 ^. y9 V9 ~9 y6 }2 B4 y  j}& X) V0 R, H( `9 m0 z* B

6 K1 t: S3 m. I& s0 E
7 S6 N! w" F- |" \+ M: C与neutron的结合使用
! B* a8 u% H- M) c4 I  b- o; i  D. n% K通常我们使用neutron实现虚拟机的网络方案,neutron的metadata-agent并不会自己实现metadata服务,而是把cloud-init的请求转发给nova-api中的metadata服务,具体服务流程请看下图:
! A% J' |" Y. F3 B8 O5 ?   
7 ~) ^0 `1 {$ t0 Q' x1 `7 h  D  u% `: Z/ O5 ?1 o! I
虚拟机通过cloud-init组件请求169.254.169.254这个地址的metadata服务,这时这个请求会有两种方式处理。
- Q# j; g6 P! g: c) Eserver" title="openstack中的metadata server" action-data="http%3A%2F%2Fs14.sinaimg.cn%2Fmw690%2F0000cGopgy6TdIm27252d%26690" action-type="show-slide" style="border-width: 0px; border-style: initial; list-style: none;">
# h3 s0 C0 a7 `  Y
- ~, E' H6 H! t" n4 m& {# t, k
( i6 p! ]& [2 M" I
当虚拟机所在的子网拥有网关而且连接了l3-router,则通过qrouter的namespace中的iptables处理; 当虚拟机所在的子网没有网关,是个封闭的子网,那么dhcp服务的虚拟网卡会添加一个169.254.169.254的ip;4 `; i$ L- ~0 N7 M/ v1 ~
接收的cloud-init请求由ns-metadata-proxy处理,ns-metadata-proxy与metadata-agent通过unix domain socket实现IPC,实现将对ns-metadata-proxy的请求交给metadata-agent处理。6 p' d+ D6 X% _" \! y9 G
metadata-agent接收请求,将请求交给metadata-server的真实实现者nova-api。, U( ^# B! C! z  x4 e

$ H6 {+ R3 s) u$ X
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 01:01 , Processed in 0.030109 second(s), 24 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表