首页 > 其他分享 >Serverless 成本再优化:Knative 支持抢占式实例

Serverless 成本再优化:Knative 支持抢占式实例

时间:2024-04-22 13:56:08浏览次数:24  
标签:Serverless 抢占 eci 实例 Knative Pod com

作者:元毅、向先

Knative 是一款云原生、跨平台的开源 Serverless 应用编排框架,而抢占式实例是公有云中性价比较高的资源。Knative 与抢占式实例的结合可以进一步降低用户资源使用成本。本文介绍如何在 Knative 中使用抢占式实例。

背景信息

抢占式实例是一种低成本竞价型实例,您可以对阿里云当前闲置的资源出价,获得资源后运行容器,直到出价低于市场价格或者库存不足等原因导致资源回收。

Knative 是一款基于 Kubernetes 的开源 Serverless 应用编排框架,其目标是制定云原生、跨平台的 Serverless 应用编排标准。Knative 主要功能包括基于请求的自动弹性、缩容到 0、多版本管理、基于流量的灰度发布、函数部署以及事件驱动等。

Knative 与抢占实例结合

Knative 中提供了 Serverless 工作负载:Knative Service,可以基于请求自动扩缩容 Pod,使用抢占式实例的话只需要配置相应的 Pod 注解即可。而在 Virtual Node 根据 Pod 的注解自动申请对应的 ECI 资源规格。当前 Virtual Node 提供了抢占式实例自动替换能力,可以更加自动化的使用抢占式实例。

Knative 结合抢占式实例的优势:

  • Serverless 场景: 短时 web 服务请求,资源随时使用,用完即释放,不会长时间占用资源。
  • 优雅下线的天然适配: 在 Virtual Node 实现自动替换过程中,需要先删除 Pod,然后工作负载控制器再创建新的抢占式实例,这就要求业务容器具备优雅下线的能力。而在 Knative 中会为每个 Pod 设置 1 个 queue-proxy sidecar 容器,在删除 Pod 时,会先触发 queue-proxy 容器等待请求处理完成,然后再删除业务容器。
  • 成本敏感: 对于使用 Knative 用户,更关心成本,因此支持抢占式实例更具吸引力。

如何做到抢占式实例自动替换

由于 ECI 抢占式实例在市场价格高于出价或实例规格库存不足时会被回收。因此,使用 ECI 抢占式实例在带来经济性的同时,也带来了应用稳定性的挑战。为尽量避免 ECI 抢占式实例回收导致的业务中断,容器服务 Virtual Node 在 ECI 抢占式实例回收前,通过发出的 SpotToBeReleased Event 和 Pod Condition 来通知用户。可以基于这些通知,进行抢占实例的优雅退出和 Pod 轮转等处理。

优先使用抢占式实例

可以通过设置 k8s.aliyun.com/eci-spot-strategy 注解,如 SpotAsPriceGo 策略表示系统自动出价,跟随当前市场实际价格。创建后,可以稳定使用 1 小时,超出 1 小时保护期后,如果某一时刻的市场价格高于出价或实例规格库存不足,抢占式实例会被释放。在到达保护期之前,Virtual Node 会发出到期通知,然后会自动驱逐删除 Pod,然后 Knative 会自动创建新的抢占式实例 Pod,如果抢占成功,则继续通过抢占式实例提供服务。

无抢占式实例,使用标准实例

如果想尽量保证服务的稳定性,避免申请抢占实例失败导致的服务受损。可以通过配置 k8s.aliyun.com/eci-spot-fallback: true,自动转为按量付费,以保证实例创建成功。

抢占式实例中断通知

抢占式实例会在中断前 3 分钟发出 SpotToBeReleased Event,同时会更新 Pod Conditions 的 ContainerInstanceExpired 字段为 true。

Pod 的 Conditions 字段和 Events 字段显示如下。

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

