Две виртуальные машины размещены на одной машине, назовем их VM1 и VM2. Обе виртуальные машины размещают runC
контейнер, на котором запущено серверное приложение, клиент запущен непосредственно на хост-машине и подключен к службе, запущенной в контейнере в VM1.
Я хочу создать службу отказоустойчивости, где при закрытии контейнера на VM1 клиент должен подключиться к контейнеру, работающему на VM2.
Я реализовал и протестировал плавающий IP-адрес с помощьюподдержка активности и VRRPкак предложено вэтотссылка, но это работает только в случае отказа всей виртуальной машины. Мне нужно реализовать службу отказоустойчивости для контейнера. Если контейнер на виртуальной машине VM1 выходит из строя, клиент должен подключиться к реплике, работающей на виртуальной машине VM2, даже если виртуальная машина VM1 работает, т. е. контейнер выходит из строя, но виртуальная машина, на которой размещен этот контейнер, работает.
Ограничение здесь в том, что я не хочу использовать какие-либо службы балансировки нагрузки/HAproxy, которые могут стать единой точкой отказа.
Есть идеи, как этого добиться? Или это невозможно?
РЕДАКТИРОВАТЬ: (Как предлагается в комментариях, добавление подробностей позволит избежать возможных недоразумений.)Контейнер на VM2 не был запущен с момента запуска основного контейнера, т.е. контейнера, работающего на VM1. Существует утилита проверки/восстановления контейнера, которая называется criu
, вы можете посмотреть еездесьиздесь. Таким образом, используя эту утилиту, контейнер VM1 переносится на VM2, сначала создавая контрольную точку для этого контейнера, а затем перенося это состояние на VM2 и восстанавливая его. Но теперь также необходимо убедиться, что клиент должен подключиться к контейнеру, работающему на VM2. До сих пор я просто запускал контейнер в сетевом пространстве имен и добавлял маршрут из интерфейса VM1. С помощью этого я могу предотвратить отказ оборудования, например, если сам VM1 выйдет из строя, как упоминалось ранее, используяподдержка активности и VRRP, но теперь я хочу, чтобы когда состояние контейнера переносится на сторону VM2 и контейнер выходит из строя, но VM1 работает и перенесенное состояние этого контейнера восстанавливается на VM2, как мне убедиться, что клиент подключится к теперь работающему контейнеру на VM2? Мне нужно смоделировать этот сценарий.