该代码可在 GitHub 上获得( https://github.com/PacktPublishing/Hands-On-Docker-for-Microservices-with-Python/tree/master/Chapter07/haproxy)。我们从 Docker Hub (https://hub.docker.com/_/haproxy /),添加我们自己的配置文件。
让我们看一下配置文件 haproxy.cfg 中的主要元素:
frontend haproxynode
bind *:80
mode http
default_backend backendnodes
backend backendnodes
balance roundrobin
option forwardfor
server aws a28320efca9e011e9969b0ae3722320e-357987887
.us-west-2.elb.amazonaws.com:80 check
server example www.example.com:80 check
listen stats
bind *:8001
stats enable
stats uri /
stats admin if TRUE
我们定义了一个前端,它接受任何到端口 80 的请求并将请求发送到后端。后端平衡对两个服务器的请求,example 和 aws。基本上,example 指向 www.example.com(旧服务的占位符),aws 指向之前创建的负载均衡器。
我们在端口 8001 中启用统计服务器并允许管理员访问。
docker-compose 配置启动服务器并将 localhost 端口转发到容器端口 8000(负载平衡器)和 8001(统计信息)。使用以下命令启动它:
$ docker-compose up --build proxy
...
现在我们可以访问 localhost:8000,这将在 thoughts 服务和 404 错误之间交替。
When calling
example.com this way, we are forwarding the host request. This means we send a request requesting
Host:localhost to
example.com, which returns a 404 error. Be sure to check on your service that the same host information is accepted by all the backends.
打开统计页面以检查设置:
检查后端节点中 aws 和 example 的条目。还有很多有趣的信息,比如请求数、最后一次连接、数据等等。
您可以在检查 example 后端时执行操作,然后在下拉菜单中将状态设置为 MAINT。应用后,example 后端处于维护模式并从负载平衡器中删除。统计页面如下:
现在访问 localhost:8000 中的负载均衡器只会返回 thoughts 前端。您可以重新启用后端,将其设置为 READY 状态。
有一种状态叫
DRAIN 将阻止新会话进入所选服务器,但现有会话将继续进行。这在某些配置中可能很有趣,但如果后端真的是无状态的,则直接移动到
MAINT 状态应该足够了。
HAProxy 也可以配置为使用检查来确保后端可用。我们在示例中添加了一个注释的,它发送一个 HTTP 命令来检查返回:
option httpchk HEAD / HTTP/1.1\r\nHost:\ example.com
校验对两个后端都是一样的,所以需要成功返回。默认情况下,它将每隔几秒钟运行一次。
您可以在 http://www.haproxy.org/ 查看完整的 HAProxy 文档。有很多细节可以配置。与您的团队跟进以确保超时、转发标头等区域的配置正确无误。
Kubernetes 中也使用了健康检查的概念,以确保 pod 和容器准备好接受请求并保持稳定。 我们将在下一节中了解如何确保正确部署新映像。