修复云虚拟机克隆错误

使用 Runtime Image Activation 解决问题

虚拟化和虚拟系统的优势就是能够进行克隆,从而在不同的环境中重用。在克隆虚拟机以便将其应用于新环境时,一些外部的数据配置要求,比如 IP 地址这样的网络配置等,可能会造成问题。如果在此过程中外部数据不可用,那么虚拟机的重新配置可能会是不完整的。作者提供了解决此问题的方法,无需了解该应用程序,也不需要使用激活脚本。运行时映像激活 (RIA) 是一个原型命令行界面,它允许让您综合运用网络技术,从而确保克隆的虚拟机配置是正确的。

Roberto Ragusa, 资深软件工程师, IBM

Roberto 是意大利罗马 IBM Smart Solutions Lab 的一名高级软件工程师,他主要研究 NICA (Networked Interactive Content Access) 数字资产管理解决方案。他的职责包括 NICA 的设计与实现,他有着 7 年专门研究 Linux 和 UNIX 平台上的文档搜索、自动分类、后台性能和扩展性的经验。他最近编写了基于 Lucene 的快速搜索引擎,并喜欢研究先进的网络技术。



Claudio Marinelli, 高级技术成员, IBM

http://www.ibm.com/developerworks/i/p-marinelli.jpgClaudio Marinelli 拥有 20 年的 IT 从业经验,在 IBM 多个软件开发组织中担任各种技术角色。他目前是 IBM Tivoli 的 IBM 高级技术成员。他是映像管理领域的首席架构师,分别负责映像和 ICON 的 TPM、基础虚拟映像生命周期管理的产品,以及自动进行虚拟映像构建和组合的组件。



Luigi Pichetti, 高级技术员,Tivoli,SPDA, IBM

Luigi Pichetti 是 CloudBurst 和 IBM Service Delivery Manager(用于提供服务和发挥虚拟设备优势的解决方案)的 Tivoli 架构师。他负责基于映像的安装项目,其目标是使用激活引擎和 StereoCable 等虚拟化技术高效地分发产品。Luigi 在开发和设计系统管理领域的企业应用程序方面有 19 年经验。在此之前,他曾经负责 Tivoli Configuration Manager 和 Common Inventory Technology 组件的架构团队。



Alex Donatelli, 高级技术人员, IBM Tivoli Software

Alex Donatelli's photoAlex Donatelli 是 IBM 的一名高级技术人员。他是在意大利罗马的 Tivoli Laboratory 的主架构师,以及 Rome Central Architectural Team 的经理。他一直与罗马的 Tivoli 人员和整个技术社区一起,改进产品的质量。统一基于场景的设计工作是众多工作之一。



2012 年 3 月 19 日

使用虚拟系统映像的一个优势就是能够进行克隆,从而在不同的环境中重用。这通常需要花费一些精力来重新配置映像中所包含的软件应用程序。当克隆带有预安装软件的虚拟机时,尤其是使用实现服务器端服务(例如 DBserver、AppServer 等)的应用程序时,它们通常不支持 DHCP,而且是基于静态地址上监听传入的 TCP 请求,此时可能会出现问题。

有一个现有的过程可解决这个映像重新配置难题,称为映像重激活过程。它采用了如激活引擎(比如 IBM Activation Engine,一个能够在启动时对虚拟映像进行定制的框架)和应用程序特定激活脚本这些技术。在这些情形下使用 Image Re-Activation 过程会出现的问题就是,它假设对于配置错误的应用程序,总可以运行一个合适的脚本将所有配置修改正确。

在本文中,我们将讨论一种替代方法来解决这个问题,这种方法在不知道哪些配置受原来的网络配置影响,也不知道哪些预制的激活脚本能修改这些应用程序特定配置的情况下非常方便。对环境缺乏了解的情况随时可能发生,可能不知道虚拟机中有哪些应用程序,或是否没有相应的重新激活脚本(此应用程序可能已经过时,或是最新的,或没有文档记录,不能进行逆向工程,等等)。

在这样的情况下,关注的重点是解决包含的软件栈由于虚拟机克隆造成的网络配置错误,我们提议的方法可能比重新启用虚拟机器更有价值。我们建议的方法是应用程序诊断;将其称为运行时映像激活 (RIA)。我们以一个 RIA 命令行界面样例为原型,让您能够综合运用或实现本文描述的网络技术;这些能够让您解决克隆的配置错误问题。

