如何构建多云应用程序 - 运行由负载均衡器托管的最简单网页的分步指南





5.00/5 (4投票s)
在本文中,我将逐步解释和展示如何运行由负载均衡器托管的最简单网页,该负载均衡器背后在 AWS 和 Azure 上都有节点。
背景
我将构建的云解决方案实际上基于两个大的架构块:连接两个云提供商的虚拟私有网络,以及构建带有节点的负载均衡器本身。
我要感谢 Gavin Lewis,他的文章启发了我。事实上,第一个部分(连接 AWS 和 Azure VPN)重复了他的步骤,但提供了更多解释并描绘了省略的步骤。当我自己做的时候,有些事情对我来说并不明显,所以我决定展示一个如何做到这一点的分步指南,而不是仅仅引用那篇文章。
Using the Code
如上所述,在构建多云负载均衡器解决方案之前,我们需要连接 AWS 和 Azure 网络。这是必要的,以便负载均衡器可以与节点交互,因为它们在同一个网络中。
连接网络
Azure
- 首先,我们创建 虚拟网络。指定其名称和地址空间,例如
172.18.0.0/16
。选择现有的资源组或创建一个新的。并将此 Azure 架构部分的区域设置为美国西部。此外,我们还需要创建子网。设置其名称和地址范围,我们将通过将子网掩码增加到 17 来减少地址范围 -
172.18.0.0/17
。其余参数保持不变。 - 为了将此 VNet 连接到 AWS 网络,我们将需要一个网关,这就是为什么我们为该 VNet 创建 网关子网,其地址范围(CIDR 块)为
172.18.128.0/24
,如默认建议。 - 下一步是创建 公共 IP 地址,以便将来分配给虚拟网络网关。我们只需指定其名称,其余默认。
- 现在我们准备创建 虚拟网络网关,它是 AWS 网络的连接点。我们设置名称,将 SKU 参数更改为 Basic 以节省资金,牺牲吞吐量,选择之前创建的 VNet 及其网关子网。要设置的最后一个参数是上一步中创建的公共 IP 地址。
创建 VNet 网关需要最长时间(最多 60 分钟),所以保持冷静,切换到 AWS 控制台继续操作。
AWS
- 现在我们需要为另一个提供商准备一个类似的架构。所以我们从创建 VPC 开始。我们应该为您的区域指定一些空闲的 CIDR 块,例如
172.16.0.0/16
。 - 然后我们需要为这个 VPC 创建 子网。为了创建 AWS 负载均衡器,我们至少需要基于不同可用区的 2 个子网。
所以选择刚刚创建的 VPC,然后选择一个可能的可用区并指定子网 1 的 CIDR 块。对第二个子网重复这些操作,但使用另一个 CIDR 块。
- 子网 1:
172.16.0.0/18
- 子网 2:
172.16.64.0/18
- 子网 1:
- 为了创建 VPN 隧道,我们需要在 AWS 端拥有 虚拟私有网关。设置一个名称并保留 Amazon 默认 ASN 选项。
- 由于某种原因,他们在创建时没有将虚拟私有网关附加到特定 VPC 的选项。所以我们应该手动完成。选择我们的多云 VPC,网关的状态应该更改为“已连接”。
Azure
- 对于 AWS 环境中的下一步,我们需要知道第 4 步中创建的 Azure 虚拟网络网关的 公共 IP 地址。为此,从列表中选择您的公共 IP 地址并记下 IP 地址本身。在我的示例中,它是
40.112.249.133
。它只会在 VNG 完全创建后出现。AWS
- 现在我们准备在 AWS 端创建 客户网关,并使用上一步中的公共 IP 地址将其链接到 Azure 网络。我们使用静态路由以避免事情变得更复杂。
- 这是连接两个网络的关键步骤之一。因此,我们将创建 站点到站点 VPN 连接 来连接我们的网络。最终,我们将在该 VPN 连接中获得两个隧道,它们连接到 Azure 网络内部的本地网络网关。
要创建 VPN 连接,请填写名称标签,选择第 7 步中的虚拟私有网关。以及第 10 步中已有的客户网关。我们没有 BGP,实际上也不需要,所以选择静态路由选项并输入静态 IP 前缀
172.18.0.0/17
- 这是第 1 步中 Azure VNet 子网 1 的 IP 地址范围。其余参数保持默认。
- 一旦 VPN 连接创建,我们可以下载其配置。我们需要虚拟私有网关的外部 IP 地址和每个 IPSec 隧道的预共享 SHA 密钥。
如果我们在 下载配置 对话框中,供应商和平台选择通用值,软件选择供应商无关值,我们应该在下载中获得纯文本文件。
因此,在您刚刚下载的文件中查找 IPSec 隧道 #1 的 #1:Internet 密钥交换配置部分,其中有一行包含预共享密钥值,一行包含虚拟私有网关的外部 IP 地址。
IPSec Tunnel #1 - Pre-Shared Key : RyLbEbDeQEfRgyfNMCazi74Ifa8NCCR2 - Virtual Private Gateway : 13.59.179.250
IPSec 隧道 #2 也是如此。
IPSec Tunnel #2 - Pre-Shared Key : rNaec.9VsurcpGgdfP7CwfQU4OvRRrzs - Virtual Private Gateway : 18.224.76.18
Azure
- 现在我们回到 Azure VNG,我们需要为每个连接创建 2 个 连接 及其 本地网络网关。在那里,我们将指定我们在上一步中获得的设置。这是连接 2 个网络的最后一步。
选择您的虚拟网络网关,进入 设置 部分的“连接”,然后单击“添加”按钮。
为您的连接输入一个名称,选择连接类型为 站点到站点 (IPsec),与我们用于 AWS VPN 连接的类型相同。输入我们在第 12 步中获得的第一个 IPSec 隧道的共享密钥。之后,单击“选择本地网络网关”并点击“创建新网关”按钮。
现在我们进入本地网络网关创建对话框,我们需要输入网关的名称和我们在第 12 步中获得的第一个 IPSec 隧道的 IP 地址,它在配置文件中是外部 IP 地址。此外,指定地址空间,它是 AWS VPC 的 CIDR 块 -
172.16.0.0/16
。然后,为第二个连接创建第二个本地网络网关。重复这些操作,但从第二个 AWS IPSec 隧道中获取共享密钥和 LNG IP 地址的数据。
您也可以在本地网络网关的“配置”部分找到这些设置。
- 一段时间后,我们可以检查虚拟网络网关的连接,状态应该是“已连接”。
AWS
- 然后检查 AWS 端两个隧道的状态。选择您的 VPN 连接并单击“隧道详情”选项卡。两者状态都应为 UP。
这意味着我们成功连接了两个提供商的网络。但在我们真正开始构建多云解决方案之前,我们需要调整 AWS 端 VPC 的路由表,以显示流量的路由方向。
- 为了调整路由表,我们需要一个 互联网网关。让我们用一个名称来创建它。
- 创建互联网网关后,我们需要将其附加到我们的多云 VPC。只需点击几下即可完成。
- 现在我们可以编辑多云 VPC 的 路由表 条目。找到属于多云 VPC 的路由表,点击“操作”并“编辑路由”。
我们应该添加 2 条路由。指向
172.18.0.0/16
(Azure VNet)的流量路由到第 7 步中的虚拟私有网关,其余流量(除了我们本地已定位的网络)路由到第 16 步中的互联网网关。就是这样,让我们测试这些网络中的节点是否真的可以使用私有 IP 地址相互交互。
测试
- 为了测试交互,我们将在连接的网络中创建 2 个节点 - AWS 上的 EC2 实例和 Azure 上的虚拟机,并尝试相互 ping。
我不会描述如何创建 EC2 实例和虚拟机,这太简单了,您可以很容易地找到如何做到这一点。创建时不要忘记,您需要通过 ssh 连接到这些机器,因此允许此规则并保存密钥和密码以防丢失访问权限。
为了能够 ping EC2 实例,我们必须通过调整分配给已创建 EC2 实例的 安全组 来有意允许它。选择 安全组,转到 入站 选项卡,单击 编辑 并添加具有以下参数的规则:
类型 -
自定义 ICMP
,协议 -回显请求
,源0.0.0.0/0
。 - 通过 SSH 连接到两台机器,并尝试通过它们的私有 IP 地址相互 ping。它应该可以工作。这也证明了网络已成功连接,我们确实可以在这里开始构建多云解决方案。
负载均衡器
- 因此,想法是在 AWS 上创建 负载均衡器,并将其关联的目标组中放入 2 个实例:一个来自 LB 所在的 VPC,一个来自连接的网络。通过这种方式,我们构建的 LB 目标组不是放置在不同的可用区或区域,而是放置在不同的提供商。因此,我们获得了跨全球节点的多云解决方案。
在创建 LB 之前,我们需要将节点准备成网络服务器。为此,我们需要在上面安装任何网络服务器。这也是一个相当简单的问题,有很多关于如何做到这一点的例子。我可以说
httpd
服务对于我们的目的来说绰绰有余。在我们的节点上安装 Web 服务器服务后,将 _index.html_ 文件放入 _/var/www/html_ 文件夹。将以下 HTML 代码放入 AWS EC2 实例的 _index.html_
<html><h1>Hello Multi-Cloud (AWS)</h1></html>
对于 Azure 虚拟机,代码相同,但包含 (Azure)
<html><h1>Hello Multi-Cloud (Azure)</h1></html>
- 让我们开始创建 LB 本身。我们将需要一个应用程序负载均衡器类型。选择类型后,我们应该填写 LB 名称,选择面向互联网的方案,以便能够通过其 DNS 名称进行测试。
- 在“配置负载均衡器”选项卡的底部,我们可以找到“可用区”部分。在此步骤中,LB 不知道它将是多云均衡器,因此我们必须选择至少 2 个具有子网的可用区。这就是我们在第 6 步中创建 2 个子网的原因。
- 我们可以将“配置安全设置”中的所有内容保留为默认值,然后跳到“配置安全组”。在这里,我们使用建议的 TCP 规则创建一个新的安全组。
- 下一个 配置路由 选项卡更有趣。我们为节点创建一个新的目标组,并为其指定一个名称标签。然后我们应该选择
IP
作为目标类型。协议和端口保留默认值。对于健康检查,在“路径”中输入 _/index.html_。因此,它应该能找到我们在每个节点上创建的 _index.html_ 文件。
- 在 注册目标 选项卡上,我们注册两个目标。
第一个是本地 EC2 实例。我们选择我们的多云 VPC 并指定实例的私有 IP 地址。然后点击“添加到列表”按钮。对于我的情况,它是
172.16.20.207
。第二个是 Azure VM。要注册它,我们选择“其他私有 IP 地址”作为网络值,并在
172.18.0.0
子网中键入 Azure VM 的私有 IP 地址。对于我的情况,它是172.18.0.4
。 - 审核后,我们创建 LB。完成后,我们可以在列表中看到新创建的 LB。它需要一些时间来检查我们的目标是否健康。您可以在 目标 选项卡中的 状态 列中看到这一点。
- 负载均衡器已创建,其目标处于健康状态。让我们实时检查一下。点击“描述”选项卡,找到其 DNS 名称。复制到剪贴板并在浏览器中打开 URL。
- 您会看到类似这样的内容。尝试刷新页面几次。(Azure) 应该变为 (AWS),反之亦然。这意味着 LB 将流量路由到位于不同云提供商的不同节点。
多云解决方案有效!
关注点
我只是展示了如何构建多云解决方案,而不会被某个特定提供商锁定。这有助于最大程度地降低任何单一提供商在价格、可用性等方面的风险。
当然,您可以找到更多适合多云方法的商业案例,但我并没有追求制作商业解决方案的目标。这更多是关于技术解决方案以及如何连接和混合不同云提供商的基本示例。此解决方案基于我在 Intetics 的经验。
我很高兴在评论中看到任何其他示例(真实的或只是您的想法),说明在哪些商业案例中将您的架构构建在多个云上真正有意义。
历史
- 2019年11月12日:V1
- 2020年3月6日:小幅修改,标题更新