抢占式实例是一种按需使用的实例,相对于按量付费实例价格有一定的折扣。抢占式实例节点池是由抢占式实例、按量付费实例按照一定比例组合而成的节点池,使用抢占式实例节点池,可以节省一定的费用。本文介绍抢占式实例节点池的概念、适用场景,配置抢占式实例组合,配置抢占式实例和存量实例的比例,查看抢占式实例到期状态,以及抢占式实例到期的优雅处理方式等内容。

背景信息

抢占式实例采用按量付费的计费方式,即先使用后付费。费用根据市场价格和计费时长进行计算。更多信息,请参见抢占式实例

抢占式实例节点池介绍

抢占式实例(Spot Instance)节点池是由抢占式实例、按量付费实例按照一定比例组合而成的节点池。

抢占式实例是一种特殊按量付费实例,价格随着库存等因素动态波动,价格成本较低,相比按量实例节点最多可以节省90%成本。抢占式实例的市场价格会随供需变化而浮动,您需要在创建抢占式实例时指定出价模式,当指定实例规格的实时市场价格低于出价且库存充足时,就能成功创建抢占式实例。

抢占式实例创建成功后,操作与按量付费实例相同,您也可以将抢占式实例和其他云产品组合使用,例如云盘、公网IP地址等。抢占式实例默认有1小时的保护期。超过保护期后,每5分钟检测一次实例规格的实时市场价格和库存,如果某一时刻的市场价格高于出价或实例规格库存不足,抢占式实例会被释放。

适用场景分析

  • 抢占式实例节点池

    抢占式实例节点池由于使用抢占式实例,节点可能在不确定时刻到期被回收,因此适合用于无状态、容错性较好的应用。其中包括批处理和机器学习培训工作负载、大数据ETL(例如Apache Spark)、队列处理应用和无状态API应用等。

    部署在抢占式实例节点池的工作负载需要容忍所需节点资源不可用的时段,对无法容忍的应用负载建议使用按量实例或者包年包月实例的节点池。这类无法容忍的负载一般包含但不限于以下应用:
    • 集群管理工具,例如监控和操作工具。
    • 需要有状态工作负载的部署或应用程序,例如数据库。
  • 开启自动伸缩的抢占式实例节点池

    如果工作负载不仅可部署在抢占式实例节点池,还具有较明显的业务高低峰窗口期,建议您使用开启自动伸缩的抢占式实例节点池。

    开启自动伸缩后,集群节点自动伸缩组件会检查是否需要扩容抢占式实例节点池来部署集群中Pod,以及当节点达到缩容条件时进行自动缩容。开启自动伸缩的抢占式节点池在扩容时触发扩容速度更快,对闲置资源的释放更及时。在节点池内实例可弹出情况下,快速的弹出弥补了一部分抢占式节点池被动回收的不足,及时释放闲置资源加强了节省成本的优势。

抢占式实例组合的选择和配置

在实例规格选择上没有“最优解”,建议您选择最适合业务类型的,且在库存、成本和性能间达到最佳平衡的方案。为了满足不同业务,阿里云ECS提供了大量的实例类型,如何在实例规格中选出您需要的组合方案,特别是在竞价场景下选择出对业务可能影响最小的实例组合,是用好抢占式实例节点池的第一步。