为尽量避免 ECI 抢占式实例回收导致的业务中断,虚拟节点提供了可配置的 ECI 抢占式实例优雅下线的功能。您可以为抢占型 Pod 配置 annotations k8s.aliyun.com/eci-spot-release-strategy: api-evict。

那么当虚拟节点接收到 SpotToBeReleased Event 时,则会调用 Eviction API 来驱逐该抢占式实例。API 发起的驱逐将遵从您的 PodDisruptionBudgets 和 terminationGracePeriodSeconds 配置。使用 API 创建 Eviction 对象,类似于对 Pod 执行策略控制的 DELETE 操作。

  1. 调用 API 请求:虚拟节点接收到 SpotToBeReleased Event,调用 Eviction API。
  2. PDB 检查:API 服务器验证与目标 Pod 关联的 PodDisruptionBudget。
  3. 驱逐执行:如果API服务器允许驱逐,Pod 将按照如下方式删除。
    1. API 服务器中的 Pod 资源会更新删除时间戳,之后 API 服务器会认为此 Pod 资源将被终止。此 Pod 资源还会标记上配置的宽限期。
    2. 本地运行状态的 Pod 所处的节点上的 kubelet 注意到 Pod 资源被标记为终止,并开始优雅停止本地 Pod。
    3. 当 kubelet 停止 Pod 时,控制面从 Endpoint 和 EndpointSlice 对象中移除该 Pod。因此,控制器不再将此 Pod 视为有用对象。
    4. Pod 的宽限期到期后,kubelet 强制终止本地 Pod。
    5. kubelet 告诉 API 服务器删除 Pod 资源。
    6. API 服务器删除 Pod 资源。
  1. Knative Service:Knative 中会为每个 Pod 设置 1 个 queue-proxy sidecar 容器,在删除 Pod 时,会先触发 queue-proxy 容器等待请求处理完成,然后再删除业务容器。

释放说明

抢占式实例创建成功后,在保护期内可以正常运行。超出保护期后,如果市场价格高于出价或者资源库存不足,抢占式实例会被释放。可以通过以下信息了解抢占式实例的释放情况。

  • 预释放事件抢占式实例在释放前约 5 分钟,会产生 SpotToBeReleased 事件。注意:ECI 会通过 Kubernetes Events 事件通知的方式告知您抢占式实例将被释放, 在此期间,您可以做一定的处理来确保业务不受实例释放所影响。
    • 通过 kubectl describe 命令查看 Pod 详细信息,在返回信息的 Events 中可以看到预释放事件。示例如下:
    • 通过 kukubectl get events 命令查看事件信息,在返回信息中可以看到预释放事件。示例如下:
  • 释放后 Pod 状态抢占式实例释放后,实例信息仍会保留,状态变更为 Failed,Failed 原因为 BidFailed。
    • 通过 kubectl get pod 命令查看 Pod 信息,在返回信息中可以看到 Pod 状态已变更。示例如下:
    • 通过 kubectl describe 命令查看 Pod 详细信息,在返回信息中可以看到 Pod 状态信息。示例如下:
Events:
  Type     Reason            Age    From          Message
  ----     ------            ----   ----          -------
  Warning  SpotToBeReleased  3m32s  kubelet, eci  Spot ECI will be released in 3 minutes
LAST SEEN   TYPE      REASON             OBJECT         MESSAGE
3m39s       Warning   SpotToBeReleased   pod/pi-frmr8   Spot ECI will be released in 3 minutes
NAME       READY   STATUS      RESTARTS   AGE
pi-frmr8   1/1     BidFailed   0          3h5m
Status:             Failed
Reason:             BidFailed
Message:            The pod is spot instance, and have been released at 2020-04-08T12:36Z

配置方式

在 Knative Service 中添加 Annotation 来创建抢占式实例。相关 Annotation 如下:

标签:Serverless,抢占,eci,实例,Knative,Pod,com
From: https://www.cnblogs.com/alisystemsoftware/p/18150504

