本文介绍:

在虚拟机规模集“终结”某个具体的实例前获得通知;

 

 

视频介绍:

图文介绍:

为什么会有这样的需求?

通常情况下,我们使用vmss 会部署一些非交易的网站类型的应用,这类应用可能对规模集内的实例重启/故障/退出规模集的操作不敏感:

比如我们检测到规模集cpu利用率>70%后,触发规则自动增加一台实例到负载均衡器后,然后负载均衡将流量导向这台新增的实例;

当cpu利用率 <50%后,触发一条自动减少虚拟机实例的规则,此时vmss直接终结掉虚拟机实例,负载均衡将流量导向其他的实例;

但如果规模集的实例运营的是一些对可靠性要求非常高的应用,或者虚拟机实例里有需要维护状态的session等状况,在减少实例时,并不能直接“终结”掉该实例,否则将导致用户数据丢失,在这样的场景下,我们就需要在“终结”某个实例前,将该实例的负载转移到其他虚拟机,此时,便有了我们本文介绍的这个内容。

本文介绍,通过 SCHEDULED EVENTS 在虚拟机规模集“终结”实例前,获得通知,至于获得通知后的负载转移,则需要根据自己的实际项目进行不同的设置,本文就不举例子了。

本文参照:https://docs.microsoft.com/zh-cn/azure/virtual-machines/windows/scheduled-events#why-use-scheduled-events

使用方式:
curl -H Metadata:true http://169.254.169.254/metadata/scheduledevents?api-version=2019-08-01
结果示例:
{
    "DocumentIncarnation": {IncarnationID},
    "Events": [
        {
            "EventId": {eventID},
            "EventType": "Reboot" | "Redeploy" | "Freeze" | "Preempt" | "Terminate",
            "ResourceType": "VirtualMachine",
            "Resources": [{resourceName}],
            "EventStatus": "Scheduled" | "Started",
            "NotBefore": {timeInUTC},       
            "Description": {eventDescription},
            "EventSource" : "Platform" | "User",
        }
    ]
}

 

几个关键的属性如下:

也就是说,在vmss终结 某个实例前,你最多有15分钟的时间处理负载转移。

EventType 此事件造成的影响。

值:
  • Freeze:虚拟机计划暂停数秒。 CPU 和网络连接可能会暂停,但对内存或打开的文件没有影响。
  • Reboot:计划重启虚拟机(非永久性内存丢失)。
  • Redeploy:计划将虚拟机移到另一节点(临时磁盘将丢失)。
  • Preempt:正在删除现成虚拟机(临时磁盘将丢失)。
  • Terminate:计划将删除虚拟机。

将根据事件类型为每个事件计划将来的最小量时间。 此时间反映在某个事件的 NotBefore 属性上。

 
EventType 最小通知
冻结 15 分钟
重新启动 15 分钟
重新部署 10 分钟
Preempt 30 秒
Terminate 用户可配置:5 - 15 分钟
重点步骤,创建规模集,进入配置页面,设置虚拟机实例终结通知:

 

进入规模集的第一台虚拟机中(实际上是规模集中的任意一台虚拟机都可以),执行api调用,观察结果:
如下图 并没有任何虚拟机要终结的通知

手动修改规模集实例数量,则虚拟机规模集会删除虚拟机:

比如我们将实例数由4->3

 

重新运行命令,则有如下内容,包含要终结的虚拟机实例id等信息:

返回结果中的虚拟机将在配置的时间间隔(最大15分钟)后删除,您需要在这段时间内完成实例上负载的迁移。