首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当healthcheck url指向自身时,Docker swarm服务未启动

当healthcheck url指向自身时,Docker swarm服务未启动
EN

Stack Overflow用户
提问于 2021-04-08 05:53:37
回答 1查看 62关注 0票数 0

如果健康检查url指向自身,traefik无法运行,会出现什么问题?使用google it,使用traefik域名,服务甚至没有启动。

我从这里开始学习这个例子:https://github.com/jakubhajek/traefik-swarm-mastery/blob/master/stack-tr-main.yml

代码语言:javascript
复制
version: "3.8"

services:
  traefik:
    image: "traefik:v2.4.7"
    healthcheck:
#      test: wget --quiet --tries=1 --spider https://google.com || exit 1 # WORKS
      test: wget --quiet --tries=1 --spider https://traefik.mydomain.com/ping || exit 1 # FAILS
      interval: 3s
      timeout: 5s
      retries: 3
      start_period: 5s
  deploy:
    replicas: 1
    placement:
      constraints: [node.role == manager]
    labels:
      - "traefik.enable=true"
      #___ROUTER
      - "traefik.http.routers.traefik.rule=Host(`traefik.mydomain.com`)"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.tls.certresolver=le"
      #___ROUTER ping
      - "traefik.http.routers.ping.rule=Host(`traefik.mydomain.com`) && Path(`/ping`)"
      - "traefik.http.routers.ping.service=ping@internal"
      - "traefik.http.routers.ping.tls.certresolver=le"
      #___ Use these middlewares                                
       - "traefik.http.services.traefik.loadbalancer.server.port=8080"
    command:
      - "--log.level=DEBUG"
      - "--api=true"
#      - "--api.insecure=true"
      - "--api.dashboard=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.swarmmode"
#      - "--providers.docker.network=default"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.websecure.http.tls.certResolver=le"
#      - "--entrypoints.ping.address=:8080"
#      - "--entrypoints.ping.http.tls.certResolver=le"
      - "--log=true"
      - "--log.filePath=/logs/traefik.log"
      - "--ping=true"
#      - "--ping.entryPoint=ping"
      - "--accesslog=true"
      - "--accesslog.filePath=/logs/access.log"
      - "--certificatesresolvers.le.acme.email=john.doe@gmail.com"
    ports:
      - "80:80"
      - "443:443"
#      - "8080:8080"
#      - "8082:8082"
    environment:
      TZ: 'Europe/Berlin'
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "/etc/localtime:/etc/localtime:ro"
      - "$TRAEFIK_DATA_DIR:/logs"
    networks:
      - mystacknet

出现故障时,docker service ls的输出显示0/1副本。如果成功(使用伪造的google url),它会显示1/1,并且仪表板可以访问。traefik的日志没有显示错误。

代码语言:javascript
复制
ID                  NAME                           MODE                REPLICAS            IMAGE                     PORTS                                                    
yghvyj2l7ri2        mystack-traefik_traefik        replicated          0/1                 traefik:v2.4.7            *:80->80/tcp, *:443->443/tcp
EN

回答 1

Stack Overflow用户

发布于 2021-04-11 17:28:21

一般来说,必须对特定的容器(或swarm术语中的任务)执行健康检查,而不涉及负载均衡器、互锁等其他对象,而最好的方法是直接引用localhost/127.0.0.1。

此外,/ping endpoint旨在暴露一个所谓的活动探测器,该探测器告诉容器在容器生命的非常早期阶段“准备”蜂拥而至或其他协调者。

从这个意义上说,摆脱每一个不必要的“步骤”是更安全的,例如在可能的情况下避免TLS证书。

把所有这些放在一起,你可能会让你的健康检查像这样工作:

代码语言:javascript
复制
  test: wget --quiet --tries=1 --spider http://traefik.mydomain.com:8080/ping || exit 1

(例如,使用http而不是https和http关联端口,即8080)。更好的方法是引用localhost

代码语言:javascript
复制
  test: wget --quiet --tries=1 --spider http://127.0.0.1:8080/ping || exit 1

更好的方法是使用dedicated traefik cli command,它已经为此提供了

代码语言:javascript
复制
  test: traefik healthcheck --ping

我的建议是使用最后一个。

我补充说,如果不是所有的话,大部分关于健康检查的考虑都是使用docker-compose而不是swarm。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66994600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档