使用 Eucalyptus 构建您自己的云
在 2010 年 3 月刊中,我写了一篇文章,介绍了如何将 Ubuntu 9.10 部署为 Amazon 的 EC2 云计算服务的一部分。Amazon 的 EC2 服务可能很有用,但是如果您已经拥有一堆机器,并且不希望您的数据在您的网络之外怎么办?或者,如果您不想支付 Amazon 收取的每小时 10 美分的费用怎么办?这就是 Ubuntu Enterprise Cloud 的用武之地。Ubuntu Enterprise Cloud 系统随附 Ubuntu 9.10 的服务器版,它基于 Eucalyptus 云集群软件。
Eucalyptus 到底是什么?简而言之,Eucalyptus 是一个开源的、与 Amazon EC2 兼容的云计算集群软件包,可以在普通的 Linux 机器上运行。虽然 VMware 和 VirtualBox 做的事情类似,但 Eucalyptus 允许您跨多台机器扩展集群。当您用完资源来运行另一个 VM 时,您只需在网络上弹出一个新的 Eucalyptus 服务器,就可以开始运行了。
既然您已经准备就绪,让我们开始使用 Ubuntu Enterprise Cloud (UEC)。开始使用 UEC 的最简单方法是全新安装带有 UEC 选项的 Ubuntu 9.10 Server。您至少需要两个系统来构建您的第一个云。一个将是云控制器(调度和监视虚拟机实例的主节点),另一个将是节点控制器(所有实例实际运行的位置)。最低配置在安装文档中列出(请参阅“资源”),但我建议使用双核 2GHz 机器,配备 2GB 内存和 100GB 磁盘,作为每个节点的实际可用最小值。请注意,您需要在节点控制器机器上启用虚拟化扩展 (VT)。Eucalyptus 需要这样做。您的系统可以是 32 位或 64 位(我的都是 64 位),但请注意,虽然 64 位主机可以运行 32 位实例,但反之则不成立。
首先,让我们安装云控制器。要开始安装,请从 Ubuntu 9.10 Server CD 启动您的机器,在启动菜单中选择“Install Ubuntu Enterprise Cloud”,然后按 Enter 键。这将启动标准的基于文本的安装,但有一个变化:在安装过程中,系统会询问您想要哪种类型的云安装模式——“Cluster”或“Node”。因为您首先安装云控制器,所以选择“Cluster”并按 Enter 键。安装程序将正常进行,但它会询问您另外两个 Ubuntu Enterprise Cloud 安装特有的问题:您的集群名称(这只是一个唯一的标识符,如“testcluster”)以及云控制器可以分配给实例的 LAN 上的 IP 地址范围。完成这些操作后,安装程序将像常规的基于文本的 Ubuntu 安装一样完成,您的机器将重新启动。就这样!您的云控制器现在已在线。
接下来,您需要安装节点控制器。这甚至更容易。从同一张 Ubuntu 9.10 Server CD 启动将成为节点控制器的计算机,从启动菜单中选择“Install Ubuntu Enterprise Cloud”,安装程序应自动检测到集群,并在安装程序中选择“Node”。只需按 Enter 键确认您要安装节点并确认您的系统分区方案,其余的安装将为您完成。安装程序甚至会从云控制器复制您的登录帐户。
现在您的节点已启动,您需要将节点控制器注册到云控制器。登录到云控制器,并运行命令
sudo euca_conf --no-rsync --discover-nodes
云控制器将自动发现正在运行节点控制器服务的节点,并会提示您按 IP 地址注册每个节点。
在使用云之前,您必须先注册自己并获取凭据。启动 Web 浏览器(在云控制器上或 LAN 上的另一台机器上),然后转到此 URL:https://<cloud-controller-ip-address>:8443。您必须使用安全连接,并且您的浏览器会收到安全证书警告。接受证书警告后,使用用户名“admin”和密码“admin”登录页面(图 1)。然后,系统会提示您更改管理员密码并填写您的电子邮件地址,以便 UEC 可以向您发送有关您的实例的信息。
接下来,您需要将您的凭据放到您可以使用的位置。我更喜欢在云控制器上执行此操作,因此以您的常规用户身份在云控制器上运行此脚本
mkdir -p ~/.euca chmod 700 ~/.euca cd ~/.euca sudo euca_conf --get-credentials mycreds.zip unzip mycreds.zip cd -
这会将您的 UEC 凭据放入 ~/.euca 目录中。如果需要,可以从 UEC 管理门户将凭据下载到另一台 Ubuntu 机器以供使用。接下来,您需要添加以下行. ~/.euca/eucarc到您的 shell 配置文件(Ubuntu 机器或云控制器上的 ~/.bashrc),以便每次 shell 启动时都加载 eucarc 文件。如果您在云控制器以外的另一台机器上,您还需要安装 euca2ools 软件包。
现在准备工作已完成,您可以通过运行以下命令来验证集群是否正常工作euca-describe-availability-zones verbose命令
bill@falcon:~$ euca-describe-availability-zones verbose AVAILABILITYZONE cluster1 192.168.1.116 AVAILABILITYZONE |- vm types free / max cpu ram disk AVAILABILITYZONE |- m1.small 0002 / 0002 1 128 2 AVAILABILITYZONE |- c1.medium 0002 / 0002 1 256 5 AVAILABILITYZONE |- m1.large 0001 / 0001 2 512 10 AVAILABILITYZONE |- m1.xlarge 0001 / 0001 2 1024 20 AVAILABILITYZONE |- c1.xlarge 0000 / 0000 4 2048 20
虽然可以制作您自己的自定义镜像以在您的云上运行(有关捆绑镜像的链接,请参阅“资源”),但从 UEC“商店”获取一个镜像要容易得多(图 2)。只需访问云控制器的 URL https://<cloud-controller-ip-address>:8443/,输入您的登录名和密码,单击“Store”选项卡,您将看到 UEC 商店。只需找到您想要安装的镜像(在撰写本文时,只有三个),然后按下“Install”按钮。您的镜像将自动下载并安装到您的集群中。完成后,您将在灰色的“Install”按钮下方获得一个“How to Run?”链接。如果您单击该链接,您将获得实例化或启动所选镜像的确切命令行。
实例化镜像需要您在云控制器上(或您安装凭据的任何位置)使用命令行。在您运行第一个镜像之前,您必须创建一个 SSH 密钥对,以便您可以在实例启动并运行后以 root 身份登录。密钥已存储,并且在您的所有实例中通用,因此此脚本只需运行一次
if [ ! -e ~/.euca/mykey.priv ]; then touch ~/.euca/mykey.priv chmod 0600 ~/.euca/mykey.priv euca-add-keypair mykey > ~/.euca/mykey.priv fi
接下来,配置云以允许所有实例的入站端口 22 访问 (SSH)。以下命令将允许来自任何源 IP 的 SSH
euca-authorize default -P tcp -p 22 -s 0.0.0.0/0
现在,您可以启动您的第一个镜像
bill@falcon:~$ euca-run-instances emi-DF841070 -k mykey -t c1.medium RESERVATION r-3409079E admin admin-default INSTANCE i-46780864 emi-DF841070 0.0.0.0 0.0.0.0 pending mykey 2009-12-10T06:26:09.471Z eki-F59010E3 eri-0A2A115C
第一次实例化特定镜像时,启动速度会很慢。Eucalyptus 将镜像缓存在节点控制器上,因此有大量数据必须移动到节点。您可以通过运行以下命令来跟踪镜像的状态
watch -n5 euca-describe-instances
您将在euca-describe-instances命令的输出中看到列出的两个 IP 地址。一个将是您 LAN 上的 IP,另一个将是私有 IP。一旦实例被列为“running”,您就可以ssh到输出中列出的 IP 地址。请注意,它没有带有密码的用户帐户,因此您需要使用之前创建的 SSH 密钥
bill@falcon:~$ euca-describe-instances RESERVATION r-3409079E admin default INSTANCE i-46780864 emi-DF841070 192.168.1.170 172.19.1.2 running mykey 0 c1.medium 2009-12-10T06:26:09.471Z cluster1 eki-F59010E3 eri-0A2A115C bill@falcon:~$ bill@falcon:~$ ssh -i ~/.euca/mykey.priv ubuntu@192.168.1.170 The authenticity of host '192.168.1.170' can't be established. ... Are you sure you want to continue connecting (yes/no)? yes ... Linux 172 2.6.31-14-server #48-Ubuntu SMP Fri Oct 16 15:07:34 UTC 2009 x86_64 ... System information as of Thu Dec 10 06:32:03 UTC 2009 System load: 0.0 Memory usage: 16% Processes: 70 Usage of /: 29.6% of 1.98GB Swap usage: 0% Users logged in: 0 ... ubuntu@172:~$
此时,您已进入您的实例,它是一个功能齐全的系统。您可以apt-get像 apache 这样的软件包,或者如果您愿意,可以进行进一步的系统配置。完成后,您可以退出 SSH 会话,然后通过从euca-describe-instances命令的输出中找到实例 ID(在上面的示例中,它是 i-46780864)并运行euca-terminate-instances <instanceID>来终止实例。然后您的实例将关闭。
本文仅触及 Ubuntu Enterprise Cloud 可能性的皮毛。虽然它不如 VMware 或 VirtualBox 等其他虚拟化技术灵活,但它与 Amazon 的 EC2 服务 API 兼容,并且允许您构建虚拟机网络,其规模远远超出传统虚拟化解决方案的可能性。如果您需要可以动态实例化和终止的可扩展虚拟机网络,那么 Ubuntu Enterprise Cloud 和 Eucalyptus 非常适合您。
虚拟化扩展——确保它们已启用!
Eucalyptus 要求节点控制器上的 CPU 启用虚拟化扩展 (VT)。帮自己一个忙,进入您的 BIOS 并检查它是否已启用。仅仅在 /proc/cpuinfo 中 grep “vmx” 是不够的。还必须启用 BIOS 支持。在准备撰写本文时,我花费了几天的时间进行测试才了解到这一事实。虚拟机似乎已启动,然后立即终止,并在节点控制器上的 nc.log 文件中显示一条晦涩的消息,例如[EUCAERROR ] libvirt: Domain not found: no domain with matching name 'i-427C0881' (code=42)。只需拨动 BIOS 开关以启用虚拟化扩展,虚拟机即可正常启动。安装前请验证您的 BIOS 设置!
什么是 Walrus——CooCooCaChoo?
Eucalyptus 包括一项名为 walrus 的服务。walrus 服务是一项存储服务,它模拟 Amazon 的 S3 存储。本文介绍了 Eucalyptus 的默认安装,该安装在与云控制器相同的系统上运行 walrus 服务。如果您有一台具有大量磁盘空间的服务器,则完全可以将 walrus 服务拆分出来,并将大块磁盘空间导出为虚拟机的卷。换句话说,它是为您的虚拟机免费实现的虚拟 SAN。不幸的是,深入了解 walrus 的细节超出了本文的范围。
DHCP 问题
Eucalyptus 云控制器确实运行一个 DHCP 服务器,该服务器将响应来自云实例的请求。但是,如果您的 LAN 上有 DHCP 服务器,则您的实例可能会从您的其他 DHCP 服务器而不是云控制器的 DHCP 服务器接收 DHCP 地址。您可能希望告诉您的主 DHCP 服务器忽略从云实例的 MAC 地址发送的请求。所有云实例的 MAC 地址都以 d0:0d 开头。在我的运行 dnsmasq 的 DHCP 服务器上,我所要做的就是在 dnsmasq.conf 文件中添加一行,内容为dhcp-host=d0:0d:*,ignore.
资源
Ubuntu Enterprise Cloud 文档: https://help.ubuntu.com/community/UEC
Ubuntu Server 9.10 下载: www.ubuntu.com/getubuntu/download-server
Eucalyptus 主页: open.eucalyptus.com
使用安装程序 CD 安装 UEC: https://help.ubuntu.com/community/UEC/CDInstall
使用基于软件包的安装安装 UEC: https://help.ubuntu.com/community/UEC/PackageInstall
捆绑您自己的 UEC 镜像: https://help.ubuntu.com/community/UEC/BundlingImages
使用 Walrus 存储控制器: https://help.ubuntu.com/community/UEC/StorageController
Bill Childers 是硅谷的一位 IT 经理,与他的妻子和两个孩子住在一起。他非常喜欢 Linux,而且他可能应该时不时地多晒晒太阳。在业余时间,他为 Gilroy Garlic Festival 工作,但他身上并没有大蒜味。