您可以通过以下方式选择和配置抢占式实例组合:

  • 根据容器服务管理控制台推荐
    容器服务管理控制台提供了实例的选择建议。在创建或编辑节点池时,控制台会根据所选地域给出当前时刻所在地域有库存的实例规格,您可以通过所需资源对实例规格进行进一步筛选。在选出实例规格后,控制台会同时算出弹性强度和实例的价格区间,您可以参照弹性强度建议,添加实例规格和设置实例价格上限。关于如何创建或编辑节点池,请参见操作步骤抢占式实例.png
  • 通过spot-instance-advisor命令行

    容器服务开源了命令行spot-instance-advisor,以便您通过命令行获取抢占式实例的历史价格波动情况和当前价格信息。spot-instance-advisor的原理是通过API获取一个地域的实例规格与历史价格曲线,通过统计分析的方式,计算排序最低核时的机型,并通过离散度的判断计算实例价格的熵值,熵值越高表示机型的价格波动越频繁。建议您选择熵值低的机型。

    说明 下载spot-instance-advisor,请参见spot-instance-advisor
    spot-instance-advisor支持以下过滤参数:
    Usage of ./spot-instance-advisor:
      -accessKeyId string
            Your accessKeyId of cloud account
      -accessKeySecret string
            Your accessKeySecret of cloud account
      -cutoff int
            Discount of the spot instance prices (default 2)
      -family string
            The spot instance family you want (e.g. ecs.n1,ecs.n2)
      -limit int
            Limit of the spot instances (default 20)
      -maxcpu int
            Max cores of spot instances  (default 32)
      -maxmem int
            Max memory of spot instances (default 64)
      -mincpu int
            Min cores of spot instances (default 1)
      -minmem int
            Min memory of spot instances (default 2)
      -region string
            The region of spot instances (default "cn-hangzhou")
      -resolution int
            The window of price history analysis (default 7)
    执行以下命令,即可获得当前地域内最适合的实例规格配置:
    ./spot-instance-advisor --accessKeyId=<id> --accessKeySecret=<secret> --region=<cn-zhangjiakou>
    说明 accessKeyIdaccessKeySecretregion为必填参数,请根据您的实际业务场景填写。
    预期输出:
    Initialize cache ready with 619 kinds of instanceTypes
    Filter 93 of 98 kinds of instanceTypes.
    Fetch 93 kinds of InstanceTypes prices successfully.
    Successfully compare 199 kinds of instanceTypes
          InstanceTypeId               ZoneId     Price(Core)        Discount           ratio
            ecs.c6.large     cn-zhangjiakou-c          0.0135             1.0             0.0
            ecs.c6.large     cn-zhangjiakou-a          0.0135             1.0             0.0
          ecs.c6.2xlarge     cn-zhangjiakou-a          0.0136             1.0             0.0
          ecs.c6.2xlarge     cn-zhangjiakou-c          0.0136             1.0             0.0
          ecs.c6.3xlarge     cn-zhangjiakou-a          0.0137             1.0             0.0
          ecs.c6.3xlarge     cn-zhangjiakou-c          0.0137             1.0             0.0
           ecs.c6.xlarge     cn-zhangjiakou-c          0.0138             1.0             0.0
           ecs.c6.xlarge     cn-zhangjiakou-a          0.0138             1.0             0.0
         ecs.hfc6.xlarge     cn-zhangjiakou-a          0.0158             1.0             0.0
          ecs.hfc6.large     cn-zhangjiakou-a          0.0160             1.0             0.0
          ecs.hfc6.large     cn-zhangjiakou-c          0.0160             1.0             0.0
          ecs.g6.3xlarge     cn-zhangjiakou-a          0.0175             1.0             0.0
          ecs.g6.3xlarge     cn-zhangjiakou-c          0.0175             1.0             0.0
            ecs.g6.large     cn-zhangjiakou-a          0.0175             1.0             0.0
           ecs.g6.xlarge     cn-zhangjiakou-a          0.0175             1.0             0.0
          ecs.g6.2xlarge     cn-zhangjiakou-a          0.0175             1.0             1.0
          ecs.g6.2xlarge     cn-zhangjiakou-c          0.0175             1.0             3.0
            ecs.g6.large     cn-zhangjiakou-c          0.0175             1.0             30.8
           ecs.g6.xlarge     cn-zhangjiakou-c          0.0175             1.0             9.7
          ecs.hfg6.large     cn-zhangjiakou-c          0.0195             1.0             0.2
    由以上输出发现排名前几位的价格、混沌系数(对应ratio)都相对比较平稳,而后面几个实例的价格虽然也处在1折,但是混沌系数(对应ratio)相对而言会比较高,因此在配置实例规格时,可以优先考虑前面价格较低且混沌系数较低的规格组合。