完美的克隆并不总是好事

机器配置是面向云环境中的核心功能;经常会有将新物理机器联网或定期创建新虚拟机。会经常发生运行时映像(即磁盘的全部内容)从已有的机器或有用的模板存储库中进行克隆的情况。

克隆运行时映像经常会出现的问题是其包含一些依赖于外部环境的信息,例如网络配置 IP 地址。如果不进行必要的重新配置,操作系统及所包含的应用程序可能无法正常工作。常见的错误有:

  • 试图绑定网络套接字时出现错误。
  • 试图连接所需网络服务时出现错误。
  • 网络中出现重复的 IP 地址会造成严重问题,例如随机连接失败、无法连接以及一般性的网络不稳定。

关于机器所配置使用的 IP 地址这样的信息可以在操作系统的配置文件中找到。克隆虚拟机之后的第一步是用新 IP 地址代替旧 IP 地址。您可以通过使用直接对运行时映像内容进行操作的脚本和工具来自动化此任务,它依赖于正在使用的特定操作系统;例如,它可以替换 Linux®/UNIX® 系统中 /etc 文件中的字符串或修改 Windows® 系统中的注册表条目。

经常会发生已安装的应用程序包含来自网络配置和安装时获取的内部配置;例如,一个 Web 服务器可能将某些内容保存到自己的配置数据中,如为 HTTP/HTTPS 请求服务时需要广播的 IP 和/或主机名。修复此问题的方法之一是重新安装应用程序;这基本上意味着从 “克隆一个已配置的机器” 变成 “从头开始安装机器” 的方式。这种方法非常麻烦而且低效,这样就完全抹杀了克隆的优势,如以快速、可靠和一致的方式创建虚拟机。

那么在虚拟机中克隆软件后重新激活的传统方法是什么?


最传统的方法:修复所有配置

通常处理这个任务的方式是手工修改不正确的配置,无论它存储在什么地方。一个一个地处理。这种方法的工作量显而易见。这意味着要精确地知道要有哪些应用程序,以及对每个应用程序进行何种操作。所说的操作可以作为加载(非运行)映像的脚本或作为正在运行机器的首次启动或代理级别。

假设您很好地了解需要做哪些工作,那么结果是最好的:应用程序与您 “正确” 安装的一模一样。

另一方面,这种方法是很脆弱;小的细节变化(如 “用户是否将配置移动到其他路径?”、“这个软件版本是否使用和旧版本一样的配置存储” 等等)都会使这样方法变成噩梦。

如果不了解应用程序特定的知识,而对配置进行改动,很容易失败。任何了解墨菲定律的人都不会认真考虑扫描整个映像和用新 IP 地址替换旧的 IP 地址(以文本和二进制格式)。

还有更好的策略 ... 我们称之为 “欺骗网络”。


新策略:欺骗网络

我们将介绍一种无需了解所含软件的特定知识就能修复克隆配置错误的替代创新方法。首先,假设以下场景:

我们考虑常见的情况,机器通过与外部的守护进程通讯而导出服务;在安装的时候,守护进程不幸地将它所要监听的 IP 地址保存到其自身的配置中。这样的守护进程很可能在克隆的机器中启动失败,因为它们不能绑定到网络接口中。

我们可以尝试重新架构网络环境以欺骗应用程序按照错误的配置正常运行,而不用尝试修复应用程序配置。机器本身的操作系统会帮助我们完成这个目标。

大意

图 1 描述了整个过程。

图 1. 解决方案的整体描述
解决方案的整体描述

左侧是原机器(称为源机器),将它克隆以创建右侧的机器(称为目标机器;参见橙色点 1)。在克隆时,源机器中安装了三个应用程序。假设 app1 能自动检测分配给机器的 IP,而 app2app3 使用的是保存在各自配置文件(文本或数据库)中的 IP 地址。

目标机器会出现的问题是,在将旧 IP 地址 (IPS) 改成新 IP 地址(IPT;参见橙色点 2)后,外部客户端只能使用 app1app2app3 都不可用,因为 IPS 地址绑定接口失败,所以无法启用。

