Placement: управление ресурсами

Бывают случаи, когда в результате неудачной миграции, перестройки инстанса или по другой причине, в реестре nova остается инстанс со статусом error, который никак не удалить штатным образом (CLI, GUI).

Запишем UUID проблемного инстанса:

VM_UUID="b32e5792-427c-43b1-83dc-2d3e3c8d74c4"

Для начала надо убрать с этой ВМ все дополнительные диски и снимки, если они есть и если это возможно.

Далее, мы вынуждены удалить проблемную виртуалку с помощью такого запроса в СУБД:

update instances set deleted=1, deleted_at=now(), vm_state="deleted" where uuid="${VM_UUID}";

!! Конечно, так поступать надо только в крайнем случае, когда все правильные варианты исчерпаны.

Если запросить данные о этой ВМ:

openstack server show $VM_UUID
No server with a name or ID of 'b32e5792-427c-43b1-83dc-2d3e3c8d74c4' exists.

То получим ответ, что такой ВМ не существует.

На гипервизоре остается информация о занятых этой “удаленной” ВМ ресурсах. В логе это выглядит примерно таким образом:

2024-10-02 12:07:18.800 1590924 WARNING nova.compute.resource_tracker [None req-f8320401-70fb-4532-8d87-e5240e53f68b - - - - - -] Instance b32e5792-427c-43b1-83dc-2d3e3c8d74c4 is not being actively managed by this compute host but has allocations referencing this compute host: {'resources': {'VCPU': 12, 'MEMORY_MB': 32768, 'DISK_GB': 80}}. Skipping heal of allocation because we do not know what to do.
2024-10-02 12:07:35.608 1590924 WARNING nova.compute.manager [None req-f8320401-70fb-4532-8d87-e5240e53f68b - - - - - -] While synchronizing instance power states, found 1 instances in the database and 2 instances on the hypervisor.

Здесь явно видно, что на гипервизоре фактически есть две ВМ, а по данным из БД - 1.

Предварительно надо записать сколько vCPU, RAM и Disk занимала эта ВМ, например: 12, 32768, 80.

Далее описывается последовательность действий для исправления другой служебной информации, в частности о потребляемых этой ВМ ресурсах.

  1. Находим идентификатор ресурсного провайдера для нашего хоста cmpt-c10z02-c1002:
HOST="cmpt-c01z02-c1002"
RPL_UUID=$(openstack --os-placement-api-version 1.12 resource provider list | grep ${HOST} | awk '{print $2}')
echo $RPL_UUID
151ad1bd-d4dc-4211-a1e7-d13920c50248
  1. Смотрим детальную информацию по этому uuid:
openstack --os-placement-api-version 1.12 resource provider show --allocations $RPL_UUID
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field       | Value                                                                                                                                                                                           |
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| uuid        | 151ad1bd-d4dc-4211-a1e7-d13920c50248                                                                                                                                                            |
| name        | cmpt-c01z02-c1002                                                                                                                                                                               |
| generation  | 17                                                                                                                                                                                              |
| allocations | {'e206c8a1-556d-4a12-b3ec-ab275c7f3274': {'resources': {'VCPU': 2, 'MEMORY_MB': 8192, 'DISK_GB': 80}}, 'b32e5792-427c-43b1-83dc-2d3e3c8d74c4': {'resources': {'VCPU': 12, 'MEMORY_MB': 32768,   |
|             | 'DISK_GB': 80}}}                                                                                                                                                                                |
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  1. Мы знаем, что удаленная ВМ содержала 12 vCPU и 32Гб RAM - соответственно смотрим информацию о размещенных ресурсах по конкретному allocation uuid = b32e5792-427c-43b1-83dc-2d3e3c8d74c4 :
AL_UUID="b32e5792-427c-43b1-83dc-2d3e3c8d74c4"
openstack --os-placement-api-version 1.12 resource provider allocation show $AL_UUID
+--------------------------------------+------------+-------------------------------------------------+----------------------------------+----------------------------------+
| resource_provider                    | generation | resources                                       | project_id                       | user_id                          |
+--------------------------------------+------------+-------------------------------------------------+----------------------------------+----------------------------------+
| 151ad1bd-d4dc-4211-a1e7-d13920c50248 |         17 | {'VCPU': 12, 'MEMORY_MB': 32768, 'DISK_GB': 80} | 8b4e913924bb4d9da158244e308bb1c5 | 2f065cf6db5d4ec3b5978ea8a01622f3 |
+--------------------------------------+------------+-------------------------------------------------+----------------------------------+----------------------------------+
  1. Для примера, мы можем изменить эти значения на другие - например, минимальные:
