加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 安全 > 正文

深入理解OpenStack虚拟机之Metadata

发布时间:2021-01-11 01:07:35 所属栏目:安全 来源:网络整理
导读:《深入理解OpenStack虚拟机之Metadata》要点: 本文介绍了深入理解OpenStack虚拟机之Metadata,希望对您有用。如果有疑问,可以联系我们。 前言: 刚接触OpenStack的朋友都知道,我们在创建虚拟机的时候选择密钥对,虚拟机创建完毕后,直接使用ssh无密码就可

《深入理解OpenStack虚拟机之Metadata》要点:
本文介绍了深入理解OpenStack虚拟机之Metadata,希望对您有用。如果有疑问,可以联系我们。

前言:

刚接触OpenStack的朋友都知道,我们在创建虚拟机的时候选择密钥对,虚拟机创建完毕后,直接使用ssh无密码就可以登录到虚拟机,那么我们创建的my-key如何就这么神奇的被放到了虚拟机中呢?

OpenStack metadata

要理解如何实现的,我们需要先了解OpenStack的metadata.metadata字面上是元数据,主要用来给客户提供一个可以修改设置OpenStack instence(云主机)的机制,就像我们想在虚拟机放置一个公钥这样的需求,或者设置主机名等都可以通过metadata来实现.让我来梳理一下思路:
1.OpenStack有一个叫做Metadata的东东.
2.我们创建虚拟机时候设置的主机名、密钥对,都保存在Metadata中.
3.虚拟机创建后,在启动的时候获取Metadata,并进行系统配置.

虚拟机如何取到Metadata?

那么虚拟机到底是怎么取到这个metadata呢?让我们在虚拟机试试这个.

$ curl http://169.254.169.254/2009-04-04/meta-data

ami-id

ami-launch-index

ami-manifest-path

block-device-mapping/

hostname

instance-action

instance-id

instance-type

local-hostname

local-ipv4

placement/

public-hostname

public-ipv4

public-keys/

reservation-id

是不是有点惊讶,注意到我们请求的IP地址了吗,169.254.169.254,这是什么魔法?从哪里冒出来一个这样的IP地址,竟然还可以访问,我们肯定从来没有配置过类似奇怪的IP地址在任何OpenStack的服务中.

那我们就到虚拟机里面去一探究竟,既然能访问,那么根据OSI七层模型来理解,一定有到这个IP地址的路由存在吧.

我们使用ip ro li列出虚拟机路由,可以看到果然有一条路由:169.254.169.254从192.168.57.100出去,那么谁拥有这个IP地址呢?我们先来控制节点上(当然更严谨的说是在运行Neutron-dhcp-agent的节点上)找一找.

# ip netns li qdhcp-ec14e723-ff09-4dab-a9e9-26dc6facc0fd

我们可以看到在控制节点有一个qdhcp的namespace,这个是我们启动Neutron-DHCP-Agent生成的,我们可以看下它的IP地址是什么.

它竟然有两个IP地址,192.168.57.100和169.254.169.254.再继续往下探索之前,我们先停下来,那么怎么设置让DHCP给虚拟机推送这个路由呢?答案在我们当时配置DHCP-Agent的时候.

# vim/etc/neutron/dhcp_agent.ini

enable_isolated_metadata = true

有一个Web服务?

好的,由于我们使用的桥接网卡,那么访问169.254.269.254的请求非常顺利的被送到了qdhcp-ec14e723-ff09-4dab-a9e9-26dc6facc0fd这个namespace这里.那么需要有一个Web服务监听在80端口给我们提供吧,我们继续看:

果然有一个Apache监听在80端口,为我们默默的提供metadata.所以虚拟机就是这么获取这些信息的:

获取用户注入的key:

获取主机名

获取IP地址

现在你终于知道OpenStack创建虚拟机之后到底是怎么获取到这些meta-data信息了吧.不过别忘了.这个是我们用的cirros的小镜像才有的.如果你自己创建一个镜像可不会这么智能,那么怎么办呢?我相信聪明的你已经想到了最简单的方案:

在启动的时候执行一个脚本.这个脚本通过访问meata-data获取内容,然后设置到系统上.把这个脚本放到/etc/rc.local中.如果你不想这个脚本每次都执行,你还可以在执行完毕后,再把自己从/etc/rc.local中移除.

当然还有其它的方案.例如使用cloud-init这个软件包.

为啥是169.254.169.254?

或许你和我有一样的疑问,为啥这个meatadata的ip地址是169.254.169.254呢?这个就要提到Amazon了.因为metadata是亚马逊提出来的.然后大家再给亚马逊定制各种操作系统镜像的时候获取metadata的api地址就写的是169.254.169.254.为了这些镜像也能在OpenStack上运行,为了兼容它.OpenStack就保留了这个地址.其实早期的OpenStack版本是通过iptables NAT来映射169.254.169.254到真实API的IP地址上.不过现在更灵活了,直接在虚拟机里面增加了一条路由条目来实现,让虚拟机顺利的访问到这个IP地址.

作者:赵班长

文章出处:运维社区(订阅号ID:cloud-oaas)

 

推荐阅读

深入了解OpenStack虚拟机【上】

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读