2016-11-21 41 views
4

我想知道是否有人拥有更大的大脑已经解决了这个问题。ServiceStack Docker体系结构

我有一个应用程序,其中每个客户在Azure中都有单独的webapp。它是一个带有ServiceStack的独立虚拟目录的Asp.net MVC。 MVC并未真正使用,该应用程序由ServiceStack提供99%的支持。

该架构工作正常,但随着我们获得更多的客户,我们必须管理越来越多的天蓝色的webapps。虽然我们可以忍受这一点,Container的世界也在我们身边,现在ServiceStack支持.net核心,我对部署数百个容器有着乌托邦的观点,并且对我的任何“租户”的每个请求都可以访问任何Container根据需要提供服务。

我想我已经制定了大部分如何重构所有元素,但是有一个架构位,我不能解决。

对于我们的客户来说,在任何其他客户之前“尝试”新功能或版本是他们合理的共同要求,因为他们正在帮助开发该功能。在每个虚拟机上由nginx容器(或其他东西)提供服务的多个虚拟机上有许多容器的世界中,如何控制请求到特定版本化容器的路由,而不需要使用nginx容器当路由需要改变时重新部署(或任何停机时间) - 例如, nginx能否根据Redis中的config路由请求?

任何意见/指针非常赞赏。

回答

2

虽然它是特定的Azure的不是我们所发布的一步一步的指导,发布ServiceStack .NET Core Docker Apps to Amazon EC2 Container Service,其中包括无接触nginx的虚拟主机管理由running an Instance of jwilder/nginx-proxy Docker App自动生成新的nginx的虚拟主机新部署的.NET核心Docker应用程序。

jwilder/nginx-proxy不是AWS特定的,应该适用于任何解释其在introductory blog post中的工作原理的Docker解决方案。

使用nginx-proxy是一个不错的独立于供应商的解决方案,用于在同一个nginx反向代理之后托管多个Docker实例,但是为了扩展Docker实例,您希望在首选云提供程序中使用编排功能。在AWS中,您可以缩放ECS群集中需要的number of compute instances或使用Auto Scaling,其中AWS将根据使用情况度量标准自动扩展实例。

Azure的用于管理Docker实例的解决方案是Azure Container Service,它允许您使用Azure acs command-line tool来缩放实例计数。

+0

谢谢 - 我读过这个;我不能解决的主要问题不在于SS,而在于如何将流量引导到版本化的Docker镜像。例如比如我在一个集群中有3个虚拟机,每个虚拟机都运行同一个应用的v1和v1的两个容器的8个容器。我将如何告诉nginx,当它接收到“myBetaTestingTenant.MyApp.com”的主机头时,将这些* only *路由到v1.1容器。 – Gumzle

+0

@Gumzle我们用不同的VIRTUAL_HOST环境变量构建Docker镜像,这是nginx用来将不同主机名代理到Docker实例的代理。但为了在不同的虚拟机之间实现负载平衡,您可以使用[Route 53或ELB解决方案](https://aws.amazon.com/blogs/compute/service-discovery-for-amazon-ecs-using-dns/)或者只是[路由53和DNS循环](https://www.loggly.com/blog/why-aws-route-53-over-elastic-load-balancing/)。 – mythz

+0

是的,我想我可以用正确的VIRTUAL_HOST变量部署更新的容器,以确保正确的容器获得正确的请求。只是为了将客户从一个版本转移到另一个版本而需要部署某些东西(尽管由于观看而导致“无停机时间”),这是一种耻辱。 – Gumzle

2

我们公司正在研究同样的事情。我们正在与kubernetes合作,并使用nodejs构建自己的反向代理。此反向代理会从特定缓存中读取客户设置并将您重定向到正确的环境。

但根据体系结构,我会建议只有两个环境运行,并且都有两个相关的URL:1个用于生产,1个用于试点/测试环境。每当客户进入试用环境网址时,他将使用相同的数据库,但只是WebApp的升级版本。

当然,如果使用ORM并包含数据库迁移,这将不起作用。 (这可能是你使用服务栈时的情况)