为 Azure 容器实例部署分配静态 Public 地址

Assign Static Public Address to Azure Container Instance deployment

上下文

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

问题

我正在尝试隔离我的选项以将静态 public IP 地址分配给托管在 Azure 容器实例上的 TCP 服务。有哪些选项?

已测试

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

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

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

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

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

感谢您的任何建议。 斯科特

可能的解决方案

可能有解决办法:

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

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

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

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

明天将更新讨论结果。

2019 年 2 月更新

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

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

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

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

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

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

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

已部署解决方案

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

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

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

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

  • 提供应用程序服务计划
  • 已部署“API”应用服务,使用容器实例在端口 443 上托管 API。
  • 部署到“API”应用服务的动态地址和标准 SSL 证书。
  • 已部署“服务”应用服务,使用容器实例托管服务端口 80。
  • 部署到“服务”应用服务的静态地址和基于 IP 的 SSL 证书。这具有修复服务上的 IP 地址并满足我的“我需要一个静态 IP 地址”条件的效果。
  • 托管费用约为每月 65 英镑

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

2020 年 3 月更新

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

本文展示了一种使用 Azure 应用程序网关公开容器组的静态 public IP 地址的方法。当您需要面向外部的容器化应用程序的静态入口点时,请按照这些步骤操作,该应用程序 运行s 在 Azure 容器实例中。

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

  • 一个 Azure 虚拟网络
  • 部署在托管小型 Web 应用程序的虚拟网络(预览版)中的容器组
  • 一个应用程序网关 使用 public 前端 IP 地址,用于托管网站的侦听器 网关,以及到后端容器组的路由

只要应用网关运行s和容器组暴露一个稳定的 网络委托子网中的私有 IP 地址,可以通过此 public 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 命令创建静态 public 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 命令创建一个具有 public 前端 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 分钟。

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

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

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

输出是一个public IP地址,类似于:52.142.18.133.

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

显示应用程序 运行ning 在 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

文档的使用:

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

缺点是 Azure 防火墙资源的费用。除此之外,解决方案有效。