9

语境

在一个项目上工作以部署一个 RESTful API 应用程序并将 TCP 服务分离到 Azure 容器实例。由于遗留原因,TCP 服务需要静态 IPv4 地址。

上下文图

问题

我正在尝试隔离我的选项,以将其作为静态公共 IP 地址分配给托管在 Azure 容器实例上的 TCP 服务。有什么选择 ?

经过测试

  1. 使用静态公共 IP 地址部署 Azure 应用程序网关。应用程序网关允许将后端池定向到 IP 或 FQDN 端点。这似乎是可操作的(见图)。尽管后端池中的选项似乎只允许 HTTP 和 HTTPS,而不是自定义端口。如果 TCP 服务可以侦听 80 和 443 上的 Web API,也许这可以被操纵。应用程序网关是第 7 层资源,仅用于 HTTP 和 HTTPS 流量。

  2. Azure 负载均衡器。只能针对 VM、可用性集或 VM 规模集。

  3. 为资源分配静态地址。不允许用于容器实例。

  4. 流量管理器。似乎不是此部署的正确资源类型。

见图。当我通过 BASH 会话查询时,API 和 TCP SERVICE 的容器实例具有相同的私有 IP 地址。建议它们托管在附图中的同一主机(标记为容器组)上。不确定这是否是正确的标签抱歉,我是 Container tech 的新手。

谢谢你的任何建议。斯科特

4

1 回答 1

20

可能的解决方案

可能有解决办法:

  • 创建了一个新的 VNET
  • 地址范围 10.60.0.0/23
  • 创建子网容器 10.60.0.0/24
  • 创建的 VNET 防火墙资源
  • 创建子网防火墙 10.60.1.0/24
  • 将静态公共地址分配给防火墙资源

现在防火墙“规则”允许以下内容:

  • NAT 规则 - 典型的端口转换
  • 网络规则 - 路由地址
  • 应用程序规则 - 路由 FQDN

努力将容器部署到这个开发子网,从表面上看,所有选项都在那里,重定向端口、ip 或 FQDN。游戏的变化在于能够将静态公共地址分配给 VNET 内的资源,并允许 NAT、网络或应用程序规则重定向流量。

明天将更新结果的线程。

2019 年 2 月更新

好的,所以不要使用 Azure 防火墙资源。它非常昂贵,就我而言,无论如何都不划算@每月约500英镑。我没有时间使用防火墙测试该理论,但由于成本原因,没有任何意义进一步遵循它。

Azure 容器实例允许使用 IP 地址和完全限定域名 (FQDN) 将容器直接公开到 Internet。创建容器实例时,您可以指定自定义 DNS 名称标签,以便可以在 customlabel.azureregion.azurecontainer.io 访问您的应用程序。不幸的是,目前 ACI 不支持静态公共 IP 地址。

将容器组部署到虚拟网络时存在某些限制。

  • 要将容器组部署到子网,子网不能包含任何其他资源类型。在将容器组部署到现有子网之前,从现有子网中删除所有现有资源,或创建新子网。

  • 部署到虚拟网络的容器组当前不支持公共 IP 地址或 DNS 名称标签。

  • 由于涉及到额外的网络资源,将容器组部署到虚拟网络通常比部署标准容器实例要慢一些。

https://feedback.azure.com/forums/602224-azure-container-instances

部署的解决方案

  • 使用 Azure 映像创建的 Ubuntu VM
  • 分配给 VM 的静态公共地址
  • 在 docker 镜像中部署到 VM 的 API 和服务
  • 用于部署的 Arm 模板,与 DevOps 构建和发布集成
  • 每月费用 23.52 英镑(核心:2、3GB 内存、16GB HD)

这最初是解决方案,但卸载和管理 SSL 证书增加了复杂性。

2019 年 3 月更新 - 部署了新的解决方案

如果有人感兴趣(基于查看此线程的次数并不多),最终部署的解决方案是:

  • 预配应用服务计划
  • 使用容器实例部署“API”应用服务以在端口 443 上托管 API。
  • 动态地址和标准 SSL 证书部署到“API”应用服务。
  • 使用容器实例部署“服务”应用服务以托管服务端口 80。
  • 部署到“服务”应用服务的静态地址和基于 IP 的 SSL 证书。这具有在服务上固定 IP 地址并满足我的“我需要静态 IP 地址”条件的效果。
  • 每月大约 65 英镑的费用来举办大约。

值得注意的是,部署证书的唯一原因是修复“服务”应用服务上的 IP 地址。它是一种解决当前 Azure 上缺乏支持以允许用户将静态 IP 地址应用于容器实例的解决方法。

在此处输入图像描述

2020 年 3 月更新

由于 20/03/20 引入了以下功能,3 月更新了帖子以供参考:

