我有一个 Windows azure Web 角色(Web api)云服务,到目前为止,端点 80 和 443 都暴露给外部负载均衡器。我有一个团队城市配置,用于构建项目并将生成的包部署到特定云服务的暂存环境。然后,我使用暂存环境来预热和测试部署,如果一切正常,我会在不停机的情况下交换云服务环境。典型的 Azure 云服务部署场景。
我现在想要实现的是使用内部负载均衡器从 Internet 隐藏 Web api 的两个端点,并使用将在单独的云服务中运行的反向代理 (nginx) 公开它们,该云服务将公开端口 80 和443. 问题是,如果在我的配置中我定义端点将在内部进行负载平衡,如下所示:
<Endpoints>
<InputEndpoint name="HttpIn" protocol="http" port="80" loadBalancer="apiILB" />
</Endpoints>
和
<LoadBalancers>
<LoadBalancer name="apiILB">
<FrontendIPConfiguration type="private" subnet="Subnet-1" staticVirtualNetworkIPAddress="10.0.1.111" />
</LoadBalancer>
</LoadBalancers>
我只能部署一次,因为它会创建一个内部负载均衡器来保存分配的 IP。因此,我使用 staging 进行测试、预热和交换的整个工作流程将不再有效。因此,如果我将其部署到 cloudservice1 生产环境,然后尝试在暂存环境中部署后一个版本,我会收到错误,即 ILB ip 已被占用(非常合理)并且无法部署。
解决方法 1: 不要为负载均衡器分配静态 IP,让它获得下一个可用的 IP。
问题:
如果我没有静态分配 ip,我不确定它是否会起作用,但这无济于事,因为我需要有一个静态 ip 分配给 nginx 反向代理以将请求转发到。
解决方法 2: 就地升级部署,从而覆盖以前的部署
问题:
就地升级部署将具有已知的缺点,例如无法在上线之前进行预热,可能会出现问题并且无法撤消等,因此不是一种选择。
解决方法 3: 通过在 teamcity 构建过程中更改 csfcg 文件来更改每个部署的静态 IP。
问题:
更改每个部署的静态 IP 听起来也是一个复杂的过程,它将隐藏在 teamcity 配置中,并且需要在每次新部署后手动更新 nginx 代理配置。
我在想我想要完成的场景非常普遍,应该有一种简洁的方式来使用反向代理和内部负载平衡的云服务进行持续部署,但我找不到任何文档/示例。