将 Nginx 和 Flask 容器化

6

我正在搭建一个 Flask/uwsgi 网络服务器。我还在思考微服务架构的问题:

我应该把 nginx 和 Flask 与 uwsgi 放在一个容器中,还是将它们放在两个不同的容器中并将它们链接起来?

我打算在 Kubernetes 集群中运行这些服务。

谢谢。


3个回答

5

简短回答:

我会将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

这意味着,如果您想添加更多的应用程序容器,您可以通过链接它们轻松地将它们附加到同一个ngnix代理。此外,如果您想升级基础设施中的某个部分(例如升级nginx或从apache转换到nginx),您只需重新构建相关容器,而让其余部分保持不变。
如果您将两个服务添加到一个容器中(例如通过从Dockerfile ENTRYPOINT启动supervisord进程),那么这将使您更轻松地选择使用socks文件而不是IP来进行nginx和uwsgi进程之间的通信,但我认为这本身并不足以将两者放在同一个容器中。
另外,请考虑一下,如果最终您运行了二十个微服务,每个微服务都运行各自的nginx实例,那么这意味着您现在需要跟踪二十个容器中的nginx(access.log/error.log)日志。
如果您正在使用"微服务"架构,那么随着时间的推移,您将不断添加更多的容器。在这样的生态系统中,将nginx作为单独的docker进程运行,并将微服务链接到它,使得它能够更容易地根据您不断扩大的需求而增长。
此外,有些任务只需要处理一次。例如,SSL终止可以在nginx容器中完成,只需一次配置适当的SSL证书,而不管连接到它的微服务数量是多少,如果nginx服务在其自己的容器上运行。
关于"服务发现"的注意事项
如果容器在同一主机上运行,则将所有容器链接在一起很容易。如果容器在多个主机上运行(使用Kubernetes或Docker swarm),则可能会变得更加复杂,因为您(或您的集群框架)需要能够将DNS地址链接到nginx实例,并且docker容器需要能够相互"找到",这增加了一些概念上的负担。Kubernetes通过将容器分组成pod、定义服务等来帮助您实现这一点。

你或许应该考虑现在使用网络而不是链接。但这仍然很棒 :) 我同意! - user2662833

1
Docker的理念是使用容器中的微服务。近年来,术语“微服务架构”被提出,用于描述一种将软件应用程序设计为一套独立可部署服务的特定方式。
也就是说,您可以在单独的容器中部署uwcgi,并从微服务架构中受益。
一些微服务架构的优点包括:
- 改进的故障隔离 - 消除对单个技术堆栈的长期承诺 - 更容易让新开发人员了解服务功能 - 更容易进行升级管理

1
如果您在Flask/uwsgi服务器前使用Nginx,则使用Nginx作为代理:它负责将流量转发到服务器,最终处理TLS加密、身份验证等等。
使用像Nginx这样的代理的目的是能够将流量均衡分配到服务器上:Nginx代理接收请求,并在多个服务器之间分配负载。
这意味着您需要一个Nginx实例和一个或多个Flask/usqgi服务器实例作为“上游”服务器。
要实现这一点,唯一的方法是使用单独的容器。
请注意,如果您在像AWS或GKE这样的云提供商上运行,该提供商提供负载均衡器将外部流量带入Kubernetes集群,并且如果您仅使用Nginx转发流量(即不使用它进行TLS或身份验证),则您可能根本不需要Nginx代理,而可以使用执行代理的服务。添加Nginx只会给您更多的控制权。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接