Estoy tratando de ejecutar un contenedor traefik en mi clúster de enjambre acoplable. Debido a que estamos utilizando comunicación encriptada TLS, quiero que el tablero de traefik esté disponible a través de https.
En mi navegador, trato de acceder a traefik a través del nombre de host del administrador de enjambre de docker a través de https://my.docker.manager y, por lo tanto, monté mi certificado de host y la clave en el servicio traefik.
Cuando intento abrir https://my.docker.manager en mi navegador, se agota el tiempo de espera.
Cuando intento curl https://my.docker.manager directamente en el host (my.docker.manager), obtengo el código HTTP 403 como respuesta
Mi configuración traefik:
debug=true logLevel = "DEBUG" defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.http.redirect] entryPoint = "https" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] certFile = "/etc/traefik/certs/my.docker.manager.crt" keyFile = "/etc/traefik/certs/my.docker.manager.key" [entryPoints.https.tls.defaultCertificate] certFile = "/etc/traefik/certs/my.docker.manager.crt" keyFile = "/etc/traefik/certs/my.docker.manager.key" [api] address = ":8080" [docker] watch = true swarmMode = trueMi archivo de composición traefik:
version: "3.7" services: traefik: image: traefik ports: - 80:80 - 443:443 networks: - devops-net volumes: - /var/run/docker.sock:/var/run/docker.sock - /mnt/docker-data/secrets/certs/:/etc/traefik/certs/ configs: - source: traefik.conf target: /etc/traefik/traefik.toml deploy: placement: constraints: - node.role == manager labels: - "traefik.docker.network=devops-net" - "traefik.frontend.rule=Host:my.docker.manager" - "traefik.port=8080" networks: devops-net: driver: overlay external: true configs: traefik.conf: external: true Como se describe en este artículo ( https://www.digitalocean.com/community/tutorials/how-to-use-traefik-as-a-reverse-proxy-for-docker-containers-on-ubuntu-16-04 ) , esperaba ver el tablero traefik cuando llamo a https://my.docker.manager en mi navegador. Pero solo tengo un tiempo de espera. Cuando uso curl https://my.docker.manager , obtengo el código HTTP 403. Seguí el artículo mencionado excepto dos diferencias: 1) No configuré las credenciales 2) Usé mis propios certificados de host en lugar de letsencrypt
Mientras tanto, encontré la razón de mi problema (no estoy seguro de cuál es la mejor solución). Por el caso de que a alguien le interese, intentaré explicarlo.
Tengo un Swarm de tres nodos, en la red prod.company.de
Mi cliente está en otra red intranet.comnpany.de
Mi administrador de enjambre está dirigido por docker-manager.prod.company.de. En este host, implementé el servicio traefik, al que quiero acceder a través de https://docker-manager.prod.company.de (Este es el puerto 443 y, debido a la configuración de traefik, se reenvió al tablero de traefik en 8080 dentro del contenedor ).
Si hago un seguimiento del tráfico de mi red, puedo ver que la solicitud https ( https://docker-manager.prod.company.de ) del navegador de mi cliente llega al servidor y luego el tráfico se reenvía a la dirección 17.18.0.2 de docker_gwbridge. Pero la respuesta no encuentra el camino de regreso a mi cliente debido a la configuración NAT de la ventana acoplable.
iptables -t nat -L -v
Cadena POSTROUTING (política ACEPTAR 0 paquetes, 0 bytes)
pkts bytes target prot opt in out fuente destino
8 504 MASQUERADE todo -- cualquier docker_gwbridge en cualquier lugar en cualquier lugar ADDRTYPE coincide con tipo-src LOCAL
0 0 MASQUERADE todo -- cualquier !docker0 172.17.0.0/16 en cualquier lugar
0 0 MASQUERADE todo -- cualquier !docker_gwbridge 172.18.0.0/16 en cualquier lugar MASQERADE dice que la IP de origen de la solicitud debe reemplazarse con la IP del puente (en mi caso, 172.18.0.1) para que las respuestas se enruten de nuevo a esta IP. EN el caso anterior, la regla 8 504 MASQUERADE all -- any docker_gwbridge anywhere anywhere haría esto, pero está limitado a solicitudes de LOCAL por ADDRTYPE match src-type LOCAL , lo que significa que usar un navegador en el host docker funcionaría, pero mis conexiones del cliente no funcionan, porque la respuesta no encontrará el camino de regreso a la dirección de mi cliente.
Actualmente, agregué una regla NAT más a mis iptables: iptables -t nat -A POSTROUTING -o docker_gwbridge -j MASQUERADE
lo que resulta en
1 52 MASQUERADE todo -- cualquier docker_gwbridge en cualquier lugar en cualquier lugar
Después de eso, puedo ver el Tablero traefik, al abrir https://docker-manager.prod.company.de en mi navegador en el cliente.
Pero no entiendo por qué tengo que hacer esto, porque no encontré nada al respecto en ninguna documentación y no creo que mi caso de uso sea realmente raro. Es por eso que estaría feliz, si alguien pudiera echar un vistazo a esta publicación y tal vez comprobar si hice alguna otra cosa mal o explicarme por qué tengo que hacer esas cosas para que funcione un caso de uso estándar.
Saludos cordiales