我正在建立一个Flask / uswgi网络服务器.我仍然想知道微服务架构:
我应该将带有uwsgi的Nginx和Flask放在一个容器中,还是将它们放在两个不同的容器中并将它们连接起来?
我打算在Kubernetes集群中运行这些服务.
谢谢
我会将Nginx和uwsgi / flask应用程序部署为单独的容器.这为您提供了一种更灵活的体系结构,允许您将更多微服务容器链接到Nginx实例,因为您对更多服务的需求增长.
说明:
使用docker,通常的策略是将Nginx服务和uwsgi / flask服务拆分为两个单独的容器.然后,您可以使用链接链接它们.这是docker世界中常见的架构哲学.像docker-compose这样的工具简化了运行多个容器和在它们之间形成链接的管理.以下docker-compose配置文件显示了以下示例:
version: '2'
services:
app:
image: flask_app:latest
volumes:
- /etc/app.cfg:/etc/app.cfg:ro
expose:
- "8090"
http_proxy:
image: "Nginx:stable"
expose:
- "80"
ports:
- "80:8090"
volumes:
- /etc/app_Nginx/conf.d/:/etc/Nginx/conf.d/:ro
links:
- app:app
这意味着如果要添加更多应用程序容器,可以通过链接将它们轻松地附加到同一个ngnix代理.此外,如果您想要升级基础架构的一部分,比如升级Nginx,或者从apache转换到Nginx,那么您只需重新构建相关容器,并将所有其余容器留在该位置.
如果要将两个服务添加到单个容器中(例如,通过从Dockerfile ENTRYPOINT启动supervisord进程),这将允许您使用socks文件而不是IP更容易地选择Nginx和uwsgi进程之间的通信,但是我不认为这本身就是一个足够强大的理由将两者放在同一个容器中.
另外,考虑一下最终你是否最终运行了20个微服务并且每个都运行着每个自己的Nginx实例,这意味着你现在有20组Nginx(access.log / error.log)日志来跟踪20个容器.
如果您使用“微服务”架构,这意味着随着时间的推移,您将添加越来越多的容器.在这样的生态系统中,将Nginx作为单独的docker进程运行并将微服务链接到它,可以更容易地根据您不断扩展的需求进行扩展.
关于服务发现的说明
如果容器在同一主机中运行,则链接所有容器很容易.如果容器在多个主机上运行,使用Kubernetes或Docker swarm,那么事情可能会变得有点复杂,因为您(或您的集群框架)需要能够将您的DNS地址链接到您的Nginx实例和docker容器需要能够“找到”彼此 – 这增加了一点概念开销. Kubernetes通过将容器分组到pod,定义服务等来帮助您实现这一目标.