Azure AKS中Spot实例节点预抢占后停止而非删除的问题分析
AKS Azure Kubernetes Service 项目地址: https://gitcode.com/gh_mirrors/ak/AKS
问题现象
近期在Azure Kubernetes Service(AKS)集群中,使用Spot实例作为节点池基础的计算资源时,出现了一个异常行为:尽管节点池配置了EvictionPolicy=Delete
,当Spot实例被预抢占(preempt)时,底层虚拟机规模集(VMSS)中的实例并未被删除,而是进入了"已停止"(Stopped)状态。
这种异常行为导致被抢占的节点在Kubernetes集群中长时间保持"NotReady"状态,无法自动清理。即使手动执行kubectl delete node
命令,也无法从VMSS中删除对应的虚拟机实例。
问题背景
Spot实例是云服务提供商提供的低成本计算资源,其价格通常远低于按需实例,但可能随时被回收(预抢占)。在AKS中,用户可以为节点池配置Spot实例,并通过EvictionPolicy
参数控制预抢占时的行为:
Delete
:当Spot实例被预抢占时,自动删除底层虚拟机Deallocate
:当Spot实例被预抢占时,停止但不删除底层虚拟机
正常情况下,配置为Delete
策略时,预抢占应导致实例被完全删除,而非停止。
问题影响
该问题会导致以下运维挑战:
- 集群中积累大量NotReady状态的节点,影响集群管理效率
- 资源利用率下降,因为停止的实例仍占用配额但无法提供服务
- 自动扩展策略可能受到影响,因为系统无法及时回收资源
- 需要人工干预清理这些"僵尸"节点,增加运维负担
问题原因
根据用户报告,该问题突然出现在2024年7月中旬,此前相同配置一直工作正常。这表明可能是Azure平台后端的某些变更导致了行为不一致。
从技术角度看,当Spot实例被预抢占时,AKS控制器应:
- 收到Azure元数据服务的预抢占通知
- 对节点执行优雅排空(drain)操作
- 根据配置的
EvictionPolicy
删除或停止实例 - 从Kubernetes集群中移除节点对象
在此案例中,流程在第3步出现了异常,系统错误地执行了停止操作而非删除操作。
解决方案
根据用户反馈,该问题已由Microsoft内部团队修复(ADO ticket #77030),但具体修复细节未公开。对于遇到类似问题的用户,建议:
- 检查AKS集群版本是否为最新稳定版
- 确认节点池配置中
EvictionPolicy
明确设置为Delete
- 如问题持续存在,联系Azure技术支持获取帮助
最佳实践
为避免类似问题影响业务,建议采取以下措施:
- 定期监控集群节点状态,设置NotReady节点告警
- 考虑使用自动化的节点修复方案,如Kubernetes的Node Problem Detector
- 对于关键工作负载,考虑使用混合节点池策略(部分Spot实例+部分常规实例)
- 保持AKS集群版本更新,及时应用安全补丁和功能更新
总结
AKS中Spot实例的预抢占处理是集群自动扩缩容的重要环节。此次出现的行为异常提醒我们,即使在云托管服务中,也需要建立完善的监控机制,及时发现和应对平台行为的变更。通过合理的配置和监控策略,可以最大限度地发挥Spot实例的成本优势,同时确保业务连续性。
AKS Azure Kubernetes Service 项目地址: https://gitcode.com/gh_mirrors/ak/AKS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考