You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编程监控Azure Spot VM驱逐并在其停止前优雅停止Ubuntu服务?

Azure Spot VM驱逐预警与服务优雅停止脚本(Ubuntu)

核心原理

Azure Spot VM被驱逐前5分钟,会通过**实例元数据服务(Instance Metadata Service, IMDS)**发布驱逐预警信号。我们可以通过轮询IMDS的特定端点捕获该信号,触发优雅停止流程,留存中间数据。

监控脚本实现

创建spot-eviction-monitor.sh脚本,替换YOUR_TARGET_SERVICE为需停止的服务名,并补充中间数据保存/上传的自定义逻辑:

#!/bin/bash
# 监控Azure Spot VM驱逐信号,优雅停止指定服务

TARGET_SERVICE="YOUR_TARGET_SERVICE"
EVICTION_ENDPOINT="http://169.254.169.254/metadata/scheduledevents?api-version=2019-08-01"
POLL_INTERVAL=10  # 轮询间隔(秒)

# 跳过代理访问元数据服务
export NO_PROXY="169.254.169.254"

echo "Spot VM驱逐监控脚本启动,轮询间隔${POLL_INTERVAL}秒"

while true; do
    # 获取调度事件数据
    EVENT_DATA=$(curl -s -H "Metadata: true" "${EVICTION_ENDPOINT}")
    
    # 检查是否存在驱逐事件
    if echo "${EVENT_DATA}" | grep -q "\"EventType\":\"Terminate\""; then
        echo "检测到VM驱逐预警!开始优雅停止服务..."
        
        # 1. 优雅停止目标服务
        systemctl stop "${TARGET_SERVICE}"
        if [ $? -eq 0 ]; then
            echo "服务${TARGET_SERVICE}已成功停止"
        else
            echo "停止服务${TARGET_SERVICE}失败,尝试强制停止"
            systemctl kill "${TARGET_SERVICE}"
        fi

        # 2. 自定义逻辑:保存中间数据、上传至服务器等
        # 示例:打包数据并上传(根据实际场景修改)
        # tar -czf /tmp/intermediate-data.tar.gz /path/to/your/data
        # az storage blob upload --file /tmp/intermediate-data.tar.gz --container-name your-container --name data-backup.tar.gz

        echo "优雅停止流程完成,等待VM终止"
        exit 0
    fi

    sleep "${POLL_INTERVAL}"
done

脚本部署与后台运行

  1. 赋予脚本执行权限:
chmod +x spot-eviction-monitor.sh
  1. 创建systemd服务文件/etc/systemd/system/spot-eviction-monitor.service,确保脚本开机自启:
[Unit]
Description=Azure Spot VM Eviction Monitor
After=network.target

[Service]
ExecStart=/path/to/spot-eviction-monitor.sh
Restart=always
User=root

[Install]
WantedBy=multi-user.target
  1. 启动并启用服务:
systemctl daemon-reload
systemctl start spot-eviction-monitor.service
systemctl enable spot-eviction-monitor.service

验证脚本逻辑

可通过模拟事件数据测试脚本触发流程:

# 模拟驱逐事件输出,验证脚本是否触发停止逻辑
echo '{"Events":[{"EventType":"Terminate","ResourceType":"VirtualMachine","Resources":["your-vm-name"],"EventId":"event-id","Status":{"EventStatus":"Scheduled","NotBefore":"2024-05-20T12:00:00Z"}}]}' | grep -q "\"EventType\":\"Terminate\"" && echo "触发驱逐处理逻辑"

注意事项

  • 确保VM能访问IMDS地址169.254.169.254(Azure默认允许,无需额外配置)
  • 调整POLL_INTERVAL平衡监控灵敏度与资源消耗,推荐10-30秒
  • 自定义数据处理逻辑时,需确保操作能在5分钟预警窗口内完成

内容的提问来源于stack exchange,提问作者Maxim Masiutin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:52:19