重要
需要 Ansible 2.7(或更高版本)才能运行本文中的示例剧本。
Azure 虚拟机规模集 是一项 Azure 功能,可用于配置一组相同的负载均衡 VM。 规模集无需额外付费,它们是从虚拟机生成的。 只需为基础计算资源(例如 VM 实例、负载均衡器或托管磁盘存储)付费。 使用规模集时,会提供管理和自动化层来运行和缩放应用程序。 可以改为手动创建和管理单个 VM。 但是,使用规模集有两个关键优势。 它们内置于 Azure 中,可自动缩放虚拟机以满足应用程序需求。
自动调整 VM 实例数的功能称为 自动缩放。 自动缩放的好处是,它减少了监视和优化应用程序性能的管理开销。 自动缩放可以根据需求或按定义的计划进行配置。 使用 Ansible,可以指定自动缩放规则,这些规则定义积极客户体验的可接受性能。
在这篇文章中,你将学会如何:
- 定义自动缩放配置文件
- 根据周期性计划自动扩展
- 基于应用性能的自动缩放
- 检索自动缩放设置信息
- 禁用自动缩放设置
先决条件
- Azure 订阅:如果没有 Azure 订阅,请在开始之前创建 一个免费帐户 。
安装 Ansible:执行以下选项之一:
- 在 Linux 虚拟机上安装和 配置 Ansible
- 配置 Azure Cloud Shell ,如果无权访问 Linux 虚拟机, 请使用 Ansible 创建虚拟机。
- 虚拟机规模集:如果还没有规模集,可以使用 Ansible 配置规模集。
根据计划自动缩放
若要在规模集上启用自动缩放,首先要定义自动缩放配置文件。 此配置文件定义默认、最小和最大规模集容量。 这些限制可让你通过不继续创建 VM 实例来控制成本,并可使用缩小事件中保留的最小数量的实例均衡可接受的性能。
Ansible 允许按特定日期或定期计划缩放规模集。
本部分中的 playbook 代码将 VM 实例数增加到每周一 10:00 的 3 个。
将以下剧本保存为 vmss-auto-scale.yml:
---
- hosts: localhost
vars:
resource_group: myResourceGroup
vmss_name: myScaleSet
name: autoscalesetting
tasks:
- name: Create autoscaling
azure_rm_autoscale:
resource_group: "{{ resource_group }}"
name: "{{ name }}"
target:
namespace: "Microsoft.Compute"
types: "virtualMachineScaleSets"
name: "{{ vmss_name }}"
enabled: true
profiles:
- count: '3'
min_count: '3'
max_count: '3'
name: Auto created scale condition
recurrence_timezone: Pacific Standard Time
recurrence_frequency: Week
recurrence_days:
- Monday
recurrence_mins:
- '0'
recurrence_hours:
- '10'
使用 ansible-playbook 运行 playbook
ansible-playbook vmss-auto-scale.yml
基于性能数据自动缩放
如果应用程序需求增加,规模集中 VM 实例上的负载就会增加。 如果这种增加的负载是持续的,而不仅仅是暂时的需求,您可以配置自动缩放规则来增加规模集中 VM 实例的数量。 创建这些 VM 实例并部署应用程序时,规模集将开始通过负载均衡器向其分发流量。 Ansible 允许控制要监视的指标,例如 CPU 使用率、磁盘使用情况和应用加载时间。 可以根据性能指标阈值、定期计划或特定日期在规模集中进行横向缩减和横向扩展。
本节中的 playbook 代码检查前 10 分钟的 CPU 工作负载,每周一 18:00。
根据 CPU 百分比指标,剧本执行以下操作之一:
- 将 VM 实例数横向扩展到 4 个
- 将 VM 实例数扩展到 1 个
将以下脚本保存为 vmss-auto-scale-metrics.yml:
---
- hosts: localhost
vars:
resource_group: myResourceGroup
vmss_name: myScaleSet
name: autoscalesetting
tasks:
- name: Get facts of the resource group
azure_rm_resourcegroup_facts:
name: "{{ resource_group }}"
register: rg
- name: Get scale set resource uri
set_fact:
vmss_id: "{{ rg.ansible_facts.azure_resourcegroups[0].id }}/providers/Microsoft.Compute/virtualMachineScaleSets/{{ vmss_name }}"
- name: Create autoscaling
azure_rm_autoscale:
resource_group: "{{ resource_group }}"
name: "{{ name }}"
target: "{{ vmss_id }}"
enabled: true
profiles:
- count: '1'
max_count: '1'
min_count: '1'
name: 'This scale condition is executed when none of the other scale condition(s) match'
recurrence_days:
- Monday
recurrence_frequency: Week
recurrence_hours:
- 18
recurrence_mins:
- 0
recurrence_timezone: Pacific Standard Time
- count: '1'
min_count: '1'
max_count: '4'
name: Auto created scale condition
recurrence_days:
- Monday
recurrence_frequency: Week
recurrence_hours:
- 18
recurrence_mins:
- 0
recurrence_timezone: Pacific Standard Time
rules:
- cooldown: 5
direction: Increase
metric_name: Percentage CPU
metric_resource_uri: "{{ vmss_id }}"
operator: GreaterThan
statistic: Average
threshold: 70
time_aggregation: Average
time_grain: 1
time_window: 10
type: ChangeCount
value: '1'
- cooldown: 5
direction: Decrease
metric_name: Percentage CPU
metric_resource_uri: "{{ vmss_id }}"
operator: LessThan
statistic: Average
threshold: 30
time_aggregation: Average
time_grain: 1
time_window: 10
type: ChangeCount
value: '1'
使用 ansible-playbook 运行 playbook
ansible-playbook vmss-auto-scale-metrics.yml
获取自动缩放设置信息
本部分中的 playbook 代码使用 azure_rm_autoscale_facts 模块来检索自动缩放设置的详细信息。
将以下 playbook 保存为 vmss-auto-scale-get-settings.yml:
- hosts: localhost
vars:
resource_group: myResourceGroup
name: autoscalesetting
tasks:
- name: Retrieve autoscale settings information
azure_rm_autoscale_facts:
resource_group: "{{ resource_group }}"
name: "{{ name }}"
register: autoscale_query
- debug:
var: autoscale_query.autoscales[0]
使用 ansible-playbook 运行 playbook
ansible-playbook vmss-auto-scale-get-settings.yml
禁用自动缩放设置
有两种方法可以禁用自动缩放设置。 一种方法是将enabled键从true更改为false。 第二种方法是删除设置。
本部分中的 playbook 代码将删除自动缩放设置。
将以下 playbook 保存为 vmss-auto-scale-delete-setting.yml:
- hosts: localhost
vars:
resource_group: myResourceGroup
name: autoscalesetting
tasks:
- name: Delete autoscaling
azure_rm_autoscale:
resource_group: "{{ resource_group }}"
name: "{{ name }}"
state: absent
运行 playbook 使用 ansible-playbook
vmss-auto-scale-delete-setting.yml