我有一个设置,我在容器化环境中使用 Haproxy 作为负载均衡器。 Haproxy 容器负责将流量路由到后端服务器,该服务器也在单独的容器中运行。这个设置已经完美运行了两个多星期,但是突然之间,没有做任何更改,Haproxy 容器无法连接到后端服务器。
haproxy.cfg:
global
user haproxy
group haproxy
stats socket /var/run/haproxy.sock mode 660 level admin expose-fd listeners
daemon
defaults
timeout connect 10s
timeout client 40s
timeout tarpit 1m
timeout server 120s
frontend app
mode http
bind *:80
default_backend servers
backend servers
mode http
balance leastconn
server app-001 app-001:5000 check
listen stats
bind *:9999
mode http
stats enable
stats uri /stats
stats hide-version
容器使用以下命令启动:
podman run -d --rm --name app-001 --network my-network -v /path/dst/data:/data app-image
podman run -d --name haproxy-container --network my-network -p 80:80 -p 9999:9999 -v /path/dst/haproxy:/usr/local/etc/haproxy haproxy-image
在
haproxy
文件夹中有两个文件,haproxy.cfg
和一个haproxy.sock
文件。现在唯一可能有用的缺失信息是容器镜像。由于 app-001
图像本身运行良好,我将只分享 haproxy-container 的图像,即:
FROM docker.io/haproxytech/haproxy-alpine:latest
RUN touch /var/run/haproxy.sock && apk add socat && apk add curl
运行
podman logs haproxy-container
给出以下输出:
[通知] (1): New worker (3) forked
[NOTICE] (1): Loading success.
[WARNING] (3): Server servers/app-001 is DOWN, reason: Layer4 timeout, 检查持续时间:2003ms。剩余 0 个活动服务器和 0 个备用服务器。 0 会话 活跃,0 重新排队,0 留在队列中。
[警报] (3):后端“服务器”没有可用的服务器!'
采取的步骤:
验证后端服务器(app-001)正在运行并且可以独立访问。
检查了 Haproxy 容器和 app-001 容器的网络设置,它们似乎在同一个 podman 网络中正确配置。
尝试从 Haproxy 容器内 ping app-001 服务器 IP 地址,但导致 100% 丢包。
检查了 haproxy.cfg 文件是否有任何错误配置,但它似乎是正确的。
求助,想了解Haproxy容器突然无法访问后端服务器的原因,以及如何解决这个问题。我已经尝试了上述步骤,但都没有产生解决方案。
在我当前目录
dst
我有三个目录:
现在
HaproxyContainerfile
在上面给出,AppContainerfile
由以下给出:
FROM alpine
RUN apk update && apk add python3 && python -m ensurepip --upgrade && pip3 install Flask Flask_RESTful && mkdir data
COPY test_app.py .
CMD ["python","-m","test_app"]
现在
test_app.py
文件中的代码为:
from flask import Flask
from flask_restful import Resource, Api
from pathlib import Path
app = Flask(__name__)
api = Api(app)
data_path = Path.cwd() / 'data'
class Endpoint(Resource):
def get(self):
return list(map(lambda f: str(f.name), data_path.iterdir()))
api.add_resource(Endpoint, '/')
if __name__ == '__main__':
app.run(host='0.0.0.0')
data
目录可以填充一些空文件或只是留空。并且 haproxy.cfg
文件如上所示,而 haproxy.sock
文件是空的,但需要在那里将服务器动态添加到 haproxy(在项目的后面)。否,通过执行以下 podman 命令:
podman build -f Containerfiles/AppContainerfile -t app-image
podman build -f Containerfiles/HaproxyContainerfile -t haproxy-image
podman network create my-network
podman run -d --rm --name app-001 --network my-network -v /path/dst/data:/data app-image
podman run -d --name haproxy-container --network my-network -p 80:80 -p 9999:9999 -v /path/dst/haproxy:/usr/local/etc/haproxy haproxy-image
过去一切都很好,我可以请求移植
:80
,它会由app-001
通过我的haproxy容器提供服务。此外,通过转到http://localhost:9999/stats
,我可以看到我的服务器处于绿色/已检查/正在运行状态。但是现在不行了。