配置抢占式实例和存量实例的比例

通过在节点池内配置抢占式实例和存量实例的比例,在保证节点池内有稳定的存量实例的前提下,规划抢占式实例比例可降低成本。

重要
  • 只有白名单用户可以配置节点池内抢占式实例和存量实例的比例,请提交工单申请。
  • 已创建Kubernetes集群,且集群版本大于1.9。如果您的集群版本过低,请升级集群。具体操作,请参见升级ACK集群K8s版本
    • 请确保您的集群可添加足够的节点数。如果您需要添加更多节点,请申请扩大配额,详细操作方法,请参见使用限制
    • 添加已有云服务器时,请确保您的专有网络中的ECS实例绑定一个弹性公网IP(EIP),或者相应VPC已经配置了NAT网关。您需要确保相应节点能正常访问公网,否则添加云服务器会失败。
  1. 登录容器服务管理控制台,在左侧导航栏中选择集群
  2. 集群列表页面中,单击目标集群名称,然后在左侧导航栏中,选择节点管理 > 节点池
  3. 节点池页面右上角,单击创建节点池
  4. 创建节点池对话框中,选择虚拟交换机为多个虚拟交换机,选择付费类型抢占式实例
    关于节点池的其他参数,请参见操作步骤
  5. 单击显示高级选项,在扩缩容策略选择成本优化策略,并根据规划设置按量实例所占比例(%),开启允许按量实例补偿
    扩缩容策略.png
    参数描述
    扩缩容策略
    • 优先级策略:根据您定义的虚拟交换机优先级扩缩容。当优先级较高的虚拟交换机所在可用区无法创建ECS实例时,自动使用下一优先级的虚拟交换机创建ECS实例。
    • 成本优化策略:按vCPU单价从低到高尝试创建,当伸缩配置设置了抢占式计费方式的多实例规格时,优先创建对应抢占式计费实例,当抢占式计费实例规格由于库存等原因都无法创建时,自动尝试以按量付费的方式创建。当扩缩容策略为成本优化策略时,还可以配置以下参数:
      • 按量实例所占比例:节点池实例中按量实例应占的比例,取值范围为0~100。
      • 开启抢占式实例补偿:开启后,当收到抢占式实例将被回收的系统消息时(即抢占式实例被回收前5分钟左右),伸缩组将尝试创建新的实例,替换掉将被回收的抢占式实例。
      • 允许按量实例补偿:开启后,如果因价格、库存等原因无法创建足够的抢占式实例,伸缩组会自动尝试创建按量实例满足ECS实例数量要求。
    • 均衡分布策略:在伸缩组指定的多可用区(即指定多个专有网络交换机)之间均匀分配ECS实例。如果由于库存不足等原因可用区之间变得不平衡,您可以再进行均衡操作来平衡资源的可用区分布。
      说明 只有设置了多个专有网络交换机时均衡分布策略才能生效。
    说明

    单击确认配置后:

    • 不支持修改扩缩容策略的选择项。
    • 扩缩容策略选择为成本优化策略,可以修改按量实例所占比例(%)允许按量实例补偿的配置。
  6. 单击确认配置

配置完成后,在节点池页面找到目标节点池,单击操作列中的详情,然后单击基本信息页签。在节点配置区域,可查看按量实例所占比例。

查看抢占式实例到期状态

为了防止Spot实例(即抢占式实例)到期引发节点意外退出,阿里云容器服务ACK可通过ack-node-problem-detector组件获取实例即将释放的信息并通知给您。

说明 需要提前创建Kubernetes集群且安装最新版本的ack-node-problem-detector组件。具体操作,请参见创建Kubernetes托管版集群
  • 若需要新建集群,请选中安装node-problem-detector并创建事件中心
  • 若使用已有集群,请确认ack-node-problem-detector组件为最新版本。具体操作,请参见管理组件

