Problemas con Traefik

Alexis99199

Hola buenas, llevo desde el miércoles dándole vueltas a esto y no encuentro la manera de poder resolverlo, lo mismo es que estoy entendiéndolo malamente o algo.

Estoy montando un clúster de micro servicios en 2 VPS con Docker Swarm y he desplegado Traefik con un Docker-Compose. El problema viene en que no soy capaz de que Traefik se comunique con los otros microservicios pese a que estén en la misma red, he puesto los labels y todo lo necesario y no hay manera.

version: '3.8'

x-default-opts:
  &default-opts
  logging:
    options:
      max-size: "10m"

networks:
  traefik:
    external: true

volumes:
  traefik-certificates:

services:
  traefik:
    <<: *default-opts
    # Image tag (replace with yours)
    image: traefik:2.4
    command:
      - "--global.checkNewVersion=true"
      - "--global.sendAnonymousUsage=false"
      - "--api=true"
      - "--log.level=WARN"
      - "--entryPoints.web.address=:80"
      - "--entryPoints.websecure.address=:443"
      - "--providers.docker=true"
      - "--providers.docker.watch=true"
      - "--providers.docker.swarmMode=true"
      - "--providers.docker.network=traefik"
      - "--providers.docker.endpoint=unix:///var/run/docker.sock"
      - "--providers.docker.swarmModeRefreshSeconds=15s"
      - "--providers.docker.exposedByDefault=false"
      - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
      # Email for Let's Encrypt (replace with yours)
      - "--certificatesresolvers.letsencrypt.acme.email=alarpae1311@g.educaand.es"
      - "--certificatesresolvers.letsencrypt.acme.storage=/etc/traefik/acme/acme.json"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - traefik-certificates:/etc/traefik/acme
    networks:
      - traefik
    ports:
      - "80:80"
      - "443:443"
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      update_config:
        delay: 15s
        parallelism: 1
        monitor: 10s
        failure_action: rollback
        max_failure_ratio: 0.55
      # Container resources (replace with yours)
      resources:
        limits:
          cpus: '0.35'
          memory: 256M
        reservations:
          cpus: '0.15'
          memory: 128M
      labels:
        - "traefik.enable=true"
        # Traefik URL (replace with yours)
        - "traefik.http.routers.default.rule=Host(`traefik.alarpae1311.site`)"
        - "traefik.http.routers.default.service=api@internal"
        - "traefik.http.routers.default.tls.certresolver=letsencrypt"
        - "traefik.http.routers.default.entrypoints=websecure"
        - "traefik.http.services.default.loadbalancer.passhostheader=true"
        - "traefik.http.services.default.loadbalancer.server.port=8080"
#        - "traefik.http.routers.default.middlewares=authtraefik"
        # Basic Authentication for Traefik Dashboard
        # Username: traefikadmin (replace with yours)
        # Passwords must be encoded using MD5, SHA1, or BCrypt
#        - "traefik.http.middlewares.authtraefik.basicauth.users=traefikadmin:$$2y$$10$$sMzJfirKC75x/hVpiINeZOiSm.Jkity9cn4KwNkRvO7hSQVFc5FLO"
        - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
        - "traefik.http.routers.http-catchall.entrypoints=web"
        - "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
        - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

El .yml este es el único con la versión 2 que he conseguido que se despliegue en Swarm y con Lets Encrypt aunque parezca muy cutrón.

He mirado documentación oficial y un porrón de documentación pero ninguna me sirve, ¿quizás es que lo que estoy intentando hacer con Traefik no se puede? Lo he usado en el ciclo pero estaban todos los servicios corriendo sobre el mismo compose, aquí cada servicio está en una carpeta distinta y en un compose diferente.

Puede que haya quedado muy escueto mi problema con esta información ya que es la primera vez que pido ayuda sobre cualquier tema informático por Internet.

squ4r3

La verdad es que no queda muy claro eso que has pegado. Podrías pegarlo como código o de alguna forma que te fastidie el formateado que le mete MV?

En mi caso el traefik que tengo lo tengo todo en el mismo compose que el resto de mis servicios.

has probado a hacer algo más sencillo con traefik, con dos contenedores de nginx o apache sencillos y ponerles el traefik delante y configurarlo con los tags bien todo dentro de un compose?

A mí me dio bastantes dolores de cabeza la config de traefik, pero así a bote pronto no sabría decirte. para qué es lo que quieres usar traefik concretamente? Los dos servicios deberían poder comunicarse entre sí si están en la misma red sin necesidad de traefik.

1 respuesta
B

No queda claro como lo tienes montado... Si te sirve de ayuda: https://www.mediavida.com/foro/hard-soft/raspberrydocumentacion-hizo-self-hosting-683999#traefik
Es un uso básico en tanto en cuanto no se usan secretos y los recursos no están limitados.

2 respuestas
Alexis99199

