无法从 Docker Swarm 中的不同主机访问容器化的 SvelteKit 应用程序

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

我有一个 SvelteKit 应用程序和一些其他服务在 Docker Swarm 的多个主机上运行。 SvelteKit 应用服务在 swarm 的覆盖网络上被命名为

sveltekit-frontend-app
。该应用程序使用节点适配器运行,命令为
node /path/to/build
.

我期待它可以通过 HTTP 访问

http://sveltekit-frontend-app:3000
。该应用程序运行良好,并在同一主机上的另一个容器访问它时返回有效响应。但是,如果来自不同主机的容器尝试访问,应用程序不会返回响应并无限等待直到超时。

curl sveltekig-frontend-app:3000/home
的输出如下所示:

*  Trying 10.0.0.1:3000...
* Connected to sveltekit-frontend-app (10.0.0.1) port 3000 (#0)
> GET /home HTTP/1.1
> Host: sveltekit-frontend-app:3000
> User-Agent: curl/7.81.0
> Accept: */*

* Recv failure: Connection reset by peer
* Closing connection 1
curl: (56) Recv failure: Connection reset by peer

我认为 Docker Swarm 不是问题的原因,因为其他容器服务可以在不同主机之间毫无问题地相互通信。我认为问题出在节点上,所以我创建了一个简单的节点服务器并尝试从不同的主机访问它,但它工作正常。

sveltekit 应用程序实际上接受请求并在必要时处理重定向,但只是不返回响应。请参阅以下输出:

*  Trying 10.0.0.1:3000...
* Connected to sveltekit-frontend-app (10.0.0.1) port 3000 (#0)
> GET / HTTP/1.1
> Host: sveltekit-frontend-app:3000
> User-Agent: curl/7.81.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 308 Permanent Redirect
< location: /home
< Date: Fri, 17 Feb 2023 07:23:18 GMT
< Connection: keep-alive
< Keep-Alive: timeout=5
< Transfer-Encoding: chunked
< 
* Ignoring the response-body
* Connection #0 to host frontend left intact
* Issue another request to this URL: 'http://sveltekit-frontend-app:3000/home'
* Found bundle for host sveltekit-frontend-app: 0x123d0a39aef0 [serially]
* Can not multiplex, even if we wanted to!
* Re-using existing connection! (#0) with host sveltekit-frontend-app
* Connected to sveltekit-frontend-app (10.0.0.1) port 3000 (#0)
> GET /home HTTP/1.1
> Host: sveltekit-frontend-app:3000
> User-Agent: curl/7.81.0
> Accept: */*

我猜这个问题会在其他编排环境中发生,只要你将 sveltekit 应用程序容器化并尝试从不同的主机(如 Kubernetes)在网络上访问它,尽管不确定也没有尝试过。有谁知道如何解决这个问题?

提前致谢。


更新 (2023-03-07)

我创建了一个 repository 来复制我的问题。

我也找到了问题的原因。它既不是 SvelteKit 也不是 Docker Swarm。

我在 Vultr 的 VPC 网络上管理一个 swarm 集群。只有当我使用他们的 VPC 时才会发生此问题,而不是当我使用他们的全局 ipv4 地址时。我还在 Linode 上测试了 VLAN 网络,它工作得很好。

svelte docker-swarm sveltekit
1个回答
0
投票

我已将这篇文章发送给 Vultr 的支持,他们给了我解决方案。

此问题通过将 docker 的 mtu 设置为 1450 来解决,与 Vultr 的 VPC 网络 mtu 大小相同。

像这样修改 stack.yml 中的网络部分:

networks:
  app-overlay-net:
    driver: overlay
    driver_opts:
      com.docker.network.driver.mtu: 1450
© www.soinside.com 2019 - 2024. All rights reserved.