深入理解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

时间: 2024-10-30 15:25:57

深入理解OpenStack虚拟机之Metadata的相关文章

java-《深入理解Java虚拟机》有关methodHandle的代码问题?

问题描述 <深入理解Java虚拟机>有关methodHandle的代码问题? 以下代码书上说是输出"i am grandfather",但远行实际输出为"i am father" class Test { class GrandFather { void thinking() { System.out.println("i am grandfather"); } } class Father extends GrandFather {

《深入理解Java虚拟机》读书笔记

背景 并发处理的广泛应用是使得Amdahl定律代替摩尔定律成为计算机性能发展的源动力的根本原因,也是人类压榨计算机运算能力最有力的武器 Amdahl 定律通过系统中的并行化与串行化的比重来描述多处理器系统能获得的运算加速能力. 摩尔定律则用于描述处理器晶体管数量与运行效率之间的发展关系. 这两个定律的更替代表了近年来硬件发展从追求处理器频率到追求多核心并行处理的发展过程. 高效并发 物理机上的并发解决方案 在当前这个多核处理器时代,"让计算机并发执行若干个运算任务"和"更充分

深入理解Java虚拟机:JVM高级特性与最佳实践

目 录 [ - ] <深入理解Java虚拟机:JVM高级特性与最佳实践>前言 <深入理解Java虚拟机:JVM高级特性与最佳实践>内容特色 <深入理解Java虚拟机:JVM高级特性与最佳实践>目录 第1章 走近Java 1.1 概述 1.2 Java技术体系 1.3 Java发展史 1.4 展望Java技术的未来 1.4.1 模块化 1.4.2 混合语言 1.4.3 多核并行 1.4.4 进一步丰富语法 1.4.5 64位虚拟机 1.5 实战:自己编译JDK 1.5.1

理解Android虚拟机体系结构(转)

1 什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行.dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统.Google对其进行了特定的优化,使得Dalvik具有高效.简洁.节省资源的特点.从Android系统架构图知,Dalvik虚拟机运行在Android的运行时库层. 2 Dalvik虚拟机的功能

理解Android虚拟机体系结构

1. 什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行.dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统.Google对其进行了特定的优化,使得Dalvik具有高效.简洁.节省资源的特点.从Android系统架构图知,Dalvik虚拟机运行在Android的运行时库层. 2. Dalvik虚拟机的

深入理解JAVA虚拟机--Idea远程执行本地Java代码

工程配置 上传文件配置 运行结果 源代码 联系作者 今天在看深入理解JAVA虚拟机的9.3节,作者实现了一个远程执行功能.这个功能可以在远程服务器中临时执行一段程序代码,而去不依赖jdk版本,不改变原有服务端程序的部署,不依赖任何第三方库,不入侵原有的程序,不会对原有程序运行带来任何影响.程序的原理可以去看书,本文主要结合IDEA把使用过程记录一下 工程配置 新建一个工程,把书中的5个类倒入,然后写一个测试类(test),这个类的代码就是要让远程服务器自动执行的.test.jsp是用来触发远程服

周志明的《深入理解JAVA虚拟机》中基于栈的指令集和基于寄存器的指令集,要好好学习

这个知识点是我以前没有的,所以我以前发贴表示完全不理解JAR字节码的执行过程及以本地代码交互的过程. 现在有了这个知识点. 那对JVM的运行机制就了解了大概了. 周志明的<深入理解JAVA虚拟机>这书是本好书呀. 但由于我个人阅读习惯,三天之内要草草看一次的.所以没有按书上代码操作. 以后工作如何有应用时,再慢慢深入吧. ~~~~~~~~~~~~~~~ NET CLR 和 Java VM 都是堆疊式虛擬機器(Stack-Based VM),也就是說,它們的指令集(Instruction Set

openstack虚拟机(windows2008)经常僵死???

问题描述 openstack虚拟机(windows2008)经常僵死???造成虚拟机sshping都不可以,虚拟机占用虚拟机CPU非常高100%,查看物理机不能给虚拟机分配IP,重启虚拟机也不好用,有时候过一会,虚拟机自动回复!有没有遇见这种情况的? 解决方案 解决方案二:查看物理机不能给虚拟机分配IP==>那你PING的是什么地址

深入理解java虚拟机的故障处理工具_java

前言 本文主要给大家介绍的是java虚拟机的故障处理工具,文中提到这些工具包括: 名称 主要作用 jps JVM process Status Tool, 显示指定系统内所有的HotSpot虚拟机进程.通常是本地主机 jstat JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据 jinfo Configuration Info for java, 显示虚拟机配置信息 jmap Memory Map for Java, 生成虚拟机的内存存储