我对Docker swarm模式下的副本有点困惑。
假设我们有一个管理器,它运行一个Web服务(*contained命令 * 是一个HTTP服务器)和几个副本。换句话说,存在多个任务(即,容器),每个容器在无限循环中运行HTTP服务器以等待入站请求。
现在,浏览器沿着并访问主机名和端口(例如http://localhost:3000)。
问题:哪个容器向浏览器提供HTTP文件?
Rolling updates:我特别希望在滚动更新的背景下理解上述内容。如果我们有一个服务的多个副本在多个容器上运行,并且服务是通过逐渐将服务推出到每个容器来更新的,那么我们如何知道浏览器看到的是旧容器还是新容器?
1条答案
按热度按时间vltsax251#
Docker Swarm具有内置的负载均衡器,可以将您希望在外部提供给Swarm的服务公开。所以你不是直接调用容器而是调用负载均衡器。Swarm有一个内部DNS组件,它会自动为Swarm中的每个服务分配一个DNS条目,然后使用内部负载平衡器根据服务的DNS名称在集群内的服务之间分发请求。
因此,负载均衡器接收请求并将它们分派到容器。在多个副本的情况下,负载均衡器是负责使用一个容器或另一个容器的组件。请参阅官方文档了解更多详细信息。
如果您愿意,可以将外部负载均衡器添加到swarm(https://docs.docker.com/engine/swarm/ingress/#configure-an-external-load-balancer)。
关于滚动更新,这是一种优雅地部署新版本并最小化应用程序停机时间的方法。在Swarm中,滚动更新使用一个名为Parallelism的选项,该选项指示要同时更新的服务任务的数量:
和一个名为“更新顺序”的选项:
假设先停止,在滚动更新期间,首先服务将与负载均衡器断开连接,然后替换为服务的新版本。
在内部,Docker守护进程发送一个
SIGTERM
信号来告诉服务停止,并在调用SIGKILL
信号并杀死服务之前发送一个称为stop-grace-period
的时间选项。如果您的连接没有按时完成,服务将在stop-grace-period
(默认10 s)之后重新启动,并且您将遇到一个需要在应用程序端处理的错误。