Каждая виртуальная машина (ВМ) получает адрес в основной сети кластера. Ниже описано, как посмотреть выданный адрес, запросить конкретный и сохранить его за проектом.
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
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «IP адреса».
- В списке отображаются имя ресурса, статус, адрес, тип (
AutoилиStatic), виртуальная машина, которая использует адрес, и возраст ресурса.
Назначение конкретного IP-адреса
Вместо случайного адреса из пула машине можно выдать адрес, выбранный заранее.
- В командной строке
- В веб-интерфейсе
-
Создайте ресурс 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 -
Создайте новую или измените существующую виртуальную машину и в спецификации укажите требуемый ресурс VirtualMachineIPAddress явно:
spec: virtualMachineIPAddressName: linux-vm-custom-ip
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «IP адреса».
- Нажмите кнопку «Создать».
- В открывшемся окне «Создать ресурс» в поле «Имя» введите имя ресурса.
- На вкладке «Конфигурация» в поле «Тип» выберите
Static, а в поле «Статический IP-адрес» укажите нужный адрес. - Нажмите кнопку «Применить».
- Укажите имя созданного ресурса в параметре
.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 без такой замены, иначе машина получит новый адрес из пула.