抢占式实例节点池最佳实践

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

抢占式实例节点池介绍

抢占式实例采用按量付费的计费方式,即先使用后付费。费用根据市场价格和计费时长进行计算。抢占式实例节点池是由抢占式实例、按量付费实例按照一定比例组合而成的节点池。

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

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

适用场景

  • 抢占式实例节点池

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

    部署在抢占式实例节点池的工作负载需要容忍所需节点资源不可用的时段,对无法容忍的应用负载建议使用按量实例或者包年包月实例的节点池。这类无法容忍的负载一般包含但不限于以下应用:

    • 集群管理工具,例如监控和操作工具。

    • 需要有状态工作负载的部署或应用程序,例如数据库。

  • 开启自动伸缩的抢占式实例节点池

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

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

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

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

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

根据控制台推荐

容器服务管理控制台提供了实例的选择建议。在创建或编辑节点池时,控制台会根据所选地域给出当前时刻所在地域有库存的实例规格,您可以通过所需资源对实例规格进行进一步筛选。在选出实例规格后,控制台会同时算出弹性强度和实例的价格区间,您可以参照弹性强度建议,添加实例规格和设置实例价格上限。

关于如何创建或编辑节点池,请参见创建和管理节点池

image

通过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)

执行以下命令,获得当前地域内最适合的实例规格配置。

accessKeyIdaccessKeySecretregion为必填参数,请根据实际业务场景填写。
./spot-instance-advisor --accessKeyId=<id> --accessKeySecret=<secret> --region=<cn-zhangjiakou>

展开查看预期输出

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)相对而言会比较高,因此在配置实例规格时,可以优先考虑前面价格较低且混沌系数较低的规格组合。

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

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

重要
  • 集群版本需为1.9以上。如需升级集群,请参见手动升级集群

  • 请确保集群可添加足够的节点数。关于节点配额说明和如何申请配额,请参见配额与限制

  • 添加已有节点时,请确保VPC中的ECS实例已绑定一个弹性公网IP(EIP),或相应VPC已配置NAT网关,确保节点能正常访问公网,避免添加失败。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 节点池页面,单击创建节点池,按照页面提示完成节点池的配置。

    下表仅介绍核心配置项。详细说明请参见创建和管理节点池

    配置项

    说明

    交换机

    推荐选择多个不同可用区的vSwitch,更好地保障集群高可用。

    付费类型

    选择抢占式实例。

    展开下方高级选项,配置以下配置项。

    扩缩容策略.png

    扩缩容策略

    • 优先级策略:根据集群配置的虚拟交换机的优先级进行扩缩容(选择的虚拟交换机的顺序,由上到下优先级递减)。当优先级较高的虚拟交换机所在可用区无法创建ECS实例时,自动使用下一优先级的虚拟交换机创建ECS实例。

    • 成本优化策略:按vCPU单价从低到高尝试创建实例。

      当节点池付费类型抢占式实例时,将优先创建抢占式计费实例。支持同时配置按量实例所占比例(%),当抢占式计费实例规格因库存等原因无法创建时,自动使用按量付费实例来补充。

    • 均衡分布策略:只有设置多个专有网络交换机时,均衡分布策略才能生效。在伸缩组指定的多可用区(即指定多个专有网络交换机)之间均匀分配ECS实例。如果由于库存不足等原因造成可用区之间不平衡,您可以再次进行均衡操作,以平衡资源的可用区分布。

    使用按量实例补充抢占式容量

    开启后,如果因价格或库存等原因无法创建足够的抢占式实例,ACK将自动尝试创建按量实例,以满足ECS实例数量要求。

    开启抢占式实例补偿

    开启后,当收到抢占式实例将被回收的系统消息时(即抢占式实例被回收前5分钟),ACK将尝试扩容新的实例进行补偿。

    如果补偿成功,ACK将对旧节点执行排水并从集群中移除;如果补偿失败,ACK将不会对旧节点执行排水。抢占式实例的主动释放可能导致业务异常。补偿失败后,当库存恢复或满足价格条件时,ACK将自动购买实例以保证期望节点数。详情请参见抢占式实例节点池最佳实践

    为提高补偿成功率,建议同时开启使用按量实例补充抢占式容量

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

查看抢占式实例到期状态

为了防止抢占式实例到期引发节点意外退出,ACK支持通过ack-node-problem-detector(NPD)组件获取实例即将释放的信息并通知给您。

如需安装NPD组件,请参见步骤一:安装ack-node-problem-detector组件

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

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点

  3. 节点页面,单击目标节点的名称或在目标节点右侧操作列选择更多 > 详情

  4. 在节点详情页面查看InstanceExpired类型的状态。

    状态区域查看InstanceExpired类型的状态。实例是否到期

    InstanceExpired的状态说明如下所示:

    InstanceExpired的状态

    说明

    True

    InstanceExpired的状态为True内容InstanceToBeTerminated,表示抢占式实例将到期,会被释放。

    False

    InstanceExpired的状态为False内容InstanceNotToBeTerminated,表示抢占式实例还未到期,可持续使用。

    Unknown

    表示插件运行错误,请提交工单解决。

    InstanceExpired的状态为True,可在事件区域看到以下的事件。实例过期event

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

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

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

监控与通知

为了让节点池中抢占式实例释放消息尽早通知到您,ACK集群通过组件NPD监控抢占式实例的预释放消息。

  • 没有监控到该抢占式实例的预释放消息时,该节点的状态中InstanceExpired值为False抢占式实例节点状态.png

  • 抢占式实例InstanceExpired值为True时,表示抢占式实例即将到期,即将被释放。ACK会通过集群事件(Kubernetes Events)通知您抢占式实例即将释放的消息。抢占式实例释放.png

开启抢占式实例补偿

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

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

重要
  • 如果由于库存等原因导致实例补偿失败,ACK将不会对旧节点执行排水。抢占式实例主动释放可能导致业务异常。补偿失败后,当库存恢复或满足价格条件时,ACK将自动购买实例以保证期望节点数。

    为提高补偿成功率,建议同时开启使用按量实例补充抢占式容量

  • 实例补偿的结果不会影响到期抢占式实例的回收。无论是否开启开启抢占式实例补偿,到期实例仍然会在预回收的5分钟后被回收释放。

抢占式实例节点预补偿.png

自定义处理行为

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