azure - 将静态公共(public)地址分配给Azure容器实例部署

标签 azure containers azure-application-gateway azure-traffic-manager azure-load-balancer

语境
正在处理一个项目,以将一个 Restful API应用程序和单独的TCP服务部署到Azure容器实例。由于遗留原因,TCP服务需要一个静态Ipv4地址。
ContextDiagram
问题
我试图隔离我的选项,以将静态静态IP地址分配给Azure容器实例上托管的TCP服务。有什么选择 ?
经过测试

  • 具有静态公共(public)IP地址的已部署Azure应用程序网关。 App Gateway允许将后端池定向到IP或FQDN端点。这似乎是可操作的(请参见图)。后端池中的所有选项似乎都只允许HTTP和HTTPS,而不允许自定义端口。如果TCP服务可以监听80和Web API监听443,则可以对此进行操作。应用程序网关是仅用于HTTP和HTTPS流量的第7层资源。
  • Azure负载平衡器。只能针对VM,可用性集或VM缩放集。
  • 为资源分配静态地址。不允许用于容器实例。
  • 交通管理器。似乎不是此部署的正确资源类型。

  • 参见图。当我通过BASH session 查询时,API和TCP SERVICE的容器实例具有相同的专用IP地址。建议将它们托管在附图中的同一主机(称为“容器组”)上。不知道这是不是正确的标签,对不起,我是Container tech的新手。
    感谢您的任何建议。
    史考特

    最佳答案

    可能的解决方案
    可能有解决方案:

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

    现在,防火墙“规则”允许以下操作:
  • NAT规则-典型的端口转换
  • 网络规则-路由地址
  • 应用规则-路由FQDN

  • 致力于将容器部署到此dev子网,表面上所有选项都存在,重定向端口,ip或FQDN。游戏的变化是能够为VNET中的资源分配静态公共(public)地址,并允许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
    解决方案已部署
  • 使用Azure镜像创建的Ubuntu VM
  • 分配给虚拟机的静态公共(public)地址
  • 将api和Service部署在docker镜像中到VM
  • 用于部署的Arm模板,与DevOps构建和发布
  • 集成
  • 每月费用£23.52(核心:2,3GB ram,16GB HD)

  • 这最初是解决方案,但卸载和管理SSL证书增加了复杂性。
    2019年3月更新-已部署新解决方案
    如果有人感兴趣(基于查看该线程的次数而并不多),则最终部署的解决方案是:
  • 提供应用服务计划
  • 使用容器实例在端口443上托管API的已部署“API”应用程序服务。
  • 部署到“API”应用程序服务的动态地址和标准SSL证书。
  • 使用容器实例托管服务端口80部署的“服务”应用程序服务。
  • 部署到“服务”应用程序服务的静态地址和基于IP的SSL证书。这具有将IP地址固定在服务上并满足我的“我需要静态IP地址”条件的效果。
  • 每月花费约65英镑来托管大约10,000英镑。

  • 值得注意的是,部署证书的唯一原因是要修复“服务”应用程序服务上的IP地址。解决当前缺少对Azure的支持以允许用户将静态IP地址应用于容器实例的方法。
    enter image description here
    2020年3月更新
    由于引入了以下功能20/03/20,该帖子于3月更新,以供引用:
    本文介绍了一种使用Azure应用程序网关公开容器组的静态公共(public)IP地址的方法。当您需要在Azure容器实例中运行的面向外部的容器化应用程序的静态入口点时,请执行以下步骤。
    在本文中,您将使用Azure CLI为这种情况创建资源:
  • 一个Azure虚拟网络
  • 在虚拟网络中部署的容器组(预览),承载一个小型Web应用程序
  • 应用程序网关
    带有公共(public)前端IP地址的监听器,可在以下位置托管网站
    网关,以及到后端容器组
  • 的路由

    只要应用程序网关运行并且容器组公开一个稳定的
    网络的委托(delegate)子网中的私有(private)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容器创建,以在上一步中配置的虚拟网络中创建一个容器组。
    该组部署在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容器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地址和到后端容器组的路由创建网关。有关网关设置的详细信息,请参见Application Gateway文档。
    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分钟才能创建应用程序网关。
    测试公共(public)IP地址
    现在,您可以测试对在应用程序网关后面的容器组中运行的Web应用程序的访问权限。
    运行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。
    要在成功配置后查看正在运行的Web应用程序,请在浏览器中导航到网关的公共(public)IP地址。成功访问类似于:
    浏览器屏幕截图显示了在Azure容器实例中运行的应用程序
    引用
    https://docs.microsoft.com/en-us/azure/container-instances/container-instances-application-gateway
    2021年1月
    从2020年7月开始对本文进行最终编辑以记录本文,您可以在其中在Azure防火墙后面的虚拟网络中设置容器组。您可以在防火墙上配置用户定义的路由以及NAT和应用程序规则。通过使用此配置,您可以设置单个静态IP地址,以用于从Azure容器实例的入口和导出。
    https://docs.microsoft.com/en-us/azure/container-instances/container-instances-egress-ip-address
    记录以下用途:
  • 容器组
  • azure 防火墙
  • 保留公共(public)IP
  • 路由流量

  • 不利的一面是Azure防火墙资源的开销。除此以外,解决方案有效。
    Azure Firewall Cost

    关于azure - 将静态公共(public)地址分配给Azure容器实例部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53815807/

    相关文章:

    sql-server - 为 Azure SQL 池创建主 key 时出现问题 - 权限错误

    javascript - 从 Javascript 调用 ASP.NET C# Controller 方法

    java - Apache Karaf 是否处理任何 JAR 或 WAR 的热部署?

    C++ 文件内存映射容器类似于 std::vector/boost::array

    azure - 对 Kubernetes 的 Azure 应用程序网关入口中的规则优先级配置进行故障排除

    具有内部 API 管理 503 后端服务器错误的 Azure 应用程序网关

    Azure 应用程序网关在来自 APIGEE 时对请求正文进行 strip 化

    azure - Kubernetes CronJob 公共(public) IP

    azure - Terraform - AKS POD 应该能够添加和删除外部 DNS 记录

    容器或不同虚拟机中的 Mysql