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

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

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

第 1 部分 中 ,我向你展示了如何在单个 亚马逊弹性计算云(亚马逊 EC2)实例 上运行 带有 KVM 的 A pache Clou dSt ack。 这种简单的设置非常适合实验和轻量级工作量。在这篇文章中,事情会变得更加有趣。我将向您展示如何在您的 亚马逊虚拟私有云 (Amazon VPC) 中创建叠加网络, 该网络允许 CloudStack 在多个 EC2 实例之间横向扩展。同样的方法也可以用于其他虚拟机管理程序。

如果你还没有读过,那么从 第 1 部分 开始 。它解释了为什么这种网络设置是必要的。相同的先决条件适用于这两个帖子。

让事情变得更容易

我写 了一些脚本 来自动在 CentOS 7 上安装 CloudStack 并配置操作系统。您可以自定义它们以满足您的需求。我还写了一些你可以复制 的 亚马逊云科技 CloudFormation 模板来创建演示环境。 README 文件 有更多细节。

可扩展的方法

正如我上一篇文章中所述,我们的团队最初使用单个 EC2 实例。起初这行得通,但它没有我们需要的容量。我们仅限于几十个 VM,但我们需要数百个。我们还需要根据需求的变化扩大和缩小规模。这意味着我们需要能够添加和删除 CloudStack 主机。使用 Linux 网桥作为虚拟子网已经不够了。

为了支持添加主机,我们需要一个跨越多个实例的子网。我找到的解决方案是 虚拟可扩展局域网 (VXLAN )。它轻巧,易于配置,并包含在 Linux 内核中。VXLAN 创建了第 2 层叠加网络,该网络抽象出底层网络的细节。它允许网络不同部分的计算机进行通信,就好像它们都连接到同一个简单的网络交换机一样。

叠加网络的另一个示例是亚马逊 VPC。它的行为就像物理网络,但实际上是其他网络之上的一层。一直都是网络。VXLAN 提供了一个顶层,CloudStack 可以舒适地坐在那里,处理您的所有虚拟机需求,幸福地不知道下方的世界。

叠加网络具有一些很大的优势。最大的改进是你可以拥有多台主机,允许水平扩展。拥有更多主机不仅可以为您提供更多的计算能力,还可以让您进行滚动维护。我将向您展示如何使用 亚马逊弹性文件系统 (Amazon EFS) 和 亚马逊关系数据库服务 (Amazon RDS ) 来实现可扩展 和可靠的存储,而不是将数据库 和文件存储放在管理服务器上。

EC2 实例

让我们从三个亚马逊 EC2 实例开始。一个将是覆盖网络和您的亚马逊 VPC 之间的路由器,第二个将是您的 CloudStack 管理服务器,第三个将是您的虚拟机主机。您还需要一种连接到实例的方法,例如堡垒主机或 VPN 终端节点。

Three EC2 instances are connected to an AWS subnet. There's an overlay network that spans all three instances.The router instance connects the overlay network to the AWS subnet. The management instance contains the CloudStack management service, which is attached to the overlay network. The host instance contains the CloudStack agent and some VMs, all of which are connected to the overlay network. VXLAN 必须发送和接收多点传送流量。只有 Nitro 实例 可以是多播发送器 。 按照您的计划,请查看 Nitro 实例类型 列表

路由器不需要太多的计算能力,但需要足够的网络带宽来满足您的需求。如果您将 Amazon EFS 与您的实例放在同一个子网中,则它们将直接与其通信,从而减少路由器的负载。确定所需的网络吞吐量,然后选择合适的 Nitro 实例类型。

创建路由器实例后,将 亚马逊云科技 配置为将其用作路由器。停止在实例的网络设置中检查源/目标。然后更新适用的 亚马逊云科技 路由表,使用路由器作为覆盖网络的目标。路由器的安全组需要允许从虚拟机进入 CloudStack 用户界面(TCP 端口 8080)和您计划提供的任何服务。

对于管理服务器,您需要一个 Nitro 实例类型。它会比你的路由器消耗更多的CPU,所以要做出相应的计划。

除了是 Nitro 类型之外,主机实例还必须是 金属类型 。金属实例支持硬件虚拟化,这是 KVM 所 需要的 。如果您有一个按需 vCPU 限制较低的新 亚马逊云科技 账户,则可以考虑从拥有 48 个 vCPU 的 m5zn.metal 开始。否则,我建议直接使用 c5.metal,因为它以类似的价格提供 96 个 vCPU。根据您的计算需求、预算和 vCPU 限制,有更大的类型可供选择。如果您的账户的按需 vCPU 限制过低,则可以 提交支持请求书 以 提高上限。

联网

所有实例都应位于专用子网上。与其他实例共享子网可能会导致通信问题。有关示例,请参阅下图。子网中有一个名为 TroubleMaker 的实例,该实例不在叠加网络上。如果 TroubleMaker 向管理实例的叠加网络地址发送请求,则会发生以下情况:

  1. 该请求通过 亚马逊云科技 子网发送到路由器。
  2. 路由器通过覆盖网络转发请求。
  3. CloudStack 管理实例与 TroubleMaker 所在的同一 亚马逊云科技 子网建立了连接。因此,它直接响应,而不是使用路由器。这不是 亚马逊云科技 所期望的返回路径,因此响应被删除了。

This diagram depicts the steps described in the previous paragraph.

如果您将 TroubleMaker 移至不同的子网,则请求和响应都将通过路由器。这将解决通信问题。

