Docker Swarm Mode 网络和负载平衡不适用于我的第二项服务

Docker Swarm Mode 网络和负载平衡不适用于我的第二项服务

我的设置

两个节点(2GB RAM,2 vCPU)运行 docker 引擎(v17.06.1-ce)——一个 swarm 和一个 worker。内部网络带宽:10Gbps。所有文件和数据库都位于此 docker 集群之外(AWS S3 和数据库的不同实例)。

我想要实现什么?

我正在尝试创建一个基于docker的“平台”,在那里我可以推送无国籍者服务和 docker 处理负载平衡、更新等。除此之外,我还尝试设置反向代理并允许特定服务访问此代理。

我至今做了什么?

首先,我创建了一个覆盖网络并将其命名为“public”。(10.0.9.0/24)然后,我在“全局”模式下创建了一个 nginx 服务。该服务本身连接到“public”网络。我检查了我的工作节点和集群节点,该服务在这两个节点上都运行正常。

其次,我创建了 docker compose 文件,用于快速部署多个服务。为了进行测试,我在每个 compose 文件中保留一个服务:

version: '3.3'
services:
  web:
    image: app1_image:latest
    networks:
      - public
networks:
  public:
    external:
      name: public

对于第二项服务,我仅更改了图像名称,其他内容保持不变。运行两个“堆栈”:

docker stack deploy --with-registry-auth --compose-file compose1.yml app1
docker stack deploy --with-registry-auth --compose-file compose2.yml app2

检查完这两项服务后,我发现这两项服务都位于“覆盖”网络中,其 IP 为 10.0.9.5(app1_web)和 10.0.9.6(app2_web)。app1_web在 swarm 节点中创建,并app2_web在工作节点中创建。

因此,我通过以下方式为我的两个服务创建两个 nginx 配置文件:

server {
    listen 80;
    server_name app1.example.com;
    location / {
        proxy_pass http://app1_web; # This line is important
        # Other proxy parameters
    }
}

如您所见,我在 nginx 配置中传递了服务名称。为了更轻松地进行配置管理,我使用 docker 配置:

docker config create nginx_app1.conf app1.conf
docker config create nginx_app1.conf app1.conf

docker service update --config-add source=nginx_app1.conf,target=/etc/nginx/conf.d/app1.conf nginx_proxy
docker service update --config-add source=nginx_app2.conf,target=/etc/nginx/conf.d/app2.conf nginx_proxy

添加这些配置会自动重启 nginx 服务并运行它们。就这些。在继续之前,我想先向您介绍一下我的流程。

问题

app1_web在 swarm 中创建;因此,当我访问 app1.example.com 时,nginx 将我的请求代理到服务,然后我得到正确的输出。这正是预期的结果,我对结果很满意。

但是,由于app2_web是在工作节点中创建的,所以 nginx 给出了一个app2_web不存在的错误。因此,我开始进行故障排除。

从 Swarm 中,我找到了 docker 实例 ID,并尝试从 nginx 代理运行命令:

docker exec nginx-proxy-id ping app2_web

这给了我一个“错误地址”错误。因此,我进入 compose2.yml 并添加了端口:

ports:
  - 5380:80

当我访问 swarm.example.com:5380 时,它基本上给了我 404。但是,从 worker.example.com:5380 打开相同的端口会打开 app2。

我对 app1 进行了相同的测试。我使用 复制了 app1 docker service scale app1=2,并在工作节点中创建了服务。然后我使用 暂停了 Swarm 中的服务docker pause app1-id。当我访问 app1.example.com 时,它有一半的时间可以工作。我认为这仍然很奇怪,因为我期望 Docker 知道服务已暂停并且仅将服务代理到工作节点,但无论如何。至少它在工作。复制 app2 没有帮助。我仍然不断收到主机名不存在的错误。在此之后,我进一步告诉工作节点离开 Swarm:docker swarm leave巧合的是,一切都正常……

在这上面花了至少 10 个小时之后,我不明白自己到底做错了什么。出于某种原因,当首先在工作进程中创建服务时,Docker 不喜欢它。

抱歉写了这么长的内容。我想分享我采取的所有步骤。非常感谢您的帮助。

相关内容