openstack --os-placement-api-version 1.12 resource provider allocation set --allocation rp=$RPL_UUID,DISK_GB=1,MEMORY_MB=1,VCPU=1 --project-id 8b4e913924bb4d9da158244e308bb1c5 --user-id 2f065cf6db5d4ec3b5978ea8a01622f3 $AL_UUID
+--------------------------------------+------------+-------------------------------------------+----------------------------------+----------------------------------+
| resource_provider                    | generation | resources                                 | project_id                       | user_id                          |
+--------------------------------------+------------+-------------------------------------------+----------------------------------+----------------------------------+
| 151ad1bd-d4dc-4211-a1e7-d13920c50248 |         18 | {'DISK_GB': 1, 'MEMORY_MB': 1, 'VCPU': 1} | 8b4e913924bb4d9da158244e308bb1c5 | 2f065cf6db5d4ec3b5978ea8a01622f3 |
+--------------------------------------+------------+-------------------------------------------+----------------------------------+----------------------------------+

Здесь нельзя задать нулевые значение - только положительные целые числа.

  1. Но наша задача состоит в том, чтобы вообще убрать эту информацию от $AL_UUID - а сделать это мы можем такой командой:
openstack --os-placement-api-version 1.12 resource provider allocation delete $AL_UUID
  1. Проверим, что информация убралась из потребленных ресурсов:
openstack --os-placement-api-version 1.12 resource provider show --allocations 151ad1bd-d4dc-4211-a1e7-d13920c50248
+-------------+--------------------------------------------------------------------------------------------------------+
| Field       | Value                                                                                                  |
+-------------+--------------------------------------------------------------------------------------------------------+
| uuid        | 151ad1bd-d4dc-4211-a1e7-d13920c50248                                                                   |
| name        | cmpt-c01z02-c1002                                                                                      |
| generation  | 18                                                                                                     |
| allocations | {'e206c8a1-556d-4a12-b3ec-ab275c7f3274': {'resources': {'VCPU': 2, 'MEMORY_MB': 8192, 'DISK_GB': 80}}} |
+-------------+--------------------------------------------------------------------------------------------------------+
  1. Далее, дадим из контроллера команду на урегулирование несоответствия размещенных ресурсов:
nova-manage placement heal_allocations --instance $VM_UUID --verbose --force
  1. Перезапустим сервис nova-compute на сервере cmpt-c01z02-c1002, ждем несколько минут и видим в логе, что и теперь не соответствует:
While synchronizing instance power states, found 1 instances in the database and 2 instances on the hypervisor.
  1. Смотрим, какие ВМ числятся на гипервизоре:
 virsh list --all
 Id   Name                State
------------------------------------
 1    instance-000150f0   running
 -    instance-000150a8   shut off

virsh dominfo instance-000150a8
Id:             -
Name:           instance-000150a8
UUID:           b32e5792-427c-43b1-83dc-2d3e3c8d74c4
OS Type:        hvm
State:          shut off
CPU(s):         12
Max memory:     33554432 KiB
Used memory:    33554432 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: apparmor
Security DOI:   0
  1. Убираем определение этой ВМ:

    virsh undefine instance-000150a8
    
    11. Вот теперь в логе nova-compute.log все хорошо - сообщение о несоответствии не выдается.

Опубликовано: 02.10.2024