Корневые контейнеры Podman, недоступные для haproxy loadbalancer

Я создал две сети в 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, работающий в "backend" сети, используя следующую команду :

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 (productapp1, productapp2, productapp3), которые назначены как для "backend", так и для "frontend" сети. См. Ниже содержимое файла 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

Посмотрев журналы веб-приложений, я могу подтвердить, что они работают должным образом, без каких-либо проблем. См. Ниже журналы для одного из контейнеров веб-приложений:

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 Service Unavailable. (Нет сервера для обработки этого запроса.)

Я выполнил следующую команду в одном из веб-приложений и проверил, что порт для 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

Но если я запустил ту же команду для одно из веб-приложений:

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 : После помощи Майкла Хэмптона мне удалось открыть порт 5000 для контейнеров моего веб-приложения. Журналы для контейнеров моих веб-приложений теперь выглядят следующим образом:

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

И теперь я могу переходить к своим веб-приложениям, как и ожидалось.

2
задан 10 July 2020 в 07:40
1 ответ

В ваших журналах говорится, что приложение прослушивает порт 5000, но вы настроили haproxy, чтобы попытаться подключиться к нему через порт 80! Это не сработает. Перенастройте haproxy для подключения к правильному порту.

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

В ваших журналах также говорится, что веб-приложение прослушивает только локальный хост, поэтому оно будет принимать подключения только из своего собственного контейнера, а не из других контейнеров в модуле. Как это исправить, зависит от специфики приложения. Я думаю, вам следует посмотреть Properties/launchSettings.json, если вы используете пример приложения ASP.NET Core.

0
ответ дан 9 July 2020 в 15:32

Теги

Похожие вопросы