Как использовать Express Api Gateway в режиме Docker Swarm?
У меня есть несколько простых REST API-сервисов, реализованных в Express. Эти сервисы выполняются в док-контейнерах в режиме роя. Также я пытаюсь использовать шлюз Express-API с этими сервисами. Экспресс-шлюз API также запускается в контейнере как часть Docker Swarm. Следующий файл Dockercompose
version: "3"
services:
firstService:
image: chaitanyaw/firstrepository:first
deploy:
replicas: 3
restart_policy:
condition: on-failure
ports:
- '3000:3000'
networks:
- webnet
apiGateway:
image: firstgateway:latest
deploy:
restart_policy:
condition: on-failure
ports:
- '80:80'
networks:
- webnet
visualizer:
image: dockersamples/visualizer:latest
ports:
- 8080:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet:
также следует файл gateway.config
http:
port: 80
admin:
port: 9876
hostname: localhost
apiEndpoints:
api:
host: 192.168.99.100
paths: '/ip'
localApi:
host: 192.168.99.100
paths: '/'
serviceEndpoints:
httpbin:
url: 'https://httpbin.org'
services:
urls:
- 'http://192.168.99.100:3000/serviceonerequest'
- 'http://192.168.99.100:3000/servicetwo'
policies:
- basic-auth
- cors
- expression
- key-auth
- log
- oauth2
- proxy
- rate-limit
pipelines:
default:
apiEndpoints:
- api
policies:
# Uncomment `key-auth:` when instructed to in the Getting Started guide.
# - key-auth:
- proxy:
- action:
serviceEndpoint: httpbin
changeOrigin: true
customPipeline:
apiEndpoints:
- localApi
policies:
- proxy:
- action:
serviceEndpoint: services
changeOrigin: true
Ip '192.168.99.100' - это ip док-машины. Если я запускаю стек, используя вышеуказанный файл gateway.config, все работает нормально. Однако, если я заменю
services:
urls:
- 'http://192.168.99.100:3000/serviceonerequest'
- 'http://192.168.99.100:3000/servicetwo'
с
services:
urls:
- 'http://services_firstService:3000/serviceonerequest'
- 'http://services_firstService:3000/servicetwo'
Я получаю плохие ворота! Этот док-рой запускает оверлейную сеть "webnet". Итак, я должен иметь возможность использовать имя службы в качестве имени хоста в файле gateway.config по этой ссылке. В приведенном выше рабочем случае с использованием IP сервисы становятся доступными "за пределами" шлюза, который я не желаю. Что случилось?
2 ответа
Итак, я нашел, где я ошибался! Посмотрите на файл compose выше! Имена сервисов firstService (заглавная S!). Теперь, если бы я использовал
urls:
- 'http://services_firstService:3000/serviceonerequest'
- 'http://services_firstService:3000/servicetwo'
API-шлюз будет продолжать искать services_firstservice (обратите внимание на маленькие 's' в firstService), который, очевидно, отсутствует в оверлейной сети! Теперь я изменил имена на маленький регистр, и он работает так, как ожидалось! Вот новый Docker-compose файл
version: "3"
services:
firstservice:
image: chaitanyaw/firstrepository:first
deploy:
replicas: 3
restart_policy:
condition: on-failure
networks:
- webnet
apigateway:
image: firstgateway:latest
deploy:
restart_policy:
condition: on-failure
ports:
- '80:80'
networks:
- webnet
visualizer:
image: dockersamples/visualizer:latest
ports:
- 8080:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet:
Также здесь находится файл gateway.config
http:
port: 80
admin:
port: 9876
hostname: localhost
apiEndpoints:
api:
host: 192.168.99.100
paths: '/ip'
localApi:
host: 192.168.99.100
paths: '/'
serviceEndpoints:
httpbin:
url: 'https://httpbin.org'
services:
urls:
- 'http://services_firstservice:3000/serviceonerequest'
- 'http://services_firstservice:3000/servicetwo'
policies:
- basic-auth
- cors
- expression
- key-auth
- log
- oauth2
- proxy
- rate-limit
pipelines:
default:
apiEndpoints:
- api
policies:
# Uncomment `key-auth:` when instructed to in the Getting Started guide.
# - key-auth:
- proxy:
- action:
serviceEndpoint: httpbin
changeOrigin: true
customPipeline:
apiEndpoints:
- localApi
policies:
- proxy:
- action:
serviceEndpoint: services
changeOrigin: true
С точки зрения шлюза, в конфигурации нет ничего плохого. До тех пор, пока DNS-имя может быть разрешено правильно, запрос должен пройти без проблем.
То, что я хотел бы сделать, это войти в контейнер шлюза и попытаться ping
две услуги. Если что-то пойдет не так, то, скорее всего, docker-compose.yml
Файл имеет некоторые проблемы.
Я бы попытался удалить network
ключ, например. Сеть создается неявным образом, поэтому вам не нужна эта часть.
Кроме того - я не думаю, что DNS-имя для службы services_firstService
; Я бы попробовал с firstService
непосредственно.
Ура,
V.