在云端构建云:在亚马逊 EC2 上运行 Apache CloudStack,第 1 部分

作者: 希拉·布瑟 | 202 3 年

本博客由 SDE II — 客户工程 亚马逊云科技 的马克·罗杰斯撰写

如何将一朵云放在另一片云中?一些使 亚马逊弹性计算云(Amazon EC2) 安全而出色的功能也使运行CloudStack变得困难。最大的障碍是亚马逊云科技和CloudStack都想管理网络资源。因此,我们必须让他们相互隔离。这需要一些不明显的步骤,而且花了很长时间才弄清楚。我将分享我学到的东西,这样你就可以更轻松地浏览这个过程。

Apache CloudStack 是一个开源平台,用于部署和管理虚拟机 (VM) 以及相关的网络和存储基础架构。您通常会在自己的硬件上运行它来创建自己的云。但是,在 亚马逊虚拟私有云 (Amazon VPC) 中运行它可能有好处 ,包括它可以如何帮助你迁出数据中心。这是为实验或训练创建一次性环境的好方法。此外,这是在亚马逊 E lastic Kubernetes 服务( 亚马逊 EKS)Anywher e 中测试新的 CloudStack 支持的便捷方式。 就我而言,我需要为使用CloudStack API的项目创建开发和测试环境。环境需要共享和可扩展。我们的构建管道已经在 亚马逊云科技 中了,因此在那里放置新环境也是有意义的。

CloudStack 可以与许多虚拟机管理程序一起使用。本文中的说明将在 Linux 上使用基于内核的虚拟机 (KVM)。KVM 将在较低级别管理虚拟机,而 CloudStack 将管理 KVM。

先决条件

本文中的大多数信息应该适用于一系列的CloudStack版本。我在 CentOS 7 上以 CloudStack 4.14 为目标。我还测试了 CloudStack 版本 4.16 和 4.17,我推荐它们。

官方的 CentOS 7 x86_64 HV M 映像效果很好。 如果您使用不同的 Linux 风格或版本,则可能需要修改一些实现细节。

你需要了解 CloudStack 的基础知识。本文的范围是让CloudStack和亚马逊云科技和平共处。一旦CloudStack开始运行,我假设你会从那里开始处理事情。有关安全和其他最佳实践的信息,请参阅 亚马逊云科技 文档 和 CloudStack 文档

让事情变得更容易

我写 了一些脚本 来自动安装。你可以在 CentOS 7 的 EC2 实例上运行它们,它们会为你完成所有的安装和操作系统配置。您可以按原样使用它们,也可以对其进行自定义以满足您的需求。我还写了一些你可以复制 的 亚马逊云科技 CloudFormation 模板来创建演示环境。 README 文件 有更多细节。

亚马逊 EC2 实例类型

KVM 需要硬件虚拟化支持 。大多数 EC2 实例都是不支持嵌套虚拟化的虚拟机。要访问裸硬件,您需要 金属实例类型

我喜欢 c5.metal,因为它是最便宜的金属类型之一,而且每 vCPU 的成本很低。它有 96 个 vCPU 和 192 GiB 的内存。如果你在上面运行 20 个虚拟机,每个 4 个 CPU 内核和 8 GiB 内存,那么你仍然有 16 个 vCPU 和 32 GiB 可以在操作系统、CloudStack 和 MySQL 之间共享。使用CloudStack的超额配置功能,如果虚拟机运行轻负载,则可以容纳更多的虚拟机。

联网

最大的挑战是网络。亚马逊云科技 知道应该存在哪个 IP 和 MAC 地址,也知道它们应该属于哪台机器。它会屏蔽任何不符合其网络行为理念的流量。同时,CloudStack假设它发明的任何 IP 或 MAC 地址都应该可以正常运行。当 CloudStack 为 亚马逊云科技 子网上的虚拟机分配地址时,它们的网络流量会被阻止。

你可以通过在运行 CloudStack 的实例上启用网络地址转换 (NAT) 来解决这个问题。如果它符合您的需求,这是一个很好的解决方案,但它会使您的 Amazon VPC 中的其他计算机难以联系您的虚拟机。我推荐一种不同的方法。

尽管 亚马逊云科技 限制了你可以使用其第 2 层网络做什么,但它非常乐意让你运行自己的第 3 层路由器。您的 EC2 实例可以充当通往 亚马逊云科技 管辖范围之外的新虚拟子网的路由器。该实例与 亚马逊云科技 集成,就像 VPN 设备一样,将流量路由到需要去的任何地方。CloudStack 可以在虚拟子网中做任何想做的事,每个人都很高兴。

我所说的虚拟子网是什么意思?这是一个仅存在于 EC2 实例内部的子网。它由连接到 Linux 网桥的逻辑网络接口组成。整个子网存在于单个 EC2 实例中。它不能很好地扩展,但很简单。在我的下一篇文章中,我将介绍一个更复杂的设置,即覆盖多个实例,允许水平扩展。

简单的方法

简单的方法是将所有内容放在一个 EC2 实例中,包括数据库、文件存储和虚拟子网。由于所有内容都存储在本地,因此应分配足够的磁盘空间以满足您的需求。500 GB 足以支持一些基本虚拟机。为您的实例创建或选择一个安全组,允许用户访问 CloudStack 用户界面(TCP 端口 8080)。安全组还应允许您从虚拟机访问您将提供的任何服务。

EC2 instance summary info showing 1 instance, CentOS 7 (x86_64) AMI, c5.metal instance type, a security group name, and a 500 GiB volume

拥有实例后,配置 亚马逊云科技 将其视为路由器。

  1. 在 A WS 管理控制台 中前往 Amazon EC2 。
  2. 选择您的实例,然后 停止源/目标检查