本文介绍了一种使用 Azure 应用程序网关公开容器组的静态公共 IP 地址的方法。如果需要在 Azure 容器实例中运行的面向外部的容器化应用的静态入口点,请按照以下步骤操作。

在本文中,您将使用 Azure CLI 为该场景创建资源:

  • Azure 虚拟网络
  • 部署在托管小型 Web 应用程序的虚拟网络(预览版)中的容器组
  • 具有公共前端 IP 地址的应用程序网关、在网关上托管网站的侦听器以及到后端容器组的路由

只要应用程序网关运行并且容器组在网络的委派子网中公开一个稳定的私有 IP 地址,就可以通过该公共 IP 地址访问容器组。

创建虚拟网络

az group create --name myResourceGroup --location eastus

使用 az network vnet create 命令创建虚拟网络。此命令在网络中创建 myAGSubnet 子网。

az network vnet create \
  --name myVNet \
  --resource-group myResourceGroup \
  --location eastus \
  --address-prefix 10.0.0.0/16 \
  --subnet-name myAGSubnet \
  --subnet-prefix 10.0.1.0/24

使用 az network vnet subnet create 命令为后端容器组创建子网。这里它被命名为 myACISubnet。

az network vnet subnet create \
  --name myACISubnet \
  --resource-group myResourceGroup \
  --vnet-name myVNet   \
  --address-prefix 10.0.2.0/24

使用 az network public-ip create 命令创建静态公共 IP 资源。在后面的步骤中,此地址被配置为应用程序网关的前端。

az group create --name myResourceGroup --location eastus

az network public-ip create \
  --resource-group myResourceGroup \
  --name myAGPublicIPAddress \
  --allocation-method Static \
  --sku Standard

创建容器组

运行以下 az container create 在上一步中配置的虚拟网络中创建容器组。

该组部署在 myACISubnet 子网中,并包含一个名为 appcontainer 的单个实例,用于拉取 aci-helloworld 映像。如文档中的其他文章所示,此图像打包了一个用 Node.js 编写的小型 Web 应用程序,该应用程序提供静态 HTML 页面。

az container create \
  --name appcontainer \
  --resource-group myResourceGroup \
  --image mcr.microsoft.com/azuredocs/aci-helloworld \
  --vnet myVNet \
  --subnet myACISubnet

成功部署后,将为容器组分配虚拟网络中的专用 IP 地址。例如,运行以下 az container show 命令来检索组的 IP 地址:

az container show \
  --name appcontainer --resource-group myResourceGroup \
  --query ipAddress.ip --output tsv

输出类似于:10.0.2.4。

为了在后面的步骤中使用,请将 IP 地址保存在环境变量中:

ACI_IP=$(az container show \
  --name appcontainer \
  --resource-group myResourceGroup \
  --query ipAddress.ip --output tsv)

创建应用网关

按照应用程序网关快速入门中的步骤在虚拟网络中创建应用程序网关。以下 az network application-gateway create 命令使用公共前端 IP 地址和到后端容器组的路由创建网关。有关网关设置的详细信息,请参阅应用程序网关文档。

az network application-gateway create \
  --name myAppGateway \
  --location eastus \
  --resource-group myResourceGroup \
  --capacity 2 \
  --sku Standard_v2 \
  --http-settings-protocol http \
  --public-ip-address myAGPublicIPAddress \
  --vnet-name myVNet \
  --subnet myAGSubnet \
  --servers "$ACI_IP" 

Azure 最多可能需要 15 分钟来创建应用程序网关。

测试公共 IP 地址 现在您可以测试对在应用程序网关后面的容器组中运行的 Web 应用程序的访问。

运行 az network public-ip show 命令以检索网关的前端公共 IP 地址:

az network public-ip show \
--resource-group myresourcegroup \
--name myAGPublicIPAddress \
--query [ipAddress] \
--output tsv

输出是一个公共 IP 地址,类似于:52.142.18.133。

要在成功配置后查看正在运行的 Web 应用程序,请在浏览器中导航到网关的公共 IP 地址。成功访问类似于:

显示在 Azure 容器实例中运行的应用程序的浏览器屏幕截图

参考 https://docs.microsoft.com/en-us/azure/container-instances/container-instances-application-gateway

2021 年 1 月

从 2020 年 7 月开始对本文进行最终编辑,您可以在其中在 Azure 防火墙后面的虚拟网络中设置容器组。您在防火墙上配置用户定义的路由和 NAT 和应用程序规则。通过使用此配置,可以为 Azure 容器实例的入口和出口设置单个静态 IP 地址。

https://docs.microsoft.com/en-us/azure/container-instances/container-instances-egress-ip-address

记录使用:

  • 容器组
  • 天蓝色防火墙
  • 保留公共IP
  • 路由流量

不利的一面是 Azure 防火墙资源的费用。除此之外,解决方案有效。

Azure 防火墙成本

于 2018-12-17T14:02:45.607 回答