如果健康检查url指向自身,traefik无法运行,会出现什么问题?使用google it,使用traefik域名,服务甚至没有启动。
我从这里开始学习这个例子:https://github.com/jakubhajek/traefik-swarm-mastery/blob/master/stack-tr-main.yml
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的日志没有显示错误。
ID NAME MODE REPLICAS IMAGE PORTS
yghvyj2l7ri2 mystack-traefik_traefik replicated 0/1 traefik:v2.4.7 *:80->80/tcp, *:443->443/tcp发布于 2021-04-11 17:28:21
一般来说,必须对特定的容器(或swarm术语中的任务)执行健康检查,而不涉及负载均衡器、互锁等其他对象,而最好的方法是直接引用localhost/127.0.0.1。
此外,/ping endpoint旨在暴露一个所谓的活动探测器,该探测器告诉容器在容器生命的非常早期阶段“准备”蜂拥而至或其他协调者。
从这个意义上说,摆脱每一个不必要的“步骤”是更安全的,例如在可能的情况下避免TLS证书。
把所有这些放在一起,你可能会让你的健康检查像这样工作:
test: wget --quiet --tries=1 --spider http://traefik.mydomain.com:8080/ping || exit 1(例如,使用http而不是https和http关联端口,即8080)。更好的方法是引用localhost
test: wget --quiet --tries=1 --spider http://127.0.0.1:8080/ping || exit 1更好的方法是使用dedicated traefik cli command,它已经为此提供了
test: traefik healthcheck --ping我的建议是使用最后一个。
我补充说,如果不是所有的话,大部分关于健康检查的考虑都是使用docker-compose而不是swarm。
https://stackoverflow.com/questions/66994600
复制相似问题