In the EC2 Actions menu, select Networking, then Change source/destination check.

3。更新子 网路由表

a. 转到 VPC 设置,然后选择路由表。

b. 确定需要访问 CloudStack 的子网的表。

c. 在每个表中,添加指向新虚拟子网的路由。路由目标应该是您的 EC2 实例。

4。根据您的网络需求,您可能还需要向传输网关、VPN 端点等添加路由。

由于所有内容都将在一台服务器上,因此创建虚拟子网仅需创建 Linux 桥接即可。CloudStack 必须找到连接到网桥的网络适配器。因此,添加一个具有 CloudStack 可以识别 的名称的 虚拟接口。

A single EC2 instance contains the CloudStack management service, the CloudStack agent, a dummy network interface, several virtual machines, and a router. All of those things are connected to each other by a virtual subnet that exists inside the instance. The instance's elastic network interface is connected between the router and the Amazon VPC. 以下片段显示我如何在 CentOS 7 中配置网络。您必须为变量 $virutal_host_ip_address 和 $virtual_netmask 提供值,以反映您要创建的虚拟子网。对于 $dns_address,我推荐使用 VPC IPv4 网络范围的基础 ,再加上两个。 你不应该使用 169.654.169.253,因为 CloudStack 会保留本地链接地址供自己使用。

yum install -y bridge-utils net-tools

# The bridge must be named cloudbr0.

cat << EOF > /etc/sysconfig/network-scripts/ifcfg-cloudbr0
DEVICE=cloudbr0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=none
IPV6INIT=no
IPV6_AUTOCONF=no
DELAY=5
STP=yes
USERCTL=no
NM_CONTROLLED=no
IPADDR=$virtual_host_ip_address
NETMASK=$virtual_netmask
DNS1=$dns_address
EOF

# Create a dummy network interface.
cat << EOF > /etc/sysconfig/modules/dummy.modules
#!/bin/sh
/sbin/modprobe dummy numdummies=1
/sbin/ip link set name ethdummy0 dev dummy0
EOF

chmod +x /etc/sysconfig/modules/dummy.modules
/etc/sysconfig/modules/dummy.modules

cat << EOF > /etc/sysconfig/network-scripts/ifcfg-ethdummy0
TYPE=Ethernet
BOOTPROTO=none
NAME=ethdummy0
DEVICE=ethdummy0
ONBOOT=yes
BRIDGE=cloudbr0
NM_CONTROLLED=no
EOF

# Turn the instance into a router

echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p

# Must kill dhclient or the network service won't restart properly.
# A reboot would also work, if you’d rather do that.

pkill dhclient
systemctl restart network

CloudStack 必须知道使用哪些 IP 地址进行服务间通信。它将通过将计算机的完全限定域名 (FQDN) 解析为地址来进行选择。以下命令可以让你选择正确的命令。您必须为 $virtual_host_ip_address 提供一个值。

hostnamectl set-hostname cloudstack.localdomain

echo "$virtual_host_ip_address cloudstack.localdomain" >> 
/etc/hosts

您可以按照 快速安装指南 完成设置 。

请记住,CloudStack 只能直接连接到您的虚拟网络。EC2 实例是将虚拟子网连接到 Amazon VPC 的路由器。在配置 CloudStack 时,请使用实例的虚拟子网地址作为默认网关。

Use the EC2 instance's virtual subnet IP address as the default gateway in CloudStack. In this example, the virtual subnet is 10.100.0.0/16, and the instance's address in that subnet is 10.100.0.1. CloudStack then uses 10.100.0.1 as the default gateway.

要从您的工作站访问 CloudStack,您需要连接到您的 VPC。这可以通过 客户端 VPN 堡垒主机 进行。如果您使用堡垒,则其子网需要通往您的虚拟子网的路由,并且您的浏览器需要一个 SSH 隧道 才能访问 CloudStack 用户界面。用户界面位于 http://x.x.x.x:8080/client/,其中 x.x.x.x 是你的 CloudStack 实例的虚拟子网地址。请注意,如果你使用的是 SSH 隧道,CloudStack 的控制台查看器将无法运行。

如果你只是在试用 CloudStack,那么我建议你在不需要的时候停止实例,这样可以省钱。做到这一点的安全方法是:

  1. 在 CloudStack 用户界面中禁用您的区域。
  2. 将主存储器置于维护模式。
  3. 等待切换到维护模式完成。
  4. 停止 EC2 实例。

当你准备好重新开启所有功能时,只需撤消这些步骤即可。如果你在CloudStack中有任何虚拟路由器,那么你可能也需要启动这些虚拟路由器。

清理

如果你使用我的 CloudFormation 模板,请 删除堆栈 删除 你添加的所有路由表条目 。如果您没有使用 CloudFormation,则 终止 EC2 实例 删除 您为其创建的安全组 ,并 删除您添加的所有路由表条目

结论

让 CloudStack 在 亚马逊云科技 上运行还不错。最难的部分就是知道怎么做。这里介绍的设置非常适合小型设施,但它只能垂直扩展。在我的下一篇文章中,我将向你展示如何创建可水平扩展的装置。我们将构建一个跨多个实例的覆盖网络,而不是使用存在于单个 EC2 实例中的虚拟子网。它将使用更多的组件和功能,包括一些可能对你来说是新的组件和功能。我希望你觉得它有趣!

现在你可以创建一个简单的设置,试一试吧!我希望你玩得开心,并在此过程中学到新的东西。用你的实验结果发表评论。

“Apache”、“Apache CloudStack” 和 “CloudStack” 是阿帕奇软件基金会的商标。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。