Кроме основной сети кластера виртуальную машину (ВМ) можно подключить к дополнительным сетям модуля sdn и выдать её интерфейсам адреса.

Дополнительные сетевые интерфейсы

Кроме основной сети кластера машину можно подключить к дополнительным сетям, проектным (Network) и кластерным (ClusterNetwork). Нужные сети перечисляют в блоке .spec.networks, а если этот блок не задан, машина работает только в основной сети кластера.

Для работы с дополнительными сетями необходимо, чтобы модуль sdn был активирован.

Основную сеть кластера (type: Main) указывать необязательно, и машина может работать только в дополнительных сетях. Но если основная сеть указана, она должна быть первой в списке.

Особенности дополнительных сетевых интерфейсов:

  • порядок перечисления сетей в .spec.networks определяет порядок подключения интерфейсов внутри виртуальной машины;
  • добавление или удаление дополнительной сети (Network или ClusterNetwork) на работающей ВМ применяется без перезагрузки. ACPI-индексы существующих интерфейсов сохраняются при добавлении и удалении, поэтому имена интерфейсов в гостевой ОС остаются стабильными;
  • добавление или удаление основной сети (type: Main) по-прежнему требует перезагрузки ВМ, так как она связана с основным сетевым интерфейсом пода и не может быть изменена на работающем поде;
  • чтобы сохранить порядок сетевых интерфейсов внутри гостевой операционной системы, добавляйте новые сети в конец списка .spec.networks и не меняйте порядок существующих;
  • политики сетевой безопасности (NetworkPolicy) не применяются к дополнительным сетевым интерфейсам;
  • параметры сети (IP-адреса, шлюзы, DNS и так далее) для дополнительных сетей настраиваются вручную изнутри гостевой ОС (например, с помощью Cloud-Init), если для сети не настроен IPAM, описанный в подразделе «IPAM для дополнительных сетевых интерфейсов».

Для каждого дополнительного сетевого интерфейса автоматически создаётся и резервируется уникальный MAC-адрес, что обеспечивает отсутствие коллизий MAC-адресов. Для этого служат ресурсы VirtualMachineMACAddress (vmmac) и VirtualMachineMACAddressLease (vmmacl).

MAC-адрес генерируется случайным образом из пула разрешённых диапазонов.

  • Диапазоны: x2-xx-xx-xx-xx-xx, x6-xx-xx-xx-xx-xx, xA-xx-xx-xx-xx-xx, xE-xx-xx-xx-xx-xx.
  • Первые три октета (OUI) формируются на основе UUID кластера, последние три (NIC) — выбираются случайно из 16 миллионов возможных комбинаций.

Кластерный ресурс VirtualMachineMACAddressLease (vmmacl) управляет арендой адресов из общего пула, а проектный ресурс VirtualMachineMACAddress (vmmac) отвечает за резервирование арендованных адресов и их привязку к машинам. Адрес закрепляется за машиной до её удаления.

При удалении сети из конфигурации ВМ:

  • MAC-адрес интерфейса освобождается.
  • Автоматически удаляются связанные ресурсы VirtualMachineMACAddress и VirtualMachineMACAddressLease.
  • Автоматически удаляется выделенный ресурс IPAddress (если использовался IPAM).

Ниже показано, как подключить машину к дополнительной сети:

  • В командной строке
  • В веб-интерфейсе

Перечислите нужные сети в блоке .spec.networks спецификации машины.

Пример подключения ВМ к основной сети кластера и проектной сети user-net:

spec:
  networks:
    - type: Main # Если указана, должна быть первой
    - type: Network # Тип сети (Network \ ClusterNetwork)
      name: user-net # Название сети

Пример подключения к нескольким сетям, включая кластерную сеть corp-net:

spec:
  networks:
    - type: Main # Если указана, должна быть первой
    - type: Network
      name: user-net
    - type: ClusterNetwork
      name: corp-net # Название сети

Пример подключения ВМ только к дополнительным сетям (без основной сети кластера):

spec:
  networks:
    - type: Network
      name: isolated-net
    - type: ClusterNetwork
      name: corp-net

Информацию о подключённых сетях и их MAC-адресах можно посмотреть в статусе ВМ:

