Haproxy 容器无法访问后端服务器 - 获取“后端‘服务器’没有可用服务器!”错误

问题描述 投票:0回答:0

我有一个设置,我在容器化环境中使用 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
我有三个目录:

  • 容器文件
    • 应用容器文件
    • HAProxyContainer文件
  • 数据
  • haproxy
    • haproxy.cfg
    • haproxy.sock

现在

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
,我可以看到我的服务器处于绿色/已检查/正在运行状态。但是现在不行了。

haproxy podman
© www.soinside.com 2019 - 2024. All rights reserved.