0

我正在学习 Traefik 基础知识,但无法进行健康检查。我有四台服务器,它们是 docker 容器。轮换运行良好,刷新 localhost 页面时,每次都显示不同的服务器。即使使用Apache Benchmark启动多个请愿并使用ctop监控它们,也显示了正确的工作负载平衡。当我停止其中一台服务器时,问题就来了。假设 Traefik 应该检测到离线服务器并重定向到其中一个活动服务器,但是当轮换到达离线服务器时,它会显示“Bad Gateway”消息,因此健康检查根本不起作用。我试图复制文档示例,但肯定我遗漏了一些东西。

这是我的 docker-compose.yml 文件:

version: '2.4'
services:
  traefik:
    image: asn/traefikv1
    build: traefikv1/
    ports:
      - "80:80"
      - "8080:8080" # Web GUI
    volumes:
      # Traefik static config file
     - ./traefikv1/traefik.toml:/etc/traefik/traefik.toml  

  wwwserver:
    build: .
    image: phpwebapp
    ports:
      # Random external port for HTTP direct access 
      - "80"
      - "8080"
    scale: 4
    mem_limit: 50m
    mem_reservation: 25m
    volumes:
      - ./html:/var/www/html
    depends_on:
      - mariadb 

  mariadb:
    image: mariadb:latest
    environment:
      - MYSQL_ROOT_PASSWORD=secret
      - MYSQL_DATABASE=notesdb
      - MYSQL_USER=usuario
      - MYSQL_PASSWORD=secreto
    ports:
      - 3306:3306

这是我的 traefik.toml,其中定义了健康检查:

# Enable API and dashboard (:8080)
[api]

# Enable logs
[traefikLog]
[accessLog]

# Configure timeouts
[respondingTimeouts]

[file]

#Manual frontend/backend  configuration
[frontends]
  [frontends.frontend1]
    passHostHeader = true
    entryPoints = ["http"]
    backend = "wwwservers"
[backends]
  [backends.wwwservers]
      # Define www servers
      [backends.wwwservers.servers.server1]
          url = "http://pruebastraefik_wwwserver_1:80" 
      [backends.wwwservers.servers.server2]
          url = "http://pruebastraefik_wwwserver_2:80"    
      [backends.wwwservers.servers.server3]
          url = "http://pruebastraefik_wwwserver_3:80"
      [backends.wwwservers.servers.server4]
          url = "http://pruebastraefik_wwwserver_4:80"
      [backends.wwwservers.loadBalancer.healthCheck]
          path = "/health"
          interval = "10s"
          timeout = "3s"
          port= 80
4

1 回答 1

0

我认为您在撰写文件中缺少服务标签。另请注意,2.4 版是所谓的实验版,我建议您切换到 2.3。

深入地讲,我相信这种情况正在发生:最重要的是,您缺少 docker compose 服务上的标签。此外,TOML 文件在 traefik 服务上运行,而不是在您要路由的 wwwserver 上运行。诸如“后端”和“前端”之类的标签应该包含在正确的 traefik 标签中,我认为 traefik 会忽略它们。

此外,似乎 scale 选项会创建额外的容器来在同一主机上运行服务(?)。似乎您正试图控制您的服务,这些服务定义了每个扩展节点试图提供的服务。

我在一个 swarm 集群上运行多个域和服务,traefik 是我的主要入口点并处理集群的网络。我编写了带有标签“deploy”和子标签“labels”的单独堆栈文件,其中包含堆栈中每个服务的所有 traefik 规则,与网站上的快速入门教程非常相似,只是带有多个撰写文件和添加的部署docker swarm 模式的标签。祝你好运

于 2020-11-15T16:18:28.207 回答