共计 2205 个字符,预计需要花费 6 分钟才能阅读完成。
丸趣 TV 小编给大家分享一下 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 地址。
看完了这篇文章,相信你对“OpenStack 虚拟机中 Metadata 是什么”有了一定的了解,如果想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!