Skip to content
Oleg Ginzburg edited this page Aug 20, 2021 · 17 revisions

Архитектура run-bhyve core

Компоненты

  • База данных - СУБД на базе MySQL/PostgresQL, основная база run-bhyve core, хранящая информацию о виртуальных машинах, их конфигурации, их пользователях, контактная (биллинг) информация

  • Controller - высокоуровневый сервис, выполняющий и контроллирующий весь процессинг в run-bhyve core: прием запросов от API endpoint, генерация задач в Hypervisor, их постановка, обработка результата. Обработка метрик загруженности нод, балансировка нагрузки (DRS) путем анализа perfomance метрик и предсказаний на основе одной из выбранных политик (аналог watcher OpenStack: https://github.com/openstack/watcher/tree/master/watcher/decision_engine/strategy/strategies - кастомный набор политик по выбору подходящего сервера )

  • Broker bus (порт)- основная шина данных общения Controller и Hypervisor

  • Hypervisor - физическая нода под управлением FreeBSD OS. Количество нод неограничено. Каждый гипервизор имеет как минимум 1 ZPOOL. Каждый пул обслуживается процессом cbsd_mq, подписывающимся за персональной pool-очередью обработки инструкций CBSD

  • API - сервис (public), предоставляющий RestAPI, json-rpc для взаимоимодействия конечных пользвателей ( curl/UI frontend ) с виртуальными окружениями и облаком. Endpoints:

    • curl -H "cid:<cid>" https://127.0.0.1/api/v1/cluster - получить информацию о кластере.
    • curl -X POST -H "Content-Type: application/json" -d @payload.json https://127.0.0.1/api/v1/create/centos7 - создать VM или jail с именем 'centos7'.
    • curl -H "cid:<cid>" https://127.0.0.1/api/v1/status/centos7 - получить информацию об окружении 'centos7'.
    • curl -H "cid:<cid>" https://127.0.0.1/api/v1/start/centos7 - запустить окружение 'centos7'.
    • curl -H "cid:<cid>" https://127.0.0.1/api/v1/stop/centos7 - остановить окружение 'centos7'.
    • curl -H "cid:<cid>" https://127.0.0.1/api/v1/destroy/centos7 - уничтожить окружение 'centos7'.

Пример payload.json для /create/:

{
  "type": "bhyve",
  "img": "centos7",
  "imgsize": "10g",
  "ram": "1g",
  "cpus": "2",
  "pubkey": "ssh-ed25519 AA...Em comment@area"
}

где:

  • type: тип окружения, может быть: "bhyve" или "jail".
  • img: образ окружения. Для bhyve это варианты: "centos7","centos8","ubuntu","debian","freebsd_ufs","freebsd_zfs".
  • ram: Объем оперативной памяти окружения.
  • cpus: Количество vCPU/ядер, максимум: '16'.
  • pubkey: " " - стандартная строчка pubkey SSH.

Во всех endpoint кроме /create, фигурирует токен - это md5 от строчки pubkey.

  • CBSD - фреймворк на нижнем слое Гипервизора, выполняющий низкоуровневые операции над виртуальными окружениями ( создать вм, удалить, создать снапшот, откатить чекпоинт, выполнить добавление или ресайзин диска и тп )

Расширяемость API

Egor Kuzmichev, [18.06.21 18:46]
удобнее наверное так
ipv4:
 - external
 - none
 - internal
 - etc
ipv6:
  - external
  - none

тогда как хочешь, так и комбинируй значения, не плодя булевы параметры с дурацкими именами
и дополнительные значения можно легко вводить, не нарушая обратной совместимости
хоть ставь { ipv4: none, ipv6: none }
Oleg Ginzburg, [18.06.21 18:58]
вот я и думаю, можно ли сделать сразу универсально без хардкодов. Те, иметь возможность в payload юзать конструкции:
<item1>:
    - val1
    - val2
    ..
<item2>:
   - val1
   - val2
..

а на стороне API иметь конфигу вида:

allowed_op="item1"
или
deny_op="item2"

и главное - какая-то мапа этих <item> и их значений на нечто, что не потребует хака golang API, что-то типа писать маппинг:
item1_module="/root/bin/set_ip.py <args>"
item2_module="/root/bin/set_balancer_vhost.py <args>"
Egor Kuzmichev, [18.06.21 19:04]
мэпить наверное лучше а-ля руби он рейлс - convention over configuration (https://en.wikipedia.org/wiki/Convention_over_configuration) (CoC)
Oleg Ginzburg, [12.08.2021 14:56]
Еще кстати по поводу внешних IPv4 потенциальная лажа ( @aeifn FYI тоже ) - если мы даем IPv6 external, а IPv4 только приватный и идущий в инет через NAT, становится жопой если к нам придет абьюз. А это всего лишь дело времени. 

Никаких snort-ов и прочих IDS и антиспам-антидос приблуд на хостере мы не ставим, выявить среди пачки приватных адресов кто там завалил сайт правительства или наркоту толкает или спам шлет - будет проблематично
Clone this wiki locally