应该怎么做?

也许可以添加一个虚拟网络接口

第一步,创建另一个网络接口;在 Linux 中可以创建任意多的网络别名。例如,可以额外创建一个环回接口(除了常见的 lo,配置为 127.0.0.1/8),并给它分配旧 IP 地址(参见图 1 中的步骤 3)。额外的接口可以作为 lo 的别名,标识为 lo:0。还可以生成 eth0:0 作为 eth0 设备的别名。

在这之后,配置不正确的应用程序能够启动并绑定在假接口。但还不能接收来自外部机器的连接;我们希望外部主机使用新的 IP,那么数据包会到达克隆的机器并立即被弃用,因为没有进程会监听配置新 IP 的接口。

图 2 显示新地址 (IPT) 为 192.168.31.9,旧地址 (IPS) 为 10.10.9.9。

图 2. 服务器启动并绑定到假地址
服务器启动并绑定到假地址

有一个守护进程可以通过绑定到旧的、“错误” 的 IP 来启动。

下一步我们将看看内核层的 Network Address Translation 重定向。

内核层的 NAT 重定向

第二步,要求操作系统拦截所有进入新 IP 的连接,并且悄悄地从内部重定向到旧 IP(是的,没写错 ... 将新地址重定向到旧地址)。

这样的重定向在内核层作为 Network Address Translation 规则进行很容易;NAT 重定向没有产生很大的性能影响,因为这是防火墙和网关中广泛使用的小技巧。连接代理(见图 1 中的橙色星型标记)起到了这一作用。

还需要设置客户端机器和沿途所有中间节点的路由规则,让指向旧 IP 的流量能实际到达机器。

最后一步:只需要重定向特定端口。

NAT 提供看门狗守护进程

您需要知道要重定向哪些端口,因为一般的 newIPoldIP 规则会破坏所有正在正确监听新 IP 的应用程序(例如,那些足够智能,可以在运行时检测 IP 地址,而不是读取自身已过期配置)。

您还是不愿了解应用程序特定的知识(我们就是这样,事实上,甚至不想知道要修复哪些应用程序),所以需要能够自动发现使用的端口。为了实现此目标,要求操作系统提供某人通过配置旧 IP 接口进行监听的端口列表。

在 Linux 中是使用 netstat -l 选项可获得此列表;为这些端口分配 NAT 重定向。

为了增强稳定性,请每隔几秒钟重复扫描和重定向的步骤,从而能够处理启动缓慢的应用程序或动态绑定和解绑定端口的应用程序。

看门狗守护进程(图 1 中的步骤 4 和 5)起了执行扫描和驱动代理的作用。

图 3 和 4 演示了正在起作用的看门狗进程。

图 3. 正在起作用的看门狗;看门狗创建了重定向规则
正在起作用的看门狗;看门狗创建了重定向规则

您可以看到,看门狗检测到有人正在监听 10.10.9.9:80,并创建了一个重定向规则从而透明地劫持指向 192.168.31.9:80 的流量并重定向到 10.10.9.9:80。

图 4. 客户端成功建立连接
客户端成功建立连接

现在外部客户端已经能够通过指向 192.168.31.9 来连接到服务器:

  • 从客户端的角度看,机器有了一个新地址 (192.*)。
  • 从服务器的角度看,机器仍然拥有一个旧地址 (10.*),它还能为进入的网络请求提供服务,就像克隆虚拟机前那样。

总而言之,该方法包含

  • 设置一个旧 IP 的虚拟接口,从而配置错误的守护进程能够启动而不发生网络问题。
  • 同时,设置一个看门狗守护进程,针对配置旧 IP 的虚拟接口轮询监听表;对于在那里发现的监听者,守护进程会安排端口从新 IP 重定向到旧 IP。

旧 IP 对于那些希望服务器正确配置新 IP 的客户端是不可见的。这些守护进程通过绑定到新 IP 以及通过绑定到旧 IP 来起作用,这是由于操作系统执行的 NAT 欺骗所实现的。

还有几个重新配置的小技巧,可以让解决方案更加完整。


完善此策略:配置技巧

