如何配置Traefik实现本地Docker服务与外部VM节点的负载均衡
问题解答
1. 你猜测的配置方式不可行
Traefik的负载均衡servers配置项仅支持完整的url字段,没有单独的port配置项,所以你写的混合配置无法被Traefik识别。同时你提到的「不能混用标签和文件配置」是误解:仅同一个路由/服务不能同时通过两种方式定义,全局维度两种配置Provider是可以同时启用互不影响的。
2. 跨VM负载均衡的正确实现方案
最稳定易维护的方案是通过文件动态配置Provider定义统一的负载均衡服务,步骤如下:
前置准备
- 确认两台VM处于同一私有网络,内网可以互通
- 将本地Docker中的Node服务端口映射到宿主机私有IP的指定端口(比如3000),不要监听公网IP避免安全风险,第二台VM上的Node实例也做相同的端口映射配置
- 放开两台VM安全组的3000端口内网访问权限,仅允许对端私有IP放行
步骤1:开启Traefik文件配置Provider
修改你的Traefik静态配置(docker-compose.yml里的command或者traefik.yml配置文件),新增文件配置Provider声明:
providers: docker: {} # 保留原来的Docker Provider,不影响其他标签配置的服务 file: directory: /etc/traefik/dynamic watch: true # 配置文件改动自动加载,无需重启Traefik
同时要把你宿主机上存放动态配置的目录挂载到Traefik容器的/etc/traefik/dynamic路径。
步骤2:编写负载均衡动态配置
在上述动态配置目录下新建nest-service.yml,内容如下:
http: routers: nestjs-server: rule: Host(`mydomain.com`) || Host(`www.mydomain.com`) entrypoints: - websecure tls: certresolver: letsencrypt service: nestjs-cluster middlewares: - redirect-to-https # 复用你原来定义的HTTPS跳转中间件 services: nestjs-cluster: loadBalancer: servers: - url: "http://<第一台VM私有IP>:3000/" - url: "http://<第二台VM私有IP>:3000/"
步骤3:清理冗余配置
删除原来本地nestjs-server容器配置中的所有Traefik相关标签,现在该服务的路由和负载均衡已经统一由文件配置接管。
修改完成后重启Traefik即可生效,Traefik会自动把请求轮询分发到两台VM的Node实例上。如果后续需要扩容更多节点,直接在上述文件的servers列表里新增对应节点的内网url即可,无需修改其他配置。
内容的提问来源于stack exchange,提问作者Cameron Sima
相关产品推荐
相关产品推荐

