在CentOS 7上使用Docker Swarm(CE)进行粘性会话
使用其他系统?简介Docker Swarm将您的单个服务器转变为计算机集群,从而促进扩展,高可用性和扩展性。
Docker Swarm将您的单个服务器变成计算机集群;便于扩展,高可用性和负载平衡。Swarm负载均衡器实现了循环负载均衡策略,这可能会干扰(旧式)有状态应用程序的正常运行,这些应用程序需要某种形式的粘性会话以允许具有多个实例的高可用性设置。Docker Enterprise Edition支持Layer-7粘性会话,但是在本指南中,我们将重点介绍免费(CE)版本的Docker。为了实现粘性会话,我们将使用Traefik。
sudo
权限的非root用户(可选,但强烈建议不要使用root用户)在本教程中,我们将使用两个具有私有IP地址192.168.0.100
和的Vultr实例192.168.0.101
。它们都是Docker Swarm管理器节点(这对于生产而言并不理想,但对于本教程来说足够了)。
本教程将jwilder/whoami
docker映像用作演示应用程序。这个简单的容器将使用响应容器的名称来响应REST调用,从而非常容易测试粘性会话是否正常工作。该图像显然仅用于演示目的,需要用您自己的应用程序的图像替换。
whoami服务的配置如下:
sudo docker network create whoaminet -d overlay
sudo docker service create --name whoami-service --mode global --network whoaminet --publish "80:8000" jwilder/whoami
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
如果随后curl
在的whoami REST端点http://192.168.0.100/
,我们可以看到Docker Swarm的循环负载均衡工作:
curl http://192.168.0.100
I'm a6a8c9294fc3
curl http://192.168.0.100
I'm ae9d1763b4ad
curl http://192.168.0.100
I'm a6a8c9294fc3
curl http://192.168.0.100
I'm ae9d1763b4ad
curl http://192.168.0.100
I'm a6a8c9294fc3
在现代浏览器(例如Chrome或Firefox)上进行测试是没有用的,因为它们旨在保持连接畅通无阻,并且Docker Swarm负载平衡器只会在每次新连接时切换到另一个容器。如果要使用浏览器进行测试,则必须等待至少30秒才能关闭连接,然后再次刷新。
Traefik本机支持Docker Swarm,它可以即时检测和注册或注销容器,并通过内部覆盖网络与您的应用程序通信。在开始处理对应用程序的请求之前,Traefik需要一些有关您的应用程序的信息。通过在Swarm服务中添加标签,可以将这些信息提供给Traefik:
sudo docker service update --label-add "traefik.docker.network=whoaminet" --label-add "traefik.port=8000" --label-add "traefik.frontend.rule=PathPrefix:/" --label-add "traefik.backend.loadbalancer.stickiness=true" whoami-service
以下列表描述了每个标签的含义:
traefik.docker.network
:Docker覆盖网络,Traefik将通过该网络与您的服务进行通信 traefik.port
:您的服务正在侦听的端口(这是内部公开的端口,而不是已发布的端口)traefik.frontend.rule
:PathPrefix:/
将上下文根“ /
” 绑定到此服务traefik.backend.loadbalancer.stickiness
:为此服务启用粘性会话现在whoami-service
已经为标记了必需的标签,我们可以将Traefik服务添加到群组:
sudo docker service create --name traefik -p8080:80 -p9090:8080 --mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock --mode=global --constraint 'node.role == manager' --network whoaminet traefik --docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG
此命令一次执行很多操作,如以下列表所示:
--name traefik
:我们新的Docker服务的名称为Traefik -p8080:80
:我们将Traefik的端口发布80
到端口,8080
因为80
我们的whoami服务已在使用该端口-p9090:8080
:我们将Traefik自己的Web界面发布到port 9090
--mount ...
:我们将Docker套接字安装到容器中,以便Traefik可以访问主机的Docker运行时 --global
:出于高可用性的原因,我们希望在每个管理器节点上使用Traefik容器 --constraint 'node.role == manager'
:我们只希望Traefik在管理者节点上运行,因为工作节点无法为Traefik提供所需的信息。例如,docker service ls
在工作节点上不起作用,因此Traefik甚至无法发现正在运行的服务--network whoaminet
:将Traefik连接到与我们相同的网络whoami-service
,否则无法连接。我们之前曾告诉Traefik使用该traefik.docker.network
标签通过此网络连接到我们的服务traefik
:告诉Docker为此服务使用最新的Traefik Docker映像--docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG
:命令行参数直接传递给Traefik,以使其可以在Docker群模式下运行。DEBUG
在这里是可选的,但是在设置过程中和本教程中都很有趣剩下要做的就是在Debian防火墙中打开必要的端口:
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 9090 -j ACCEPT
Traefik启动后,您会在日志中看到Traefik发现了两个whoami
容器。它还输出用于处理粘性会话的cookie名称:
time="2018-11-25T13:17:30Z" level=debug msg="Configuration received from provider docker: {\"backends\":{\"backend-whoami-service\":{\"servers\":{\"server-whoami-service-1-a179b2e38a607b1127e5537c2e614b05\":{\"url\":\"http://10.0.0.5:8000\",\"weight\":1},\"server-whoami-service-2-df8a622478a5a709fcb23c50e689b5b6\":{\"url\":\"http://10.0.0.4:8000\",\"weight\":1}},\"loadBalancer\":{\"method\":\"wrr\",\"stickiness\":{}}}},\"frontends\":{\"frontend-PathPrefix-0\":{\"entryPoints\":[\"http\"],\"backend\":\"backend-whoami-service\",\"routes\":{\"route-frontend-PathPrefix-0\":{\"rule\":\"PathPrefix:/\"}},\"passHostHeader\":true,\"priority\":0,\"basicAuth\":null}}}"
time="2018-11-25T13:17:30Z" level=debug msg="Wiring frontend frontend-PathPrefix-0 to entryPoint http"
time="2018-11-25T13:17:30Z" level=debug msg="Creating backend backend-whoami-service"
time="2018-11-25T13:17:30Z" level=debug msg="Adding TLSClientHeaders middleware for frontend frontend-PathPrefix-0"
time="2018-11-25T13:17:30Z" level=debug msg="Creating load-balancer wrr"
time="2018-11-25T13:17:30Z" level=debug msg="Sticky session with cookie _a49bc"
time="2018-11-25T13:17:30Z" level=debug msg="Creating server server-whoami-service-1-a179b2e38a607b1127e5537c2e614b05 at http://10.0.0.5:8000 with weight 1"
time="2018-11-25T13:17:30Z" level=debug msg="Creating server server-whoami-service-2-df8a622478a5a709fcb23c50e689b5b6 at http://10.0.0.4:8000 with weight 1"
time="2018-11-25T13:17:30Z" level=debug msg="Creating route route-frontend-PathPrefix-0 PathPrefix:/"
time="2018-11-25T13:17:30Z" level=info msg="Server configuration reloaded on :80"
time="2018-11-25T13:17:30Z" level=info msg="Server configuration reloaded on :8080"
如果我们弯腰,http://192.168.0.100:8080
我们可以看到_a49bc
已经设置了一个新的cookie :
curl -v http://192.168.0.100:8080
* About to connect() to 192.168.0.100 port 8080 (#0)
* Trying 192.168.0.100...
* Connected to 192.168.0.100 (192.168.0.100) port 8080 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.0.100:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 17
< Content-Type: text/plain; charset=utf-8
< Date: Sun, 25 Nov 2018 13:18:40 GMT
< Set-Cookie: _a49bc=http://10.0.0.5:8000; Path=/
<
I'm a6a8c9294fc3
* Connection #0 to host 192.168.0.100 left intact
如果在随后的调用中将此Cookie发送给Traefik,我们将始终转发到同一容器:
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
Cookie除了Traefik应发送到请求的容器的内部IP地址外,不包含任何其他内容。如果将cookie值更改为http://10.0.0.4:8000
,则该请求将有效地转发到另一个容器。如果永远不要将cookie发送给Traefik,则粘性会话将无法工作,并且应用程序的容器和Traefik容器之间的请求将得到平衡。
这就是在Debian 9上的Docker CE中设置第7层粘性会话所需的一切。
使用其他系统?简介Docker Swarm将您的单个服务器转变为计算机集群,从而促进扩展,高可用性和扩展性。
Rancher OS是围绕Docker构建的非常轻量级的Linux发行版。操作系统本身的重量约为20MB。本教程将帮助您入门和运行
借助Vultr Docker应用程序,您可以轻松地在Vultr服务器实例上部署Docker。同时,您可以方便地进行Docker管理任务
简介Docker是一个应用程序,可让我们部署作为容器运行的程序。它是用流行的Go编程语言编写的
概述RancherOS是一个非常轻量级的操作系统(仅约60 MB),它以PID 0作为运行系统服务的方式运行系统Docker守护程序。
我们都知道并喜欢Docker,这是一个在多台机器上创建,管理和分发应用程序容器的平台。Docker Inc.提供服务
使用其他系统?简介Docker是一个允许在虚拟容器内部署软件的应用程序。它写在G
LXC容器(Linux容器)是Linux中的一种操作系统功能,可用于在单个主机上运行多个隔离的Linux系统。塞斯
本教程介绍了Docker入门的基础知识。我假设您已经安装了Docker。本教程中的步骤将适用于
本文将向您展示如何在Docker容器中部署Node应用程序。注意:本教程假定您已安装Docker并已阅读
在运行Web应用程序时,通常希望充分利用资源,而不必转换软件以使用多线程处理程序。
使用其他系统?简介Rancher是一个用于运行容器和构建私有容器服务的开源平台。牧场主是基地
Kubernetes是Google开发的开放源代码平台,用于跨服务器集群管理容器化应用程序。它以十年为基础
简介本指南将向您展示如何使用多个Alpine Linux 3.9.0服务器和Portainer创建和配置Docker群。请注意
Harbor是一个开放源代码的企业级注册服务器,用于存储和分发Docker映像。Harbor扩展了开源Docker Distribution b
概述本文旨在帮助您立即建立Kubernetes集群并使用kubeadm运行。本指南将在以下位置部署两台服务器
前提条件Docker引擎1.8+。至少4GB的磁盘空间。至少4GB的RAM。步骤1.安装Docker为了安装SQL-Server,Docker mus
使用其他系统?Docker是一个允许部署作为容器运行的程序的应用程序。它是用流行的Go程序编写的
PHP应用程序通常由Web服务器,关系数据库系统和语言解释器本身组成。在本教程中,我们将继续学习
勒索軟件攻擊呈上升趨勢,但人工智能能否幫助應對最新的計算機病毒?AI 是答案嗎?在這裡閱讀知道是 AI 布恩還是禍根
ReactOS,一個開源和免費的操作系統,這裡有最新版本。它能否滿足現代 Windows 用戶的需求並打倒微軟?讓我們更多地了解這種老式但更新的操作系統體驗。
Whatsapp 終於為 Mac 和 Windows 用戶推出了桌面應用程序。現在您可以輕鬆地從 Windows 或 Mac 訪問 Whatsapp。適用於 Windows 8+ 和 Mac OS 10.9+
閱讀本文以了解人工智能如何在小型公司中變得流行,以及它如何增加使它們成長並為競爭對手提供優勢的可能性。
最近,Apple 發布了 macOS Catalina 10.15.4 補充更新以修復問題,但似乎該更新引起了更多問題,導致 mac 機器變磚。閱讀這篇文章以了解更多信息
大數據的13個商業數據提取工具
我們的計算機以稱為日誌文件系統的有組織的方式存儲所有數據。這是一種有效的方法,可以讓計算機在您點擊搜索時立即搜索和顯示文件。 https://wethegeek.com/?p=94116&preview=true
隨著科學的快速發展,接管了我們的大量工作,我們陷入無法解釋的奇點的風險也在增加。閱讀,奇點對我們意味著什麼。
洞察 26 種大數據分析技術:第 1 部分
過去幾十年,醫療保健領域的人工智能取得了巨大飛躍。因此,醫療保健中人工智能的未來仍在日益增長。