尽管上述的 IP 别名机制能够解决大多数目标,但还可以采用其他一些配置技巧使得方案更加完善:

  • ARP 过滤(ARP 即 Address Resolution Protocol)
  • 域名解析和 DNS 代理
  • getHostName() 挂钩

ARP 过滤

在 Linux 主机上进行假接口的配置可能会造成不好的副作用。即使假接口为本地(lo:0 而不是 eth0:0),对于机器上任何接口上配置的所有 IP,接口会默认回复 ARP 请求。

这意味着假 IP 在某些方面上对客户端是可见的(实际上是 pingable)。完美的隐身操作令人非常满意,尤其是想要对同一网段的源机器进行克隆或复制。

在 Linux 上可以通过将 sysctl 网络参数从 arp_ignore 改成 1 来避免默认的行为(0 意味着回复所有 ARP 请求)。

域名解析和 DNS 代理

如果图 1 中描述的克隆虚拟机中的 app2/app3 对旧主机名(即 HNS)保存了静态引用,为了增加或替代旧 IP,您还需要影响名称解析链以返回正确的 IP。

这可以通过更新本机的 /etc/hosts 配置文件来完成,从而使所有来自旧主机名 (HNS) 的请求都返回新 IP (IPT)。如果名称解析过程采用了外部域名服务器,那么可以安装一个本地的 DNS 代理作为授权回复的链首域名服务器,它所回复的与修改的 /etc/hosts 文件一致。

使用 getHostName() 挂钩(hook)

另一个方便使用的配置策略是采用 getHostName() 函数的 “挂钩”(即获得函数调用),从而使它返回修改后的值(换句话说,旧主机名)。

已经对其进行了原型化,并且可嵌套在不同的用户层(例如,root 级别或影响使用特定和较低用户权限的运行进程)。

将这些结合在一起

为了促进整个配置过程,Linux 有一个原型化的 RIA 命令行,它能利用我们在本文中所描述的配置技术。

以下是 RHEL 虚拟系统中的语法和用法样例:

./ria start -oh <oldhostname> -oi <old_ipv4> -ni <new_ipv4> [options]
./ria stop | status

./ria start -oh oldhostname.domain.com -oi 10.10.1.1 -ni 1.2.3.4 -ipalias -hnresolv -dnat

结束语

在现实世界中,这项技术的实现都非常成功。我们在需要安装静态 IP 配置的 Web 服务器 (Apache) 和应用服务器 (IBM WebSphere® Application Server) 托管环境上进行测试,在克隆虚拟机之后,无法正常运行,因为软件栈仍然会尝试绑定、监听或接受存储在应用程序特定的配置部件中的旧 IP。

但 RIA 方法能够规避这个问题,它能够让服务器软件栈在新环境中正常工作,即使它认为仍然在老环境中工作。该方法需要回归到主要产品用例。

记住,映像重激活方法一直都是一个可行的替代方案;它是一个 “手术”,而且是一个确切的方法,因为它能够 “去除” 旧应用程序配置并替换上新配置。它可能开销巨大,而且不是最好的方法。

但是,在资料不全、无投资计划,或无文档记录情况下要调整软件应用程序的嵌入式配置,那么您应该考虑采用 RIA 应用程序诊断方法。

用户可能提出反对意见:如果在 NAT 守护进程还没设置好重定向时启动应用程序,会发生什么呢?

答案是,服务仅对外部客户端不可用而已;从外部来看,服务只是过了几秒钟才启动成功。如果采用合理的轮询时间,就不会有什么重大的副面影响,例如几分钟内每秒轮询一次(一遍及时启动),然后每 5 到 10 秒钟释放轮询一次。

可以很容易地将 Runtime Image Activation 方法嵌入到云配置软件中,而且已成功地使用 Tivoli® Cloud Management 栈 (Tivoli Service Automation Manager, TSAM) 对其进行原型化。当在虚拟机部署过程中运用此特性时,只需要了解旧 IP(可指定映像何时导入并注册到云部署工具)和新 IP(云部署工具在适当的部署工作流中动态生成并采用的)。

参考资料

学习

获得产品和技术

  • 查看在 IBM SmartCloud Enterprise 上可用的 产品镜像

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing, Linux
ArticleID=805708
ArticleTitle=修复云虚拟机克隆错误
publish-date=03192012