找回密码
 注册
查看: 4935|回复: 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。
- \" G: G6 B# H2 F, q/ V) a: @8 c; [& j$ ^" ]" h
guestfs-inject的使用很受限制尤其是并不是所有镜像都能够支持这种方式,I版本也以及取消了这种方式; metadata-server使用上更为灵活,但是他们都依赖镜像内部必须装有cloud-init组件,尽管如此,由于aws力挺metadata-server,所以这已经成为了虚拟机 信息注入方案事实上的标准。
9 G5 o+ L  |( f1 w" a! \& s. E* f7 `3 q" H/ {
本文主要探讨metadata-server在openstack中如何实现。" \! T  |& G- g) U
6 [+ Z# d2 R  F9 q3 t
1. cloud-init
! l* J7 |. z8 M3 {" s+ V& ~' ~0 M3 S
cloud-init是一个在启动的时候定制你的Iaas平台中虚拟机的包,它可以帮助你重新定义你的虚拟机而不需要重新安装,只需要加入对应的配置项即可。在Ec2中有很多镜像都安装了cloud-init来方便用户定制自己的虚拟机。它可以让你在虚拟机启动的时候设置语言环境,设置主机名,甚至生成私钥,添加用户自己的ssh公钥到虚拟机.ssh/authorized_keys, 设置临时挂载点等等。% o7 Y+ O/ _3 f* I5 ?. d+ o' ?% o8 z
! v+ m3 S. B4 C/ f
cloud-init 项目地址: https://launchpad.net/cloud-init
; M) Q( ~1 b8 q2 f5 s# P
. v* f7 h" m) M' r  F* ecloud-init 文档地址: http://cloudinit.readthedocs.org( D- n( y$ h. O/ K" N6 W3 i' r

' n" W% p2 O- a" y: L2. metadata元数据服务, s% {% Q; w5 v9 V4 W5 f2 a
* J! U& O( x* F" q: H5 W. Y
metadata字面上是元数据,是一个不容易理解的概念。在除了openstack的其他场合也经常会碰到。openstack里的metadata,是提供一个机制给用户,可以设定每一个instance 的参数。2 d8 U* t4 U, A  \1 M2 y

$ |9 Q, v2 p6 |! h5 KAmazon首先提出了metadata的概念,并搭建了metadata的服务,这个服务的公网IP是169.254.169.254,通常虚拟机通过cloud-init发出的请求是:
2 u" x' S' B% D0 O& r6 _( J( z, k/ R  P, i2 ]
http://169.254.169.254/latest/meta-data
7 @1 t: v: i0 D% O) _, h/ i
3 I% r+ }1 T1 @0 o后来很多人给亚马逊定制了一些操作系统的镜像,比如 ubuntu, fedora, centos 等等,而且将里面获取 metadta 的api地址也写死了。所以opentack为了兼容,保留了这个地址 169.254.169.254。然后通过iptables nat映射到真实的api上。9 H3 T5 \9 b/ @

% T- r' {5 h( Fmetadata在openstack中的BP: https://blueprints.launchpad.net ... nstack-api-metadata
1 t' R& Z* c! ^
4 h, U5 m2 g+ vnova中的metadata-server
  A$ Y, L" N4 K7 Q" Y4 c/ r
5 X9 Y+ V0 D7 b# }# G5 S2 [+ rmetadata-server的具体实现是在nova-api组件中,nova.conf中与metadata有关的配置如下:
# [% ^8 o4 S: z7 v$ Q/ }. @enabled_apis=ec2,osapi_compute,metadata: @' r/ o/ _* L3 t! h' B' c& I

" u2 _( m$ j$ E% B5 }! Y$ a' U# OpenStack metadata service manager
  N9 ~9 X* ^( I% F" H7 [& \# q9 H0 Ametadata_manager=nova.api.manager.MetadataManager
- R8 X: W, X" u! R" t7 `# Z% ]& ^" ?
# IP address for metadata api to listen
7 ]. J; \0 d  S( x! W1 u, x# I- }metadata_listen=0.0.0.0
/ D0 s" j: T7 V  M+ |2 I/ i
7 v: l3 ~1 e8 t, ^6 |8 U% r# port for metadata api to listen
! d5 U; f! @  V. [1 N6 zmetadata_listen_port=8775
6 ^  V. U' w# ^0 u4 ]% Z4 b: R: Y3 ^" l$ Z# X. Q  v& a
# Number of workers for metadata service
; H  Q$ `- a& r3 D1 N4 _metadata_workers=3 z* z) i" a# |$ S0 [

# o5 z/ e0 ~/ s( G! q8 o  a- Y# 和neutron-metadata-agent 通信相关# W3 t# Q+ ~; w" a* Y
service_neutron_metadata_proxy=True
% t! V2 d$ j. o2 {( C+ Yneutron_metadata_proxy_shared_secret=* h% z  s8 c- }+ w; n

) Q3 A8 d* o2 \; H0 i( p/ u
' l0 I: ~. Z% g. s6 n具体的代码实现在 api/metadata 下:* N# D& a/ M0 i0 i# Q1 {/ g; }
" z# _/ a* j' V$ J
metadata=metadata {
* }3 G$ @3 u# q( z  __init__.py, _- R" k9 G( h6 p0 m5 [
  base.py' N! j) r2 }$ i, F& q
  handler.py
. _! s0 C6 W) j$ a5 t5 O  password.py
  V5 n$ t9 i: `/ n+ w* p  vendordata_json.py
! X, H! v1 }5 m6 `; w# q. j}
! s5 p% k1 K& k- J- R# [& E/ l2 ^1 L3 d
- c0 K4 R. e5 B+ J0 u
与neutron的结合使用
2 ~. N2 R3 n- W" m" R$ |/ s& _0 _通常我们使用neutron实现虚拟机的网络方案,neutron的metadata-agent并不会自己实现metadata服务,而是把cloud-init的请求转发给nova-api中的metadata服务,具体服务流程请看下图:+ W2 E% @9 J9 A/ h2 t0 P6 R- }
   & k" I- I$ a: h" \& g
3 v# Y  ~( H+ V
虚拟机通过cloud-init组件请求169.254.169.254这个地址的metadata服务,这时这个请求会有两种方式处理。8 \& Q. }+ Y; i2 x( E0 j. K
server" 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;">
' D# v. a; Q0 V1 M, e: z% I" w- w. e' |9 ^  w

1 X, g5 U4 q: R当虚拟机所在的子网拥有网关而且连接了l3-router,则通过qrouter的namespace中的iptables处理; 当虚拟机所在的子网没有网关,是个封闭的子网,那么dhcp服务的虚拟网卡会添加一个169.254.169.254的ip;
' Y, `) j3 c: k5 Q3 b接收的cloud-init请求由ns-metadata-proxy处理,ns-metadata-proxy与metadata-agent通过unix domain socket实现IPC,实现将对ns-metadata-proxy的请求交给metadata-agent处理。& y$ r! T. j9 }; }
metadata-agent接收请求,将请求交给metadata-server的真实实现者nova-api。
9 s1 @  Q* E; U/ b) z3 o" A! s" U
5 g3 B6 h9 C  X( w# H, ~  q
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 02:01 , Processed in 0.017291 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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