Каждая виртуальная машина (ВМ) получает адрес в основной сети кластера. Ниже описано, как посмотреть выданный адрес, запросить конкретный и сохранить его за проектом.

IP-адреса ВМ

Адрес машины в основной сети кластера описывают два ресурса, аренда адреса в кластере и закреплённый за проектом адрес.

Блок .spec.settings.virtualMachineCIDRs в настройках модуля задаёт подсети, из которых машины получают IP-адреса. Доступны все адреса подсети, кроме первого и последнего.

Если в модуле sdn для основной сети кластера настроен пул адресов, адресом машины в этой сети управляет общий IPAM этого модуля, то есть тот же ресурс IPAddress, что и для дополнительных сетей. Адрес запрашивается автоматически, а существующие машины переходят на общий IPAM без смены адресов и без перезапуска.

В кластере с общим IPAM ресурсы VirtualMachineIPAddress и VirtualMachineIPAddressLease, а также параметр .spec.virtualMachineIPAddressName устарели. Они продолжают работать и описаны в разделах ниже, но адресом основной сети новых машин управляет общий IPAM, о котором рассказывает раздел IPAM для основной сети.

Кластерный ресурс VirtualMachineIPAddressLease (vmipl) управляет арендой IP-адресов из общего пула, указанного в virtualMachineCIDRs, а проектный ресурс VirtualMachineIPAddress (vmip) отвечает за резервирование арендованных адресов и их привязку к машинам. Адрес закреплён за машиной, когда ресурс переходит в фазу Attached. Остальные фазы описаны в поле .status.phase.

По умолчанию Deckhouse Platform (DP) назначает машине адрес сам и держит его закреплённым до удаления машины. Происходит это так:

  • Вы создаёте виртуальную машину с именем <VM_NAME>.
  • DP создаёт ресурс VirtualMachineIPAddress с именем <VM_NAME>-<HASH>, чтобы запросить IP-адрес и связать его с виртуальной машиной.
  • Для этого ресурса создаётся аренда VirtualMachineIPAddressLease, которая выбирает случайный IP-адрес из общего пула.
  • Как только ресурс VirtualMachineIPAddress создан, виртуальная машина получает назначенный IP-адрес.

После удаления машины ресурс VirtualMachineIPAddress тоже удаляется, но сам адрес какое-то время остаётся закреплённым за проектом, и его можно запросить повторно.

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

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

d8 k get vmipl

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

NAME             VIRTUALMACHINEIPADDRESS                             STATUS   AGE
ip-10-66-10-14   {"name":"linux-vm-7prpx","namespace":"default"}     Bound    12h

Посмотреть адрес, назначенный машине, можно командой:

d8 k get vmip

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

NAME             ADDRESS       STATUS     VM         AGE
linux-vm-7prpx   10.66.10.14   Attached   linux-vm   12h
  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «IP адреса».
  3. В списке отображаются имя ресурса, статус, адрес, тип (Auto или Static), виртуальная машина, которая использует адрес, и возраст ресурса.

Назначение конкретного IP-адреса

Вместо случайного адреса из пула машине можно выдать адрес, выбранный заранее.

  • В командной строке
  • В веб-интерфейсе
  1. Создайте ресурс VirtualMachineIPAddress:

    d8 k apply -f - <<EOF
    apiVersion: virtualization.deckhouse.io/v1alpha2
    kind: VirtualMachineIPAddress
    metadata:
      name: linux-vm-custom-ip
    spec:
      staticIP: 10.66.20.77
      type: Static
    EOF
    
  2. Создайте новую или измените существующую виртуальную машину и в спецификации укажите требуемый ресурс VirtualMachineIPAddress явно:

    spec:
      virtualMachineIPAddressName: linux-vm-custom-ip
    
  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «IP адреса».
  3. Нажмите кнопку «Создать».
  4. В открывшемся окне «Создать ресурс» в поле «Имя» введите имя ресурса.
  5. На вкладке «Конфигурация» в поле «Тип» выберите Static, а в поле «Статический IP-адрес» укажите нужный адрес.
  6. Нажмите кнопку «Применить».
  7. Укажите имя созданного ресурса в параметре .spec.virtualMachineIPAddressName виртуальной машины.