#2 creo que ya he conseguido arreglarlo, me acabo de dar cuenta que el último icono cuando escribes algo es de código XD.

Con todo en el mismo compose entiendo que si me funcionaría pero no me sirve en este caso, la cosa es que también he montado Jenkins y si en el mismo compose está el no sé si a la hora de hacer cualquier job y actualizar el compose se me va a la puta.

El uso que le quiero dar a Traefik es que haga de proxy inverso del resto de servicios y estén en seguro con Lets Encrypt.

#3 puede que me haya explicado como un libro cerrado, la verdad es que es el peor mal que tengo para ser de Sistemas XDDD.

Te explico, tengo dos VPS contratados en OVH, están en un swarm y monte swarmpit para tener algo más gráfico de como estaban. Luego tengo otros microservicios todos montados en contenedores con Docker. Y por último he montado Traefik para que me haga de proxy inverso del resto y les ponga el certificado.

La cosa es que Traefik no consigue comunicarse con el resto parece pese a estar en la misma red y todo el rollo. Creo que voy a tener que tomar la opción de montar un compose inmenso con todos los servicios aunque no sea lo que quiera.

1 respuesta
squ4r3

#4 el traefik lo tienes levantado? Puedes ir y ver la interfaz y los routers, services y middlewares?

Una cosa que no entiendo es: Por qué tienes labels en tu traefik? los labels los tienes que añadir a los servicios que quieres que traefik gestione

En mi caso uso traefik latest, no el 2, pero mi traefik está así:

por si te ayuda a resolver algo

1 respuesta
Alexis99199

#5 el traefik está corriendo ahora mismo y se puede ver perfectamente. Es más lo tengo sin contraseña ni nada (no sé hasta que punto es peligroso porque no se puede editar nada de ahí pero se ve todo).

Los labels que tengo en mi traefik es para que se rediriga a si mismo también, que es el único que funciona jeje. A mi la verdad que la versión de traefik que sea me da igual, mientras sea de las 2 para adelante (la 1 es que se ve muy antigua). En el resto he puesto prácticamente los mismos que tienes tú en tu jenkins y no ha habido manera. Si no te importa voy a copiarte tus compose para ver si funcionan.

La cosa es que has dicho antes que tienes el traefik en el mismo compose que los servicios que usa y aquí los veo separados.

Por cierto, que se me ha pasado antes, gracias a ti y a #3 por la ayuda. Es que llevo atascado una barbaridad de días y esto es mi proyecto final del módulo.

1 respuesta
squ4r3

#6 sí, en lo del compose me he colado, yo tengo cada servicio en un compose distinto, incluido el traefik.

Sé que me costó bastante configurarlo y cuando lo tuve ya todo en marcha pensé NO LO TOQUES MÁS. Porque luego dependes de a qué puerto vaya cada servicio, etc...

De todas formas, te recomiendo eso, hacerte un miniproyecto de prueba con dos apache, nginx o lo que quieras, y que pruebes a redirigirlo con traefik, certificados y demás, y así te aclaras con una configuración básica que no tenga mucho lío.

Es lo que hice yo y me ayudó bastante.

ah, y en mi caso tengo el api-insecure para que traefik vaya por http, ya que solo está accesible desde mi red, no está disponible al exterior. Por eso yo no tengo labels en traefik. No sé si eso añadirá complejidad también a tu setup.

puedes pegar el compose del servicio que traefik no te detecta?

1 1 respuesta
Alexis99199

#7 vale, he estado toqueteando bastante el Traefik y te comento.

He hecho más o menos lo que me has dicho de hacer un miniproyecto de prueba. He empezado a juntar todos los docker-compose.yml de los servicios que usaban traefik en uno solo y tras darle muchas vueltas he conseguido que los 3 se redirigan con certificados.

Ahora he cogido esa configuración y la he extirpado del compose enorme y la he pegado en uno individual para cada servicio otra vez y parece que funciona pero ahora está pasando algo que no comprendo.

Los servicios están redirigidos y con certificado, pero el propio dashboard del traefik no cuando están exactamente igual. Voy a darle un par de vueltas a eso a ver si encuentro solución. Gracias por el consejo.

Edito: Miento sobre el servicio de traefik, está redirigido y con certificado, pero el certificado según Google Chrome no es valido. Y ahora lo más loco, el certificado de los otros servicios es de Lets Encrypt, hasta ahí todo correcto. Pero es que el del propio traefik pone que está emitido por TRAEFIK DEFAULT CERT.

1 respuesta
squ4r3

#8 estás seguro de que el certificado en el de traefik está donde tiene que estar? Creo que si traefik no encuentra certificado usa uno autofirmado, y seguramente eso es de lo que se queja chrome. Revisa las rutas, los archivos y el mapeado de volumes para asegurarte de que traefik detecta el cert.

En los logs del contenedor igual encuentras también alguna pista de si no está pillando el cert.

Usuarios habituales