haproxy 负载均衡器无法访问 Podman rootful 容器

haproxy 负载均衡器无法访问 Podman rootful 容器

我在 podman 中创建了两个网络,“backend”和“frontend”。

NAME      VERSION  PLUGINS
podman    0.4.0    bridge,portmap,firewall,tuning
backend   0.4.0    bridge,portmap,firewall,dnsname
frontend  0.4.0    bridge,portmap,firewall,dnsname

我有一个在“后端”网络中运行的 MS Sql Server 容器,使用以下命令:

podman run -d -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=TestS01Pass' --name mssqlserver -v sqlvolume:/var/opt/mssql --network backend mcr.microsoft.com/mssql/server:2019-latest

我还有三个 .netcore Web 应用程序(productapp1、productapp2、productapp3),它们被分配给“后端”和“前端”网络。请参阅以下 dockerfile 的内容:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
COPY dist /app
WORKDIR /app
EXPOSE 80/tcp
ENTRYPOINT [ "dotnet", "DockerSample.dll" ]

这些是我用来创建它们的命令:

podman create --name productapp1 --network backend,frontend docker-sample
podman create --name productapp2 --network backend,frontend docker-sample
podman create --name productapp3 --network backend,frontend docker-sample

我还有一个 haproxy 容器,使用以下命令将其分配给“前端”网络:

podman run -d --name loadbalancer --network frontend --volume $(pwd)/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg -p 3000:80 --privileged haproxy:latest

haproxy的配置如下:

defaults
        timeout connect 5000
        timeout client 50000
        timeout server 50000
frontend localnodes
        bind *:80
        mode http
        default_backend mvc
        stats enable
        stats uri /stats
        stats refresh 1s

backend mvc
        mode http
        balance roundrobin
        server mvc1 productapp1:80
        server mvc2 productapp2:80
        server mvc3 productapp3:80

通过查看 Web 应用的日志,我可以确认它们按预期运行,没有任何问题。请参阅以下某个 Web 应用容器的日志:

warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
      Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
Applying Migrations...
Seed Data Not Required...
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /app

问题是当我导航到 http://localhost:3000 时,我收到 503 服务不可用消息。 (没有可用的服务器来处理此请求。)

我在其中一个 webapps 上运行了以下命令,并验证了 mssqlserver 的端口可以访问:

podman exec -it productapp1 /bin/nc -zvw3 mssqlserver 1433

结果是:

DNS fwd/rev mismatch: mssqlserver != mssqlserver.dns.podman
mssqlserver [10.89.1.55] 1433 (?) open

但是如果我对某个Web应用运行相同的命令:

podman exec -it productapp1 /bin/nc -zvw3 productapp2 80
podman exec -it productapp1 /bin/nc -zvw3 productapp2 5000

两者都返回连接被拒绝消息:

DNS fwd/rev mismatch: productapp2 != productapp2.dns.podman
productapp2 [10.89.1.57] 80 (?) : Connection refused

DNS fwd/rev mismatch: productapp2 != productapp2.dns.podman
productapp2 [10.89.1.57] 5000 (?) : Connection refused

我想知道是否有人可以阐明这一点,因为我已经搜索和阅读了很多内容,但却无法弄清楚为什么这么简单的事情不起作用。

非常感谢。

谢谢。

更新 1:我忘了说我也尝试过使用以下配置的 haproxy:

defaults
   timeout connect 5000
   timeout client 50000
   timeout server 50000
frontend localnodes
   bind *:80
   mode http
   default_backend mvc
   stats enable
   stats uri /stats
   stats refresh 1s
    
backend mvc
   mode http
   balance roundrobin
   server mvc1 productapp1:5000
   server mvc2 productapp2:5000
   server mvc3 productapp3:5000

更新 2:以下是我的launchSettings.json的内容

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:30113",
      "sslPort": 44371
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "DockerSample": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

我也尝试使用 -e ASPNETCORE_URLS=http://+:5000 创建容器,但仍然出现相同的错误。

更新 3:将 launchSettings.json 更新为:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:30113",
      "sslPort": 44371
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "DockerSample": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://+:5001;http://+:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

更新 4:在 Michael Hampton 的帮助下,我成功为我的 Web 应用容器打开了端口 5000。我的 Web 应用容器的日志现在如下所示:

warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
      Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://[::]:5000
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /app

我还可以从其他容器中通过 netcat 来访问这个端口:

DNS fwd/rev mismatch: productapp2 != productapp2.dns.podman
productapp2 [10.89.1.82] 5000 (?) open

现在我可以按预期导航到我的网络应用程序了。

答案1

您的日志显示该应用程序正在监听端口 5000,但您已将 haproxy 配置为尝试在端口 80 上连接它!这行不通。重新配置 haproxy 以连接到正确的端口。

        server mvc1 productapp1:5000
        server mvc2 productapp2:5000
        server mvc3 productapp3:5000

您的日志还显示 Web 应用程序仅监听本地主机,因此它只接受来自其自身容器的连接,而不接受来自 pod 中其他容器的连接。如何修复此问题取决于应用程序的具体情况。我想您应该查看Properties/launchSettings.json是否正在使用 ASP.NET Core 示例应用程序。

相关内容