深入理解OpenStack虚拟机之Metadata

简介:

前言

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

OpenStack metadata

要理解如何实现的,我们需要先了解OpenStack的metadata。metadata字面上是元数据,主要用来给客户提供一个可以修改设置OpenStack instence(云主机)的机制,就像我们想在虚拟机放置一个公钥这样的需求,或者设置主机名等都可以通过metadata来实现。让我来梳理一下思路:

1.OpenStack有一个叫做Metadata的东东。

2.我们创建虚拟机时候设置的主机名、密钥对,都保存在Metadata中。

3.虚拟机创建后,在启动的时候获取Metadata,并进行系统配置。

虚拟机如何取到Metadata?

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

 
  1. $ curl http://169.254.169.254/2009-04-04/meta-data 
  2.  
  3. ami-id 
  4.  
  5. ami-launch-index 
  6.  
  7. ami-manifest-path 
  8.  
  9. block-device-mapping/ 
  10.  
  11. hostname 
  12.  
  13. instance-action 
  14.  
  15. instance-id 
  16.  
  17. instance-type 
  18.  
  19. local-hostname 
  20.  
  21. local-ipv4 
  22.  
  23. placement/ 
  24.  
  25. public-hostname 
  26.  
  27. public-ipv4 
  28.  
  29. public-keys/ 
  30.  
  31. 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的节点上)找一找。

 
  1. # 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的时候。

 
  1. # vim/etc/neutron/dhcp_agent.ini 
  2.  
  3. 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地址。


本文作者:赵班长

来源:51CTO

相关文章
|
安全 IDE KVM
[ 云计算相关 ] KVM虚拟化平台windows虚拟机迁移到openstack虚拟化平台(KVM虚拟化环境中Windows虚拟机安装Virtio驱动程序)
KVM虚拟化平台windows虚拟机迁移到openstack虚拟化平台(KVM虚拟化环境中Windows虚拟机安装Virtio驱动程序) 因为这也不是我的本职工作,只是这次恰巧碰到了,帮着解决了以下,我就没深究原理了,问我原理可能我也不知道,只是这个操作步骤吧,亲测有效。
461 0
[ 云计算相关 ] KVM虚拟化平台windows虚拟机迁移到openstack虚拟化平台(KVM虚拟化环境中Windows虚拟机安装Virtio驱动程序)
|
4月前
|
Shell
openstack 查询网络的port 关联的虚拟机
在OpenStack中,可以通过以下步骤查询网络的端口关联的虚拟机: 打开命令行终端,并使用OpenStack的命令行工具(如openstack命令行客户端)登录到OpenStack平台。 执行以下命令来获取所有端口的列表: bash openstack port list 这将显示所有端口的列表,包括端口ID、网络ID、MAC地址等信息。 3. 从端口列表中,找到与虚拟机相关的端口。通常情况下,虚拟机的端口具有与虚拟机实例相关的标识符,例如MAC地址或端口ID。 4. 执行以下命令来获取虚拟机实例的详细信息: bash openstack instance show <instanc
|
5月前
|
云计算
云计算|OpenStack|社区版OpenStack安装部署文档(十--- 调整配额限制和解决建虚拟机报错---No valid host was found---Rocky版)
云计算|OpenStack|社区版OpenStack安装部署文档(十--- 调整配额限制和解决建虚拟机报错---No valid host was found---Rocky版)
80 0
|
5月前
|
弹性计算 Linux 网络安全
云计算|OpenStack|社区版OpenStack安装部署文档(九--- 创建一个虚拟机实例---Rocky版)
云计算|OpenStack|社区版OpenStack安装部署文档(九--- 创建一个虚拟机实例---Rocky版)
33 0
|
Linux 数据安全/隐私保护
【openstack】虚拟机启动速度优化思路
【openstack】虚拟机启动速度优化思路
267 0
【openstack】虚拟机启动速度优化思路
|
12月前
openstack虚拟机占用CPU高定位排查
openstack虚拟机占用CPU高定位排查
219 0
|
KVM 虚拟化
【openstack】开启物理机虚拟机化
【openstack】开启物理机虚拟机化
540 0
【openstack】开启物理机虚拟机化
|
Linux
OpenStack中的虚拟机(/dev/mapper/centos-root)进行磁盘扩容
OpenStack中的虚拟机(/dev/mapper/centos-root)进行磁盘扩容
660 0
|
存储 Linux KVM
openstack环境下 kvm存储虚拟机中瘦供给特性
瘦供给的特性层次 如果一个kvm虚拟机需要支持瘦供给需要如下层次都支持: 1、存储层面 支持scsi协议规定的瘦供给命令unmap、write same|unmap 2、宿主机OS 1)内核层面:宿主机Os需要支持瘦供给特性,可喜的是在早在linux内核2.6时代就已经支持瘦供给特性。
1281 0
|
Linux KVM 虚拟化
浅谈OpenStack与虚拟机的区别与联系
很多不太明白OpenStack与虚拟机之间的区别,下面以KVM为例,给大家讲一下他们的区别和联系 OpenStack:开源管理项目OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目。
2233 0