如何在负载均衡器后面配置 Docker 个容器?
How Do I Configure Docker Containers Behind A Load Balancer?
我的 IT 基础架构部门为我提供了以下设置:3 个虚拟机(vm01、vm02、vm03)前面的 netscaler 负载平衡器 (lb)。每个虚拟机都设置了 IIS。
我已经在所有三个虚拟机上安装了 Docker 引擎,并在所有 3 个虚拟机上复制了相同的 3 个容器(appcontainer1、appcontainer2、appcontainer3)。每个容器包含一个 .NET Core Web API 应用程序(api1、api2、api3)。
每个容器都配置为公开其端口 80 以访问 api,并映射到它所在的虚拟机上的一个端口 运行ning。换句话说,appcontainer1 是 运行 和 docker run -p 8091:80 .
,appcontainer2 是 运行 和 docker run -p 8092:80 .
,appcontainer3 是 运行 和 docker run -p 8093:80 .
.
我 运行 遇到的问题是如何从客户端计算机调用我的 Web 应用程序。例如,如果我想在 vm01 上直接调用 ap1,我会调用 vm01.domain.com:8091,但如何调用 lb.domain.com:8091 并在其中一台虚拟机上正确解析?
一张粗略地拼凑的情况图:
- 我是否将 netscaler 负载平衡器配置为反向代理并将端口转发到虚拟机?
- 我是否为每个应用程序配置单独的 DNS 条目(ap1.domain.com、ap2.domain.com、api3.domain.com)并在每个虚拟机上配置 IIS(或 nginx 或 Apache)以解析到合适的端口?
- 有没有办法配置 Docker 来执行此操作?
- 我是不是做错了,想太多了?
- 我应该改用某种容器编排吗?
- 有没有一种明智的方法可以在不打扰基础设施团队重新配置一切的情况下做到这一点?
您需要将每个 VM 上的每个 IIS 设置为带有 ARR(应用程序请求路由)模块的反向代理。在此过程中,您可能会使用一些技巧(您好,Microsoft)。不过,我不能在负载平衡器上说什么。不过,将其配置为在机器上平均分配负载应该不难。您只需告诉 LB 以循环方式将对 lb.domain.com:XXXX 的任何调用定向到其中一个 VM。您 - 可能 - 也可以改变端口,这样您就可以将流量分布在 3VM x3containers = 9 个容器中。
但是,建议不要在网络上暴露 Kestrel 服务器。相反,把它放在 IIS 或其他什么后面。要将 IIS 配置为反向代理,您可以构建 3 个站点并以最少的配置将它们绑定到相应的端口,或者使用一个使用 IIS 的站点并使用重写规则解析传入请求。老实说,IIS 很难与 docker 一起使用。
但是 我实际推荐的是如果您的 OS 支持 swarm 并为每个 VM 公开一个端口,则使用它。它们是以下之一:
- WS2019,
- WS2016 1709 更新或更高版本(这些没有 GUI)
- Windows 10 1709更新.
Swarm 在 Windows 中仍然存在问题:/ 此外,它还有涉及 "localhost:PORT" 和其他东西的看似随机的错误,非常令人沮丧。例如,我无法使用 localhost:PORT 组合访问我的服务器(WS2016,1709 之前)上的容器。我的开发机器(最新的 Win10)也是如此,最近才成为一个问题。在 "something" 发生并且它停止工作之前很好。
如果您对使用哪个代理很灵活,我建议您看一下 nginx、Kubernetes,如果您在实验方面 traefik,那可以让您在不使用容器编排工具(即 swarm)的情况下逃脱
我的 IT 基础架构部门为我提供了以下设置:3 个虚拟机(vm01、vm02、vm03)前面的 netscaler 负载平衡器 (lb)。每个虚拟机都设置了 IIS。
我已经在所有三个虚拟机上安装了 Docker 引擎,并在所有 3 个虚拟机上复制了相同的 3 个容器(appcontainer1、appcontainer2、appcontainer3)。每个容器包含一个 .NET Core Web API 应用程序(api1、api2、api3)。
每个容器都配置为公开其端口 80 以访问 api,并映射到它所在的虚拟机上的一个端口 运行ning。换句话说,appcontainer1 是 运行 和 docker run -p 8091:80 .
,appcontainer2 是 运行 和 docker run -p 8092:80 .
,appcontainer3 是 运行 和 docker run -p 8093:80 .
.
我 运行 遇到的问题是如何从客户端计算机调用我的 Web 应用程序。例如,如果我想在 vm01 上直接调用 ap1,我会调用 vm01.domain.com:8091,但如何调用 lb.domain.com:8091 并在其中一台虚拟机上正确解析?
一张粗略地拼凑的情况图:
- 我是否将 netscaler 负载平衡器配置为反向代理并将端口转发到虚拟机?
- 我是否为每个应用程序配置单独的 DNS 条目(ap1.domain.com、ap2.domain.com、api3.domain.com)并在每个虚拟机上配置 IIS(或 nginx 或 Apache)以解析到合适的端口?
- 有没有办法配置 Docker 来执行此操作?
- 我是不是做错了,想太多了?
- 我应该改用某种容器编排吗?
- 有没有一种明智的方法可以在不打扰基础设施团队重新配置一切的情况下做到这一点?
您需要将每个 VM 上的每个 IIS 设置为带有 ARR(应用程序请求路由)模块的反向代理。在此过程中,您可能会使用一些技巧(您好,Microsoft)。不过,我不能在负载平衡器上说什么。不过,将其配置为在机器上平均分配负载应该不难。您只需告诉 LB 以循环方式将对 lb.domain.com:XXXX 的任何调用定向到其中一个 VM。您 - 可能 - 也可以改变端口,这样您就可以将流量分布在 3VM x3containers = 9 个容器中。
但是,建议不要在网络上暴露 Kestrel 服务器。相反,把它放在 IIS 或其他什么后面。要将 IIS 配置为反向代理,您可以构建 3 个站点并以最少的配置将它们绑定到相应的端口,或者使用一个使用 IIS 的站点并使用重写规则解析传入请求。老实说,IIS 很难与 docker 一起使用。
但是 我实际推荐的是如果您的 OS 支持 swarm 并为每个 VM 公开一个端口,则使用它。它们是以下之一:
- WS2019,
- WS2016 1709 更新或更高版本(这些没有 GUI)
- Windows 10 1709更新.
Swarm 在 Windows 中仍然存在问题:/ 此外,它还有涉及 "localhost:PORT" 和其他东西的看似随机的错误,非常令人沮丧。例如,我无法使用 localhost:PORT 组合访问我的服务器(WS2016,1709 之前)上的容器。我的开发机器(最新的 Win10)也是如此,最近才成为一个问题。在 "something" 发生并且它停止工作之前很好。
如果您对使用哪个代理很灵活,我建议您看一下 nginx、Kubernetes,如果您在实验方面 traefik,那可以让您在不使用容器编排工具(即 swarm)的情况下逃脱