status:
  networks:
    - type: Main
    - type: Network
      name: user-net
      macAddress: aa:bb:cc:dd:ee:01
    - type: ClusterNetwork
      name: corp-net
      macAddress: aa:bb:cc:dd:ee:02

Чтобы посмотреть список аренд MAC-адресов (vmmacl), используйте команду:

d8 k get vmmacl

Пример вывода:

NAME                    VIRTUALMACHINEMACADDRESS                      STATUS   AGE
mac-5e-e6-19-22-0f-d8   {"name":"vm-01-fz9cr","namespace":"pr-sdn"}   Bound    45s
mac-5e-e6-19-29-89-cf   {"name":"vm-01-99qj6","namespace":"pr-sdn"}   Bound    45s
mac-5e-e6-19-54-f9-be   {"name":"vm-01-5jqxg","namespace":"pr-sdn"}   Bound    45s

Проверить назначенные MAC-адреса можно с помощью команды:

d8 k get vmmac

Пример вывода:

NAME          ADDRESS             STATUS     VM      AGE
vm-01-5jqxg   5e:e6:19:54:f9:be   Attached   vm-01   5m42s
vm-01-99qj6   5e:e6:19:29:89:cf   Attached   vm-01   5m42s
vm-01-fz9cr   5e:e6:19:22:0f:d8   Attached   vm-01   5m42s
  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «Виртуальные машины».
  3. Из списка выберите нужную ВМ и нажмите на её имя.
  4. На вкладке «Конфигурация» прокрутите страницу до раздела «Сети» и нажмите кнопку «Добавить».
  5. В открывшемся окне «Добавить сеть» в поле «Выберите сеть» укажите нужную сеть.
  6. Нажмите кнопку «Добавить», затем — появившуюся кнопку «Сохранить».

Чтобы создать сеть проекта:

  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Сеть» → «SDN» → «Сети».
  3. Нажмите кнопку «Создать».
  4. В открывшемся окне «Создать ресурс» в поле «Имя» введите имя сети.
  5. На вкладке «Конфигурация» в поле «Сетевой класс» выберите Network-класс, в поле «Type» — тип сети, в поле «VLAN» — идентификатор VLAN. При необходимости задайте «Mtu» и параметры блока «IPAM».
  6. Нажмите кнопку «Применить».
  7. Созданные сети отображаются в списке с колонками «Статус», «Тип», «VLAN» и «Network-класс».

Именование интерфейсов и ARP Flux в гостевой ОС

При настройке сетевых интерфейсов в гостевой ОС используйте стабильные идентификаторы (предсказуемые имена enpXsY или привязку по MAC-адресу) вместо имён ethX, как описано в разделе «Именование сетевых интерфейсов в гостевой ОС».

На гостевой системе Linux с несколькими интерфейсами в одной подсети может возникать проблема ARP Flux, при которой ядро отвечает на ARP-запросы через произвольный интерфейс, а не через тот, на который пришёл запрос, что приводит к нестабильному соединению и потере пакетов из-за некорректного MAC-адреса в кеше маршрутизаторов.

Чтобы это исправить, установите параметры, которые заставляют систему отвечать на запросы строго через интерфейс с целевым IP и использовать корректный исходный адрес:

sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2

Пример для cloud-init:

write_files:
- path: /etc/sysctl.d/90-arp-strict.conf
  content: |
    net.ipv4.conf.all.arp_ignore=1
    net.ipv4.conf.all.arp_announce=2

Значения параметров описаны в документации IP sysctl.

IPAM для дополнительных сетевых интерфейсов

Адреса в дополнительной сети Deckhouse Platform (DP) может выдавать сам, если администратор настроил для этой сети пул адресов (spec.ipam.ipAddressPoolRef в модуле sdn). Тогда DP выделяет адреса дополнительным интерфейсам ВМ и доставляет их в гостевую ОС через DHCP.

Поддерживаются два режима:

  • Автоматический (DHCP) — если в .spec.networks[] не указано поле ipAddressName, контроллер автоматически создаёт ресурс IPAddress (тип Auto), привязанный к ВМ через ownerReferences, и передаёт его в модуль sdn. Модуль sdn выделяет адрес из пула и доставляет его в гостевую ОС через DHCP. Адрес сохраняется при перезагрузках и миграции ВМ, поскольку привязан к ВМ, а не к поду. Для работы этого режима в гостевой ОС на соответствующем интерфейсе должен быть включён DHCP-клиент.

  • Статический — если в .spec.networks[] указано поле ipAddressName, контроллер использует предоставленный пользователем ресурс IPAddress (тип Static, network.deckhouse.io/v1alpha1). Адрес определяется пользователем и не изменяется автоматически.

