Как уменьшить конкретный экземпляр в AutoScalingGroup?

Я использую Heat для реализации автоматического масштабирования, ниже приведена короткая часть моего кода:

heat_template_version: 2016-10-14
...

resources:
    corey_server_group:
        type: OS::Heat::AutoScalingGroup
        depends_on: corey-server
        properties:
            min_size: 1
            max_size: 5
            resource:
                type: CoreyLBSServer.yaml
                properties:
......

CoreyLBSServer.yaml

heat_template_version: 2016-10-14
...

resources:
    server:
    type: OS::Nova::Server
    properties:
        flavor:
......

Я нахожу способ уменьшить конкретный экземпляр, вот некоторые из них, которые я пробовал, но все они не сработали, всегда уменьшается самый старый экземпляр.

1. Завершите работу экземпляра, затем сообщите о политике масштабирования. (X)
2.Согласно this, найдите идентификатор стека из атрибута refs_map, пометьте ресурс server как unhealthy, затем сигнализируйте политику масштабирования. (X)
3. Найдите идентификатор стека из атрибута refs_map, установите статус стека как FAILED, затем сигнализируйте политику масштабирования. (ИКС)

Я попытался выяснить, какую стратегию использует AutoScalingGroup при масштабировании, из кода heat/common/grouputils.py, он сортирует участников по created_time, а затем по имени, поэтому самый старый член будет удален первым при уменьшении масштаба. Но есть исключение: если установлено include_failed, неудачные участники будут помещены первыми в список, отсортированный по created_time, а затем по имени.

Обновить

Я, наконец, успешно установил свою цель как неудачную, вот команда:

# firstly, print the physical_resource_id of corey_server_group
openstack stack resource show -c physical_resource_id <parent_stack_id> corey_server_group

# secondly, list resources in the corey_server_group
openstack stack resource list <physical_resource_id>

# thirdly, mark the target as unhealthy  
openstack stack resource mark unhealthy <physical_resource_id> <resource_name>

# after these commands, you will see the resource_status of the target becomes "Check Failed"

Но у него есть еще одна проблема: Heat удалит как неисправный, так и самый старый ресурс при уменьшении масштаба! Как уменьшить масштаб только цели, отмеченной как неудачная?


person Corey    schedule 02.12.2020    source источник


Ответы (1)


После нескольких дней отслеживания я наконец нашел способ уменьшить масштаб конкретного экземпляра в AutoScalingGroup.

Давайте сначала взглянем на исходный код: heat/common /grouputils.py#L114

Отсортируйте список экземпляров сначала по created_time, а затем по имени. Если установлено include_failed, неудачные участники будут помещены первыми в список, отсортированный по created_time, а затем по имени.

Как видите, include_failed по умолчанию установлено на False, поэтому нездоровые участники не будут включены в список, поэтому процедура, описанная в моем вопросе, не сработала.

Если вы хотите включить функцию уменьшения масштаба конкретного экземпляра, вы должны явно определить include_failed=True при вызове функций, ниже приведена часть моего кода:

heat/engine/resources/aws/autoscaling/autoscaling_group.py введите здесь описание изображения

Поскольку я использую AutoScalingGroup, мне нужно изменить два файла:
heat/engine/resources/aws/autoscaling/autoscaling_group.py
heat/engine/resources/openstack/heat/autoscaling_group.py

Перезапустите службы Heat, затем вы можете пометить цель как неработоспособную и указать политике уменьшить масштаб конкретного экземпляра:

openstack stack resource mark unhealthy <physical_resource_id> <resource_name>
openstack stack resource signal <parent_stack_id> your_scaledown_policy

К вашему сведению, в таблице показано различное поведение между False и True (scaling_adjustment=1).

                   | include_failed=False (default) | include_failed=True  
                   |                                |
Scale Up           | Add one instance               | Add one instance
                   |                                |
Scale down         | Remove the oldest              | Remove the oldest
                   |                                |
Stack Update       | Nothing changed                | Nothing changed
                   |                                |
Unhealthy + Up     | Add one & remove unhealthy     | Add one & fix unhealthy
                   |                                |
Unhealthy + Down   | Remove one & remove unhealthy  | Remove the unhealthy one
                   |                                |
Unhealthy + Update | Fix unhealthy                  | Fix unhealthy
person Corey    schedule 31.12.2020