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