Если у дополнительной сети не настроен пул IPAM, функция IPAM не включается. Интерфейс работает в режиме L2-only, а IP-адресацию необходимо настроить вручную в гостевой ОС.

Если для дополнительной сети настроен пул IPAM, не настраивайте статический IP-адрес на дополнительном интерфейсе в гостевой ОС вручную (через Cloud-Init). Используйте автоматический (DHCP) или статический (ipAddressName) режим, чтобы избежать конфликтов адресов.

Если у дополнительной сети есть пул IPAM, но ресурс IPAddress ещё не выделен или находится в состоянии Pending (например, из-за исчерпания пула адресов), интерфейс временно пропускается. ВМ запускается без него, а в условии NetworkReady сообщается об ошибке. После появления доступного IP-адреса интерфейс подключается автоматически.

  • В командной строке
  • В веб-интерфейсе

Пример конфигурации ВМ с автоматическим выделением IP-адреса для дополнительной сети:

spec:
  networks:
    - type: Main
    - type: ClusterNetwork
      name: corp-net
      # ipAddressName не указан → используется автоматический режим (DHCP)

Пример конфигурации ВМ со статическим IP-адресом для дополнительной сети:

spec:
  networks:
    - type: Main
    - type: ClusterNetwork
      name: corp-net
      ipAddressName: my-static-ip # Имя ресурса IPAddress (SDN)

Пример конфигурации статического ресурса IPAddress:

apiVersion: network.deckhouse.io/v1alpha1
kind: IPAddress
metadata:
  name: my-static-ip
  namespace: my-namespace
spec:
  networkRef:
    kind: ClusterNetwork
    name: corp-net
  type: Static
  static:
    ip: 192.168.200.42

Выделенный IP-адрес отображается в статусе ВМ:

status:
  ipAddress: 10.66.10.2                     # IP-адрес основной сети.
  virtualMachineIPAddressName: vm-01-main-ip # Имя IPAddress основной сети.
  networks:
    - type: Main
    - type: ClusterNetwork
      name: corp-net
      macAddress: 32:a6:a1:0a:92:48
      virtualMachineMACAddressName: vm-01-rxzd6
      ipAddress: 192.168.200.4               # IP-адрес дополнительной сети (из IPAM).
  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Сеть» → «SDN» → «IP-пулы».
  3. Нажмите кнопку «Создать».
  4. В открывшемся окне «Создать ресурс» в поле «Имя» введите имя пула.
  5. На вкладке «Конфигурация» в поле «Lease TTL» задайте время жизни аренды, а в блоке «Pools» — сеть («Network»), диапазоны адресов («Ranges») и маршруты («Routes»).
  6. Нажмите кнопку «Применить».

Настройка гостевой ОС для интерфейсов, добавленных на ходу

Когда дополнительный сетевой интерфейс подключают к уже запущенной ВМ, гостевая ОС должна быть настроена на автоматический подъём новых сетевых интерфейсов и запрос DHCP-аренды. Linux по умолчанию не запускает DHCP-клиент на интерфейсах, добавленных на ходу.

Чтобы такие интерфейсы настраивались сами, используйте в гостевой ОС один из следующих подходов:

  • NetworkManager (Ubuntu, RHEL, CentOS) — автоматически настраивает новые интерфейсы с DHCP, если запущен сервис network-manager;
  • udev-правило (Alpine и другие системы без network-manager) — добавьте udev-правило для подъёма новых интерфейсов:

    write_files:
      - path: /etc/udev/rules.d/90-hotplug-network.rules
        content: |
          SUBSYSTEM=="net", ACTION=="add", RUN+="/sbin/ifup %k"
    

Для интерфейсов, присутствующих при загрузке ВМ (включённых в начальную сетевую конфигурацию), дополнительная настройка не требуется — гостевая ОС настраивает их при запуске через Cloud-Init.

Дополнительные ресурсы