Обмен сокетами docker на http rest с некоторой фильтрацией

Я буду передавать сокеты на http с помощью инструмента forward, https://github.com/worldline-go/forward, который я запрограммировал.

Этот инструмент прослушивает http запрос и пересылает его в сокет с некоторой фильтрацией методов.

Итак, давайте скачаем или запустим в docker:

Для загрузки посетите страницу релиза

# scratch version
docker pull ghcr.io/worldline-go/forward:v0.1.2
# alpine version
docker pull ghcr.io/worldline-go/forward:v0.1.2-alpine
Войти в полноэкранный режим Выйти из полноэкранного режима

Этот инструмент запрашивает у вас параметр команды, чтобы показать расположение файла сокета, путь перенаправления и некоторые методы фильтрации.

Здесь я буду перенаправлять все запросы /docker/* в файл docker.sock. И я отключу некоторые методы, так что без каких-либо методов фильтрации все методы будут работать.

Использование -, начинающееся с названия метода, отключает его:

-s /docker.sock:/docker/:-POST,-PUT,-DELETE,-PATCH
Войти в полноэкранный режим Выход из полноэкранного режима
export socket to HTTP
version: 0.1.2 commit: b8e86c7 buildDate:2022-06-29T10:46:25Z

Usage:
  forward [flags]

Flags:
  -h, --help                 help for forward
  -H, --host string          Host to listen on, default: 0.0.0.0:8080 (default "0.0.0.0:8080")
  -s, --socket stringArray   Socket to export: /var/run/docker.sock:/docker/:*,-POST,-PUT,-DELETE
  -v, --version              version for forward
Войти в полноэкранный режим Выйти из полноэкранного режима

Позволяет запустить

docker run --rm -p 8080:8080 -v /var/run/docker.sock:/docker.sock ghcr.io/worldline-go/forward:v0.1.2 -s /docker.sock:/docker/:-POST,-PUT,-DELETE,-PATCH
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь вызовите службу http, (подробности смотрите в этом документе)

curl http://localhost:8080/docker/containers/json
Войти в полноэкранный режим Выйти из полноэкранного режима

Я поделился с /docker путем, поэтому я вызвал с префиксом /docker, но это только для демонстрации, не нужно устанавливать какой-либо путь.


Теперь мы можем использовать этот инструмент в traefik.

Traefik — это прокси-инструмент, и в режиме роя ему нужна связь docker.sock для поиска информации о сервисах.

Мы можем подключить docker.sock к Traefik и решить проблему связи, но есть один момент. На рабочих узлах роя docker.sock не может связаться с swarm-api (по умолчанию). Мы можем исправить эту проблему, запустив forward tool как сервис и установив Traefik в качестве нашего сервиса для связи с docker socket.

Сервис Forward

forward-docker:
  image: ghcr.io/worldline-go/forward:v0.1.2
  command: "-s /var/run/docker.sock::-POST,-PUT,-PATCH,-DELETE"
  deploy:
    mode: global
    # Just works in manager nodes for swarm API
    placement:
      constraints:
        - "node.role==manager"
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  networks:
    - proxy
Вход в полноэкранный режим Выйти из полноэкранного режима

В статической конфигурации Traefik измените enpoint

providers:
  docker:
    # endpoint: "unix///var/run/docker.sock"
    endpoint: "tcp://forward-docker:8080"
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь вы можете реплицировать Traefik на всех узлах роя.

Оцените статью
devanswers.ru
Добавить комментарий