如何编程监控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
脚本部署与后台运行
- 赋予脚本执行权限:
chmod +x spot-eviction-monitor.sh
- 创建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
- 启动并启用服务:
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
相关产品推荐
相关产品推荐