在阿里云容器服务ACK中,ECS实例作为节点支持着集群以及集群上运行的服务。根据ECS实例创建时的策略,某些实例(例如抢占式实例、包年包月实例)存在到期自动释放问题。若在实例自动释放时未做Pod驱逐、节点排水、节点替换等前置处理,可能影响集群服务运行情况,Master节点意外退出可能引发集群级别的故障。为了防止抢占式实例到期引发的节点意外退出问题,可通过ack-node-problem-detector组件的InstanceExpired状态获取实例即将释放的信息。

  1. 登录容器服务管理控制台,在左侧导航栏中选择集群
  2. 集群列表页面中,单击目标集群名称,然后在左侧导航栏中,选择节点管理 > 节点
  3. 节点页面,单击目标节点的名称或在目标节点右侧操作列选择更多 > 详情
  4. 在节点详情页面查看InstanceExpired类型的状态。
    状态区域查看InstanceExpired类型的状态。实例是否到期
    InstanceExpired的状态说明如下所示:
    InstanceExpired的状态说明
    TrueInstanceExpired的状态为True内容InstanceToBeTerminated,表示抢占式实例将到期,会被释放。
    FalseInstanceExpired的状态为False内容InstanceNotToBeTerminated,表示抢占式实例还未到期,可持续使用。
    Unknown表示插件运行错误,请提交工单解决。
    若InstanceExpired的状态为True,可在事件区域看到以下的事件。实例过期event

InstanceExpired的状态为True,表示抢占式实例将到期释放。若您需要继续使用该节点上的服务,请将应用调度到其他节点上。具体操作,请参见调度应用Pod至指定节点

抢占式实例到期的优雅处理方式

抢占式实例到期的优雅处理方式主要包括:监控与通知、节点预补偿与策略、自定义处理行为。

  • 监控与通知
    为了让节点池中抢占式实例释放消息尽早通知到您,ACK集群通过组件NPD监控抢占式实例的预释放消息。
    • 没有监控到该抢占式实例的预释放消息时,该节点的状态中InstanceExpired值为False抢占式实例节点状态.png
    • 抢占式实例InstanceExpired值为True时,表示抢占式实例即将到期,即将被释放。ACK会通过集群事件(Kubernetes Events)通知您抢占式实例即将释放的消息。抢占式实例释放.png
  • 节点预补偿与策略

    抢占式实例的到期释放是影响节点上业务负载稳定性的一个关键因素。容器服务ACK已经从配置、开启自动伸缩到监控通知各种维度提供了方法去快速响应抢占式实例到期释放事件。这些处理方式的处理时间点都在抢占式实例到期回收之后,在回收到新实例补充这段时间集群可用资源仍然会减少。为尽量缩短甚至消除这段时间影响,ACK利用节点预补偿功能,在到期实例还未回收前就触发弹出补偿实例。

    开启节点预补偿后,ACK会自动监控节点实例是否即将被释放。当ACK监控到节点实例即将被释放时,会自动触发弹出新节点的伸缩活动。这个为了补充即将被释放实例而弹出的实例,称为补偿实例。补偿实例成功运行后,会触发到期抢占式实例的缩容和释放,缩容释放策略包括cordon节点(将节点设置为不可调度)、排水节点、将节点移除等节点优雅下线处理,尽量让到期抢占式实例节点上的业务负载平稳迁移到集群中其他节点上,避免业务受到实例到期的影响。

    说明 节点预补偿的结果不会影响到期抢占式实例的回收。无论是否开启节点预补偿,到期实例仍然会在预回收的5分钟后被回收释放掉。
    抢占式实例节点预补偿.png
  • 自定义处理行为

    在许多实际业务场景中,节点下线需要执行比一般优雅下线更多的步骤,例如即将下线的节点信息需要从注册的DNS中心移除。结合监控与通知,此类需求建议您监控节点状态中的InstanceExpired或者监听InstanceToBeTerminated事件。收到节点实例到期或将被释放消息后,即可把该节点作为即将下线处理,然后执行自定义的处理行为。关于监控抢占式实例到期状态的具体操作,请参见查看抢占式实例到期状态