相关文章

  • 基于EP4CE6F17C8的FPGA矩阵键盘实例(另类方法)
    一、电路模块电路模块参见“基于EP4CE6F17C8的FPGA矩阵键盘实例”部分。二、实验代码本例使用6个数码管依次显示按下按键的键值,每位显示的值可从0~F,对应16个矩阵按键。按键reset为复位键,代码使用Verilog编写,具体如下。先编写数码管实现显示字形解码的程序,模块名称为seg_decode......
  • 迁移学习实例
    一、资源简介  这次给大家推荐一篇关于卷积神经网络迁移学习的实战资料,卷积神经网络迁移学习简单的讲就是将一个在数据集上训练好的卷积神经网络模型通过简单的调整快速移动到另外一个数据集上。  随着模型的层数及模型的复杂度的增加,模型的错误率也随着降低。但是要训练一......
  • 200 Smart的一些关于寄存器和地址相关的用法实例
    累加器200smart有AC0AC1AC2AC3四个累加器,不能作为位访问累加器大小均是32位累加器的数值不会自动清零,中断会保持并重新装载累加器(进入中断时先把原来的值保存起来,退出中断程序后恢复原程序)只有AC1/AC2/AC3可以用作指针AC0不用作指针,不用作间接寻址LDSM0.0......
  • ThreadLocal 、 实例变量、静态变量 以及 局部变量的区别
    ThreadLocal的作用ThreadLocal用于声明一个变量,这个变量在每个线程中都会创建一份实例,各个线程之间的数据不能共享,某个线程中的ThreadLocal变量与线程进行绑定,能够保证变量的线程安全。使用示例一:/***@authorErywim2024/4/16*/publicclassTemp{publ......
  • 基于python的文件seek和tell实例解析
    一概念AF.seek(偏移量,whence=相对位置)偏移量大于0的数代表向文件末尾方向移动的字节数小于0的数代表向文件头方向中移动的字节数相对位置0代表从文件头开始偏移1代表从文件当前读写位置开始偏移2代表从文件尾开始偏移Btell函数能够返回指针......
  • 解析HMI面板实例
    拆解一个已有的画面面板实例来看看画面面板是怎么实现的。使用实例,需要从项目库里面拖出来。拖出来之后画面如图,它是一个组合画面。这个画面有四个属性,以及一个事件。需要传入的数据类型FnCselInHMI属性需要传入一个bool类型数据H_lAnim需要传入一个DWORD类型......
  • 【视频】R语言支持向量回归SVR预测水位实例讲解|附代码数据
    全文链接:https://tecdat.cn/?p=35914原文出处:拓端数据部落公众号分析师:MiaoqiaoWang当我们面对样本需要建立相应模型时,使用传统统计方法建立模型需要大量的样本数据,只有在样本量足够大时,该模型才具有一定的可靠性,而实际实验中,不一定每次实验都拥有足够大的样本,甚至是小样本,这......
  • day11_我的Java学习笔记 (static_静态成员变量+静态成员方法_工具类、代码块_静态代码
    0.面向对象进阶1.static静态关键字1.1static是什么,static修饰成员变量的用法Java成员变量成员方法Python类(对象)属性类(对象)方法static修饰成员变量的应用:在线人数统计1.2static修饰成员变量的内存原理1.3static修饰成员方法的基本......
  • WPF新建viewModel实例化成员的注意事项
    不要用表达式体去初始化一个用做数据源(比如ItemSource)的引用类型成员。比如这种publicList<MainWindowItem>Items=>newList<MainWindowItem>(){newMainWindowItem{title="项目管理",icon="\ue613",type=typeof(项目管理Control),group="内部管理"},new......
  • [Microservices] Serverless Overview
    IntriductiontoSeverlessComputingDefineserverlesscomputinganddescribeitsconceptsServerlesscomputingistheconceptofbuildingandrunningapplicationsthatdonotrequireservermanagementItdescribesafiner-graineddeploymentmodelwherea......