Механизм подключения ВМ к сети
В подключении ВМ к любой сети (внутренней или внешней) всегда участвуют:
- порт ВМ,
- DHCP-настройки,
- гипервизор.
Это не все компоненты, которые обеспечивают сетевую связность, но именно они всегда участвуют в подключении любой ВМ к сети.
Если ВМ подключается к двум или более сетям, механизм повторяется для каждой сети: создается отдельный порт, выделяется отдельный IP-адрес и создается отдельный интерфейс в Libvirt.
Схема механизма подключения ВМ к сети приведена на рисунке 1.
При подключении ВМ к сети в OpenStack создается порт — объект, который регистрирует параметры подключения и передает их в гипервизор.
Ключевые параметры порта ВМ:
binding_host_id— узел, на котором расположен порт. Это тот же вычислительный узел, на котором расположена ВМ.device_owner— тип владельца порта. Значениеcompute:<ЗОНА_ДОСТУПНОСТИ>означает, что это порт виртуальной машины.fixed_ips— назначенный IP-адрес и идентификатор подсети.mac_address— MAC-адрес порта.
Пример информации о порте ВМ:
# openstack port show <ID_ПОРТА_ВМ>+-------------------------+------------------------------------------------------+| Field | Value |+-------------------------+------------------------------------------------------+| admin_state_up | UP || allowed_address_pairs | || binding_host_id | <ИМЯ_ВЫЧИСЛИТЕЛЬНОГО_УЗЛА> || binding_profile | || binding_vif_details | ovs_hybrid_plug='True', port_filter='True' || binding_vif_type | ovs || binding_vnic_type | normal || data_plane_status | None || description | || device_id | <ID_ВМ> || device_owner | compute:<ЗОНА_ДОСТУПНОСТИ> || device_profile | None || dns_assignment | hostname='<ИМЯ_ВМ>', ip_address='<IP-АДРЕС_ВМ>' || dns_domain | None || dns_name | <ИМЯ_ВМ> || extra_dhcp_opts | || fixed_ips | ip_address='<IP-АДРЕС_ВМ>', subnet_id='<ID_ПОДСЕТИ>' || hardware_offload_type | || hints | || id | <ID_ПОРТА> || ip_allocation | None || mac_address | <MAC-АДРЕС> || name | || network_id | <ID_СЕТИ> || numa_affinity_policy | None || port_security_enabled | True || project_id | <PROJECT_ID> || propagate_uplink_status | None || resource_request | None || revision_number | 10 || qos_network_policy_id | None || qos_policy_id | None || security_group_ids | || status | ACTIVE || tags | || trunk_details | None |+-------------------------+------------------------------------------------------+
DHCP-сервер привязывает MAC-адрес виртуальной машины к IP-адресу и сетевым настройкам (DNS, шлюз). Благодаря этому:
- ВМ получает одни и те же настройки при каждой перезагрузке.
- Можно подключить ВМ к любой сети — внутренней или внешней — и IP-адрес будет назначен автоматически.
- Не нужно задавать статический IP-адрес вручную в операционной системе ВМ — все сетевые настройки ВМ получает автоматически.
Привязка MAC-адреса ВМ к IP-адресу хранится на управляющем или сетевом узле:
# cat /var/lib/neutron/dhcp/<ID_СЕТИ>/host<MAC-АДРЕС_ВМ>,<ИМЯ_ВМ>.mcs.local.,<IP-АДРЕС_ВМ>
В операционной системе ВМ сетевой интерфейс настроен на получение параметров по DHCP:
$ ip a2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1350link/ether <MAC-АДРЕС_ВМ> brd ff:ff:ff:ff:ff:ffinet <IP-АДРЕС_ВМ>/24 metric 100 brd scope global dynamic ens3valid_lft 572893sec preferred_lft 572893sec$ sudo cat /etc/netplan/50-cloud-init.yamlnetwork:version: 2ethernets:ens3:match:macaddress: "<MAC-АДРЕС_ВМ>"dhcp4: trueset-name: "ens3"mtu: 1350
Сервис nova-compute передает гипервизору (Libvirt, KVM, QEMU) XML-файл с конфигурацией ВМ с указанием имени интерфейса и MAC-адреса. Гипервизор разворачивает ВМ с параметрами из конфигурации, а Libvirt создает tap-интерфейс. ВМ после загрузки ОС получает сетевые настройки от DHCP-сервера.
# virsh dumpxml <ИМЯ_ВМ> | grep tap<nova:port id="<ID_ПОРТА>" devname="tap<ID_ПОРТА>"/><target dev='tap<ID_ПОРТА>' managed='no'/># ip a | grep tap<ID_ПОРТА>14: tap<ID_ПОРТА>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1350 ...