Files
hpnn-proto/docker-compose.yml
T

159 lines
5.9 KiB
YAML

name: hpnn-v2
services:
# Контейнер 1: маршрутизатор и балансировщик нагрузки в одном лице.
# Подключён ко всем трём сетям; весь форвардинг выполняет OVS (br-lb),
# сетевой стек ядра контейнера в передаче трафика не участвует.
lb-router:
# Контекст — корень репозитория: в образ едет и демон health-check (hc/).
build:
context: .
dockerfile: lb/Dockerfile
container_name: hpnn-lb
hostname: lb-router
# privileged + /lib/modules: kernel datapath OVS в сетевом пространстве
# имён контейнера (модуль openvswitch namespace-aware).
privileged: true
volumes:
- /lib/modules:/lib/modules:ro
environment:
TZ: Europe/Moscow
networks:
pub:
ipv4_address: 192.168.55.20
mac_address: "02:42:c0:a8:05:14"
priv2:
ipv4_address: 10.20.0.1
mac_address: "02:42:0a:14:00:01"
priv3:
ipv4_address: 10.30.0.1
mac_address: "02:42:0a:1e:00:01"
restart: unless-stopped
# Бэкенды и клиенты приватных сегментов (шаг 3).
#
# network_mode: none — у контейнера нет ни одной docker-сети. Порт сегмента
# создаёт scripts/attach-segment.sh: veth напрямую в br-lb, адрес, MAC и
# маршруты назначаются снаружи. Так стенд повторяет целевую среду, где ВМ
# подключены к vSwitch, и балансировщик видит весь трафик сегмента — включая
# ответ бэкенда клиенту-соседу по подсети.
#
# Адреса и MAC перечислены в lb/topology.env — единственном источнике правды.
be1:
build: ./backend
container_name: hpnn-be1
hostname: be1
cap_add: [NET_ADMIN]
environment:
TZ: Europe/Moscow
network_mode: none
depends_on: [lb-router]
restart: unless-stopped
be2:
build: ./backend
container_name: hpnn-be2
hostname: be2
cap_add: [NET_ADMIN]
environment:
TZ: Europe/Moscow
network_mode: none
depends_on: [lb-router]
restart: unless-stopped
# Четыре члена пула вместо двух дают содержательную проверку раскладки слотов:
# при выбытии одного члена его слоты делятся между тремя оставшимися.
be3:
build: ./backend
container_name: hpnn-be3
hostname: be3
cap_add: [NET_ADMIN]
environment:
TZ: Europe/Moscow
network_mode: none
depends_on: [lb-router]
restart: unless-stopped
be4:
build: ./backend
container_name: hpnn-be4
hostname: be4
cap_add: [NET_ADMIN]
environment:
TZ: Europe/Moscow
network_mode: none
depends_on: [lb-router]
restart: unless-stopped
# Клиенты внутри приватных сегментов — те самые ВМ, что живут рядом с
# бэкендами. Образ бэкенда переиспользован ради curl и iproute2; сервис не
# запускается. В их ОС не настраивается ничего, кроме адреса.
cli2:
build: ./backend
container_name: hpnn-cli2
hostname: cli2
entrypoint: ["sleep", "infinity"]
healthcheck:
disable: true
environment:
TZ: Europe/Moscow
network_mode: none
depends_on: [lb-router]
restart: unless-stopped
cli3:
build: ./backend
container_name: hpnn-cli3
hostname: cli3
entrypoint: ["sleep", "infinity"]
healthcheck:
disable: true
environment:
TZ: Europe/Moscow
network_mode: none
depends_on: [lb-router]
restart: unless-stopped
networks:
# Сеть 1 — публичный сегмент: macvlan поверх физического enp3s0, то есть
# настоящий L2 клиентской сети 192.168.5.0/24.
#
# Объявленная здесь подсеть 192.168.55.0/24 намеренно фиктивная и служит
# только Docker IPAM: адреса узла (192.168.5.20) и VIP (192.168.5.21)
# существуют исключительно в правилах OpenFlow, а с интерфейса IP снимается
# при старте. Реальная 192.168.5.0/24 здесь объявлена быть не может — её уже
# занимает macvlan-сеть соседнего стенда router-functest, и Docker
# отказывается регистрировать пересекающийся пул.
pub:
driver: macvlan
driver_opts:
parent: enp3s0
ipam:
config:
- subnet: 192.168.55.0/24
# Сеть 2 — приватный сегмент 10.20.0.0/24. С шага 3 к ней подключён только
# балансировщик: его порт p2 служит аплинком сегмента к шлюзу Docker (.254),
# через который бэкенды выходят наружу (профиль A). ВМ сегмента подключены
# напрямую к br-lb — см. scripts/attach-segment.sh.
#
# Шлюз Docker смещён на .254, чтобы адрес .1 занял OVS-роутер.
priv2:
driver: bridge
driver_opts:
com.docker.network.bridge.name: hpnn-p2
ipam:
config:
- subnet: 10.20.0.0/24
gateway: 10.20.0.254
# Сеть 3 — дополнительный приватный сегмент бэкенда be2.
priv3:
driver: bridge
driver_opts:
com.docker.network.bridge.name: hpnn-p3
ipam:
config:
- subnet: 10.30.0.0/24
gateway: 10.30.0.254