защитное стекло Google с Traefik

#docker #nginx #traefik #cadvisor

#докер #nginx #траэфик #кадвизор

Вопрос:

Я попытался развернуть Google cAdvisor с помощью обратного прокси-сервера traefik

Рабочая конфигурация nginx

С помощью nginx docker-compose:

   cadvisor:
container_name: cadvisor
build:
  context: .
  dockerfile: projects/cadvisor/Dockerfile
command:
  - '-port=80'
  - '-url_base_prefix=/admin/cadvisor'
volumes:
  - "/:/rootfs:ro"
  - "/var/run:/var/run:ro"
  - "/sys:/sys:ro"
  - "/var/lib/docker:/var/lib/docker:ro"
  - "/dev/disk:/dev/disk:ro"
expose:
  - 80
 

Конфигурация Nginx :

 location  ~* /admin/cadvisor/.*$ {
    proxy_pass http://cadvisor;
}
 

Неудачная конфигурация traefik

  cadvisor:
container_name:cadvisor
image:  gcr.io/google-containers/cadvisor:latest
restart: always
privileged: true
networks:
  - back-network
ports:
  - "8080:8080"
command:
  - '-url_base_prefix=/cadvisor'
volumes:
  - /:/rootfs:ro
  - /var/run:/var/run:rw
  - /sys:/sys:ro
  - /var/lib/docker/:/var/lib/docker:ro
labels:
  - "traefik.http.routers.cadvisor.rule=Host(`localhost`) amp;amp; PathPrefix(`/cadvisor`)"
  - "traefik.http.services.cadvisor.loadbalancer.server.port=8080"
 

Основная проблема с cAdvisor — перенаправление, вот почему нам нужно добавить url_base_prefix arg

Но предыдущий docker-compose с traefik не работает

Я не знаю, как location ~* /admin/cadvisor/.*$ перейти к конфигурации Traefik

Ответ №1:

Что вы там делаете с Nginx? Запускается ли он на хосте для обработки других запросов к другим службам? Nginx не нужен для cAdvisor.

Вот рабочий пример из моей текущей установки:

 version: '3.8'
services:
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    restart: always
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro
    privileged: true
    devices:
      - "/dev/kmsg:/dev/kmsg"
    command: --url_base_prefix=/cadvisor
    environment:
      - CADVISOR_HEALTHCHECK_URL=http://localhost:8080/cadvisor/healthz 
    labels:
      - "traefik.enable=true" # enable traefik
      - "traefik.docker.network=traefik-public" # put it in the same network as traefik
      - "traefik.constraint-label=traefik-public" # assign the same label as traefik so it can be discovered

      - "traefik.http.routers.cadvisor-01.service=cadvisor-01-secured"
      - "traefik.http.routers.cadvisor-01.rule=Host(`host.example.com`) amp;amp; PathPrefix(`/cadvisor`)"
      - "traefik.http.routers.cadvisor-01.priority=20"
      - "traefik.http.routers.cadvisor-01.entrypoints=http"
      - "traefik.http.middlewares.cadvisor-01.redirectscheme.scheme=https" # redirect traffic to https
      - "traefik.http.middlewares.cadvisor-01.redirectscheme.permanent=true" # redirect traffic to https

      - "traefik.http.middlewares.def-cadvisor-01.headers.customrequestheaders.X-Forwarded-Server=host.example.com"
      - "traefik.http.middlewares.def-cadvisor-01.headers.referrerPolicy=origin"
      - "traefik.http.middlewares.def-cadvisor-01-auth.basicauth.users=USERNAME:PASSWORD"
      - "traefik.http.routers.cadvisor-01.middlewares=https-redirect"

      - "traefik.http.routers.cadvisor-01-secured.service=cadvisor-01-secured"
      - "traefik.http.routers.cadvisor-01-secured.rule=Host(`host.example.com`) amp;amp; PathPrefix(`/cadvisor`)"
      - "traefik.http.routers.cadvisor-01-secured.priority=20"
      - "traefik.http.routers.cadvisor-01-secured.entrypoints=https"
      - "traefik.http.routers.cadvisor-01-secured.tls.certresolver=le-tls" # use the Let's Encrypt certificate resolver
      - "traefik.http.services.cadvisor-01-secured.loadbalancer.server.port=8080" # ask Traefik to search for port 8080
      - "traefik.http.routers.cadvisor-01-secured.middlewares=secHeaders@file,def-cadvisor-01-auth,def-cadvisor-01,def-compress"
    networks:
      - "traefik-public"


networks:
  traefik-public:
    external: true`
 

Проверка работоспособности немного сложна, это фиксированный URL-адрес в файле cAdvisor Dockerfile, но использование переменной среды перезаписывает его.
Как вы можете видеть, я запускаю cAdvisor с путем /cadvisor/, поэтому мне пришлось добавить этот параметр в качестве командной опции «—url_base_prefix» и изменить переменную среды CADVISOR_HEALTHCHECK_URL.

Traefik работает как обратный прокси-сервер, он прослушивает порты 443 и 80, я не хотел открывать для публики другой порт, например 8080, поэтому Traefik отвечает за обработку данных TLS и перенаправление с http на https. Таким образом, вам НЕ нужно открывать порт 8080 или предоставлять доступ к порту 80 в вашем определении cAdvisor! Этим займется Traefik. Traefik достигает ваших контейнеров, используя ту же сеть Docker.

Остерегайтесь настроек приоритета! Если корневой URL-адрес обрабатывает другая служба Traefik, он должен иметь более низкий приоритет. В противном случае ваше определение сервиса никогда не будет сопоставлено.

Если не разрешено публиковать URL-адреса, я прошу прощения, но, возможно, это кому-то полезно. Я написал вводные статьи по https://www.kuerbis.org/traefik-und-mehr / — в одном из них вы найдете больше о Traefik и cAdvisor. Они написаны на немецком языке, но я думаю, что Google Translate или аналогичный должен помочь.

С уважением, Ральф