Сохранение IP-адреса за проектом

Чтобы автоматически выданный ip-адрес виртуальной машины не удалился вместе с самой виртуальной машиной выполните следующие действия.

Получите название ресурса VirtualMachineIPAddress для заданной виртуальной машины:

d8 k get vm linux-vm -o jsonpath="{.status.virtualMachineIPAddressName}"

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

linux-vm-7prpx

Удалите блок .metadata.ownerReferences из найденного ресурса:

d8 k patch vmip linux-vm-7prpx --type=merge --patch '{"metadata":{"ownerReferences":null}}'

# Или внесите аналогичные изменения, отредактировав ресурс.

d8 k edit vmip linux-vm-7prpx

После удаления виртуальной машины ресурс VirtualMachineIPAddress сохранится, и его можно будет переиспользовать снова во вновь созданной виртуальной машине:

spec:
  virtualMachineIPAddressName: linux-vm-7prpx

Даже если ресурс VirtualMachineIPAddress удалить, IP-адрес остаётся арендованным за проектом ещё 10 минут, и его можно занять снова:

d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineIPAddress
metadata:
  name: linux-vm-custom-ip
spec:
  staticIP: 10.66.20.77
  type: Static
EOF

IPAM для основной сети

Общий IPAM работает, только если в модуле sdn для основной сети кластера настроен пул адресов. Без него адресами машин управляют устаревшие ресурсы VirtualMachineIPAddress, описанные выше.

Адрес машины в основной сети хранит ресурс IPAddress модуля sdn, тот же самый, которым адресуются дополнительные сети. Получить адрес можно двумя способами:

  • Автоматический — если для сети Main не задано поле ipAddressName, контроллер создаёт ресурс IPAddress, привязанный к машине, и дожидается адреса до её запуска. Машина, которая не смогла получить адрес, остаётся в фазе Pending, а причину показывает условие VirtualMachineIPAddressReady.

  • Статический — создайте ресурс IPAddress основной сети самостоятельно и укажите его в параметре .spec.networks[]. Такой ресурс принадлежит вам, поэтому не удаляется вместе с машиной и может быть переназначен другой.

Пример статического ресурса IPAddress для основной сети:

d8 k apply -f - <<EOF
apiVersion: network.deckhouse.io/v1alpha1
kind: IPAddress
metadata:
  name: linux-vm-main-ip
spec:
  networkRef:
    kind: ClusterNetwork
    name: main
  type: Static
  static:
    ip: 10.66.20.77
EOF

Пример ссылки на этот ресурс в спецификации машины:

spec:
  networks:
    - type: Main
      ipAddressName: linux-vm-main-ip

Изменение поля ipAddressName основной сети меняет адрес основного интерфейса, поэтому требует перезапуска машины.

Текущий адрес и имя ресурса IPAddress, за которым он закреплён, показывает статус машины:

d8 k get vm linux-vm -o jsonpath='{.status.networks[?(@.type=="Main")]}'

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

{"id":1,"ipAddress":"10.66.10.14","ipAddressName":"linux-vm-4bkqr","type":"Main"}

Перевод машины на общий IPAM

Машины, которые не ссылаются на ресурс VirtualMachineIPAddress явно, переходят на общий IPAM автоматически, при этом адрес не меняется и машина не перезапускается.

Машина с заданным параметром .spec.virtualMachineIPAddressName продолжает работать по устаревшему механизму, поскольку ссылка на ресурс задана в её спецификации явно.

Для ресурса VirtualMachineIPAddress, указанного в спецификации машины, DP поддерживает ресурс IPAddress с тем же именем и тем же адресом. Чтобы перевести машину и сохранить её адрес, замените один параметр другим:

spec:
  # Удалите параметр virtualMachineIPAddressName.
  networks:
    - type: Main
      # Ресурс IPAddress с тем же именем и адресом.
      ipAddressName: linux-vm-custom-ip

Перезапустите машину, чтобы применить изменение. Адрес останется прежним, а ресурс VirtualMachineIPAddress после этого можно удалить.

Не удаляйте параметр .spec.virtualMachineIPAddressName без такой замены, иначе машина получит новый адрес из пула.

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