Невозможно настроить Traefik 2 для пересылки трафика по маршрутам. - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь настроить Traefik 2 для пересылки трафика с нескольких маршрутов во внутренние службы, такие как Portainer. Я пробовал, вероятно, все, и все же при запросе маршрута я получаю Gateway Timeout в лучшем случае.

Может кто-то направить меня в правильном направлении?

Это Traefik 2docker-compose.yaml Я использую:

version: "3.3"

services:
  traefik:
    container_name: traefik
    image: traefik:v2.0
    command:
      - --global.sendanonymoususage=false
      - --log.level=debug
      - --log.format=common
      - --providers.docker
      - --providers.docker.exposedbydefault=false
      - --api
      - --entrypoints.http.address=:80
      - --entrypoints.https.address=:443
      - --entrypoints.portainer.address=:9000
      - --accesslog.format=common
      - --accesslog.filepath=access.log
      - --certificatesresolvers.letsencrypt.acme.caserver=https://acme-v02.api.letsencrypt.org/directory
      - --certificatesresolvers.letsencrypt.acme.email=someone@gmail.com
      - --certificatesresolvers.letsencrypt.acme.storage=/acme.json
      - --certificatesresolvers.letsencrypt.acme.tlschallenge=true
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./acme.json:/acme.json"
      - "./log/access.log:/access.log"
    ports:
      - "80:80"
      - "443:443"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`command.domain.com`)"
      - "traefik.http.routers.traefik.entrypoints=https"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.tls=true"
      - "traefik.http.routers.traefik.tls.certresolver=letsencrypt"
      - "traefik.http.routers.http-catchall.entrypoints=http"
      - "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
      - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      - "traefik.http.routers.traefik.middlewares=admin"
      - "traefik.http.middlewares.admin.basicauth.users=user:$$apr1$$q8eZFHjF$$Fvmkk//V6Btlaf2i/ju5n/"

Панель инструментов Traefik прекрасно загружается и работает, но когда я запускаю службу, я хочу получить доступ через command.domain.com / portainer ( контейнер прослушивает порт 9000 ) к нему невозможно получить доступ. Portainer docker-compose.yaml Я использую:

version: "3.3"

services:
  portainer:
    container_name: portainer
    image: portainer/portainer
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "./data:/data"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.portainer.entrypoints=http"
      - "traefik.http.routers.portainer.rule=Host(`command.domain.com`) && Path(`/portainer`)"
      - "traefik.http.middlewares.portainer-redirect.redirectscheme.scheme=https"
      - "traefik.http.middlewares.portainer-redirect.redirectscheme.permanent=true"
      - "traefik.http.routers.portainer.middlewares=portainer-redirect"
      - "traefik.http.routers.portainer-ssl.entrypoints=https"
      - "traefik.http.routers.portainer-ssl.rule=Host(`command.domain.com`) && Path(`/portainer`)"
      - "traefik.http.routers.portainer-ssl.tls=true"
      - "traefik.http.routers.portainer-ssl.tls.certresolver=letsencrypt"
      - "traefik.http.routers.portainer-ssl.service=portainer-ssl"
      - "traefik.http.services.portainer-ssl.loadbalancer.server.port=9000"
    restart: always

Из того, что я понял и вижу, нет необходимости объявлять сети и порты в yamls. Это правда?

Редактировать

Хорошо, есть некоторые разработки:

Я заставил это работать, но несколько. Префикс пути должен быть удален, и официальная документация Traefik гласит: https://dzwonsemrish7.cloudfront.net/items/2o0K3K1s1f3p3s113a0W/Image%202019-10-29%20at%209.55.55%20PM.png

Я использую эти ярлыки и приложение загружается, как и ожидалось:

- "traefik.enable=true"
- "traefik.http.routers.portainer.entrypoints=http"
- "traefik.http.routers.portainer.rule=Host(\command.domain.com`) && PathPrefix(`/portainer/`)"
- "traefik.http.routers.portainer.middlewares=https-redirect,portainer-stripprefix"
- "traefik.http.middlewares.portainer-stripprefix.stripprefix.prefixes=/portainer/"
- "traefik.http.routers.portainer-secure.entrypoints=https"
- "traefik.http.routers.portainer-secure.rule=Host(`command.domain.com`) && PathPrefix(`/portainer/`)"
- "traefik.http.routers.portainer-secure.middlewares=traefik-auth,portainer-stripprefix"
- "traefik.http.routers.portainer-secure.tls=true"
- "traefik.http.routers.portainer-secure.tls.certresolver=letsencrypt"
- "traefik.http.routers.portainer.service=portainer"
- "traefik.http.services.portainer.loadbalancer.server.port=9000"
- "traefik.docker.network=proxy"

Теперь у меня появилась идея использоватьодин маршрут на контейнер, так что, в основном, / traefik, / portainer, / awx, / adminer и т. д., и первый застрял, поскольку Traefik манипулирует заголовком HTTP Content-Type , устанавливая все неявно заданные заголовки в text / plain и, делая это, он ломает множество интерфейсов, созданных из CSS и JS, одним из которых является панель мониторинга Traefik.

Таким образом, маршрут панели мониторинга загружается, но почти все ресурсы представляют собой простой текст ибраузер не может использовать их для макета. Есть идеи?

...