重叠网络中的实例将使用用作 VXLAN 隧道端点 (VTEP) 的特殊接口。VTEP 必须知道如何通过底层网络相互联系。你可以手动为每个实例提供所有其他实例的列表,但这是一场维护方面的噩梦。最好让 VTEP 发现对方,他们可以使用多点传送来做到这一点。您可以 使用 亚马逊云科技 Transit Gatew ay 添加 多播支持

以下是使 VXLAN 组播正常工作的步骤:

  1. 创建传输网关时启用多点传送支持。
  2. 将传输网关连接到您的子网。
  3. 创建启用 IGMPv2 支持的传输网关多播域。
  4. 将多播域与您的子网关联。
  5. 在每个实例上配置 eth0 接口以使用 IGMPv2。以下示例代码显示了如何执行此操作。
  6. 确保您的实例安全组允许进入 IGMP 查询(来自 0.0.0.0/32 的协议 2 流量)和 VXLAN 流量(来自其他实例的 UDP 端口 4789)。

CloudStack 虚拟机必须连接到与 VXLAN 接口相同的网桥。正如前一篇文章中提到的,CloudStack关心名字。我建议给接口起一个以 “eth” 开头的名称。此外,这种命名惯例告诉CloudStack使用哪个网桥,从而避免了像简单设置中那样的虚拟接口的需要。

以下片段显示我是如何在 CentOS 7 中配置网络的。您必须为这些变量提供值:

  • $overlay_host_ip_address 、 $overlay_ netmask 和 $overlay_gateway_ ip:使用您正在创建的叠加网络的值。
  • $dns_add ress :我建议使用 VPC IPv4 网络范围的基础 ,再加上两个。 你不应该使用 169.654.169.253,因为 CloudStack 会保留本地链接地址供自己使用。
  • $multicast_addres s:您希望 VXLAN 使用的多播地址。在多点传送范围内选择不会与其他任何东西冲突的东西。我建议从 IPv4 本地作用域 (239.255.0.0/16 ) 中进行选择。
  • $interface_nam e :VXLAN 应该用来与物理网络通信的接口的名称。这通常是 eth0。

路由器实例的几个步骤与其他实例的步骤不同。注意评论!

yum install -y bridge-utils net-tools

# IMPORTANT: Omit the GATEWAY setting on the router instance!
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-cloudbr0
DEVICE=cloudbr0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=none
IPV6INIT=no
IPV6_AUTOCONF=no
DELAY=5
STP=no
USERCTL=no
NM_CONTROLLED=no
IPADDR=$overlay_host_ip_address
NETMASK=$overlay_netmask
DNS1=$dns_address
GATEWAY=$overlay_gateway_ip
EOF

cat << EOF > /sbin/ifup-local
#!/bin/bash
# Set up VXLAN once cloudbr0 is available.
if [[ \$1 == "cloudbr0" ]]
then
    ip link add ethvxlan0 type vxlan id 100 dstport 4789 group "$multicast_address" dev "$interface_name"
    brctl addif cloudbr0 ethvxlan0
    ip link set up dev ethvxlan0
fi
EOF

chmod +x /sbin/ifup-local

# Transit Gateway requires IGMP version 2
echo "net.ipv4.conf.$interface_name.force_igmp_version=2" >> /etc/sysctl.conf
sysctl -p

# Enable IPv4 forwarding
# IMPORTANT: Only do this on the router instance!
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p

# Restart the network service to make the changes take effect.
systemctl restart network

存储

让我们来看看存储。使用 MySQL 8.0 引擎创建 亚马逊 RDS 数据库,并为 CloudStack 的数据库设置工具设置要使用的主密码。请参阅 CloudStack 文档 ,查找您需要的 MySQL 设置。您可以将设置放入 RDS 参数组中。如果你想知道为什么我不使用 亚马逊 Aurora ,那是因为CloudStack需要MyISAM存储引擎,而Aurora中不提供这种引擎。

我推荐使用亚马逊 EFS 进行文件存储。为了提高效率,请使用您的 EC2 实例在子网中创建挂载目标。这将使它们能够直接与挂载目标通信,从而绕过覆盖网络和路由器。请注意,系统虚拟机将通过路由器使用 Amazon EFS。

如果你愿意,你可以整合你的 CloudStack 文件系统。只需创建一个文件系统,其中包含每个区域和存储类型的目录。例如,我使用名为 /zone1/primary、/zone1/secone1/secordy、/zone2/primary 等的目录。您还应该考虑在文件系统上启用预置吞吐量,否则启动几个 VM 后可能会耗尽积分。

文件系统可扩展性的一个后果是,可用空间量(8 艾字节)将导致 CloudStack 中出现整数溢出!为了避免这个问题,请将CloudStack全局设置中的storage.overprovisioning.factor从2减少到1。

当您的环境准备就绪后, 安装 CloudStack 。当它要求默认网关时,请记住使用路由器的覆盖网络地址。添加主机时,请确保使用主机的覆盖网络 IP 地址。

清理

如果你使用我的 CloudFormation 模板, 请删除堆栈 删除 你添加的所有路由表条目

如果你没有使用 CloudFormation,以下是需要删除的内容:

  1. CloudStack EC2 实例
  2. 亚马逊 RDS 数据库 参数组
  3. 亚马逊 EFS 文件系统
  4. 传输网关组播域 子网 关联
  5. 传输网关 组播域
  6. 传输网关 VPC 附件
  7. 境网关
  8. 您创建的 路由表 条目
  9. 您为实例、数据库和文件系统创建 的安全组

结论

我分享的方法有很多步骤,但是当你有计划时,这些步骤还不错。无论您是需要简单的实验设置,还是需要可扩展的环境来迁移数据中心,现在您都有一条前进的道路。试一试,在这里评论一下你学到的东西。我希望你觉得它有用又有趣!

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


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