learn.lianglianglee.com/专栏/Serverless 技术公开课(完)/16 使用 Spot 低成本运行 Job 任务.md.html
2022-05-11 19:04:14 +08:00

405 lines
18 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<link rel="icon" href="/static/favicon.png">
<title>16 使用 Spot 低成本运行 Job 任务.md.html</title>
<!-- Spectre.css framework -->
<link rel="stylesheet" href="/static/index.css">
<!-- theme css & js -->
<meta name="generator" content="Hexo 4.2.0">
</head>
<body>
<div class="book-container">
<div class="book-sidebar">
<div class="book-brand">
<a href="/">
<img src="/static/favicon.png">
<span>技术文章摘抄</span>
</a>
</div>
<div class="book-menu uncollapsible">
<ul class="uncollapsible">
<li><a href="/" class="current-tab">首页</a></li>
</ul>
<ul class="uncollapsible">
<li><a href="../">上一级</a></li>
</ul>
<ul class="uncollapsible">
<li>
<a href="/专栏/Serverless 技术公开课(完)/01 架构的演进.md.html">01 架构的演进.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/02 Serverless 的价值.md.html">02 Serverless 的价值.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/03 常见 Serverless 架构模式.md.html">03 常见 Serverless 架构模式.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/04 Serverless 技术选型.md.html">04 Serverless 技术选型.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/05 函数计算简介.md.html">05 函数计算简介.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/06 函数计算是如何工作的?.md.html">06 函数计算是如何工作的?.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/07 函数粘合云服务提供端到端解决方案.md.html">07 函数粘合云服务提供端到端解决方案.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/08 函数计算的开发与配置.md.html">08 函数计算的开发与配置.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/09 函数的调试与部署.md.html">09 函数的调试与部署.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/10 自动化 CI&amp;CD 与灰度发布.md.html">10 自动化 CI&amp;CD 与灰度发布.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/11 函数计算的可观测性.md.html">11 函数计算的可观测性.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/12 典型案例 1函数计算在音视频场景实践.md.html">12 典型案例 1函数计算在音视频场景实践.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/13 典型案例 3十分钟搭建弹性可扩展的 Web API.md.html">13 典型案例 3十分钟搭建弹性可扩展的 Web API.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/14 Serverless Kubernetes 容器服务介绍.md.html">14 Serverless Kubernetes 容器服务介绍.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/15 Serverless Kubernetes 应用部署及扩缩容.md.html">15 Serverless Kubernetes 应用部署及扩缩容.md.html</a>
</li>
<li>
<a class="current-tab" href="/专栏/Serverless 技术公开课(完)/16 使用 Spot 低成本运行 Job 任务.md.html">16 使用 Spot 低成本运行 Job 任务.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/17 低成本运行 Spark 数据计算.md.html">17 低成本运行 Spark 数据计算.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/18 GPU 机器学习开箱即用.md.html">18 GPU 机器学习开箱即用.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/19 基于 Knative 低成本部署在线应用,灵活自动伸缩.md.html">19 基于 Knative 低成本部署在线应用,灵活自动伸缩.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/20 快速构建 JenkinsGitlab 持续集成环境.md.html">20 快速构建 JenkinsGitlab 持续集成环境.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/21 在线应用的 Serverless 实践.md.html">21 在线应用的 Serverless 实践.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/22 通过 IDEMaven 部署 Serverless 应用实践.md.html">22 通过 IDEMaven 部署 Serverless 应用实践.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/23 企业级 CICD 工具部署 Serverless 应用的落地实践.md.html">23 企业级 CICD 工具部署 Serverless 应用的落地实践.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/24 Serverless 应用如何管理日志&amp;持久化数据.md.html">24 Serverless 应用如何管理日志&amp;持久化数据.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/25 Serverless 应用引擎产品的流量负载均衡和路由策略配置实践.md.html">25 Serverless 应用引擎产品的流量负载均衡和路由策略配置实践.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/26 Spring CloudDubbo 应用无缝迁移到 Serverless 架构.md.html">26 Spring CloudDubbo 应用无缝迁移到 Serverless 架构.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/27 SAE 应用分批发布与无损下线的最佳实践.md.html">27 SAE 应用分批发布与无损下线的最佳实践.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/28 如何通过压测工具+ SAE 弹性能力轻松应对大促.md.html">28 如何通过压测工具+ SAE 弹性能力轻松应对大促.md.html</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/29 SAE 极致应用部署效率.md.html">29 SAE 极致应用部署效率.md.html</a>
</li>
</ul>
</div>
</div>
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
<div class="sidebar-toggle-inner"></div>
</div>
<script>
function add_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.add('show')
}
function remove_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.remove('show')
}
function sidebar_toggle() {
let sidebar_toggle = document.querySelector('.sidebar-toggle')
let sidebar = document.querySelector('.book-sidebar')
let content = document.querySelector('.off-canvas-content')
if (sidebar_toggle.classList.contains('extend')) { // show
sidebar_toggle.classList.remove('extend')
sidebar.classList.remove('hide')
content.classList.remove('extend')
} else { // hide
sidebar_toggle.classList.add('extend')
sidebar.classList.add('hide')
content.classList.add('extend')
}
}
function open_sidebar() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.add('show')
overlay.classList.add('show')
}
function hide_canvas() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.remove('show')
overlay.classList.remove('show')
}
</script>
<div class="off-canvas-content">
<div class="columns">
<div class="column col-12 col-lg-12">
<div class="book-navbar">
<!-- For Responsive Layout -->
<header class="navbar">
<section class="navbar-section">
<a onclick="open_sidebar()">
<i class="icon icon-menu"></i>
</a>
</section>
</header>
</div>
<div class="book-content" style="max-width: 960px; margin: 0 auto;
overflow-x: auto;
overflow-y: hidden;">
<div class="book-post">
<p id="tip" align="center"></p>
<div><h1>16 使用 Spot 低成本运行 Job 任务</h1>
<h3>成本优化</h3>
<p><img src="assets/2020-08-26-031132.jpg" alt="1.jpg" /></p>
<p>ECI 除了有秒级弹性、无限容量的优势之外,在一些特定场景下对成本的优化也是非常明显的,通过上图我们可以看到,相同规格的实例,在日运行时间少于 14 小时的时候,使用 ECI 会更加便宜。</p>
<p><img src="assets/2020-08-26-031133.jpg" alt="2.jpg" /></p>
<p>除了日运行时长小于 14 小时的情形ECI 实例还支持多种计费类型客户可以根据自身业务选择相应的计费模式long run 类型的可以采用 RI 实例券;运行时长低于 1 小时可以选用 Spot 竞价实例;针对突发流量部分,采用按量实例。</p>
<h3>Spot 实例概述</h3>
<p><img src="assets/2020-08-26-031135.jpg" alt="3.jpg" /></p>
<p>抢占式实例是一种按需实例,可以在数据计算等场景中降低计算成本。抢占式实例创建成功后拥有一小时的保护周期。抢占式实例的市场价格会随供需变化而浮动,我们支持两种 spot 策略,一种是完全根据市场出价,一种是指定价格上限,我们只需要给 pod 加上对应的 annotation 即可,使用方法非常简单。</p>
<p><img src="assets/2020-08-26-031137.jpg" alt="4.jpg" /></p>
<ul>
<li>SpotAsPriceGo系统自动出价跟随当前市场实际价格通常以折扣的形式体现</li>
<li>SpotWithPriceLimit设置抢占实例价格上限</li>
<li>用户价格 &lt; Spot 市场价格,实例会处于 pending 状态,并每 5 分钟自动进行一次出价,当价格等于或高于市场价格时,开始自动创建实例。运行一小时后,市场价格如果高于用户价格,则实例随时可能会被释放;</li>
<li>用户价格 &gt;= Spot 市场价格,如果库存充足则自动创建实例,按成功创建实例时的市场价格来计价,默认市场价格为小时价,将小时价除以 3600 即可得到每秒的价格。抢占式实例按秒计费;</li>
<li>用户价格 &gt;= ECI 按量实例价格,使用 ECI 按量实例价格来创建实例。</li>
</ul>
<h3>创建 Spot 实例</h3>
<p><img src="assets/2020-08-26-031138.jpg" alt="5.jpg" /></p>
<ul>
<li>根据规格查看实例按量价格,<a href="https://www.aliyun.com/price/product#/ecs/detail">点击查询</a></li>
</ul>
<p>首先我们查询出【华北 2北京地域 ecs.c5.large 按量小时价格0.62】,然后我们以此规格来创建 Spot 竞价实例。</p>
<p><img src="assets/2020-08-26-031140.jpg" alt="6.jpg" /></p>
<p>采用 Spot 实例来运行 CronJob分别采用“指定最高限价”、“系统自动出价”的方式。随市场价的场景目前还没有办法直接看到真实的价格只能根据实例 ID 查询账单信息。</p>
<p><img src="assets/2020-08-26-031141.jpg" alt="7.jpg" /></p>
<p>采用 Spot 实例运行 Deployment在本次实验中我们采用指定最高限价的策略并设置一个极低的小时价格可以看到 2 个 Pod 都创建失败了,使用 kubectl describe 命令可以看到失败的详细原因为价格不匹配The current price of recommend instanceTypes above user max price。</p>
<p><img src="assets/2020-08-26-031142.jpg" alt="8.jpg" /></p>
<p>如上图所示,当 Spot 实例运行超过 1 小时保护期后,有可能会因为库存不足,或者设置的价格小于市场价而触发实例释放,实例释放前 3 分钟会有事件通知。</p>
<h3>应用场景</h3>
<p>您可以在抢占式实例上部署以下业务:</p>
<ul>
<li>实时分析业务</li>
<li>大数据计算业务</li>
<li>可弹性伸缩的业务站点</li>
<li>图像和媒体编码业务</li>
<li>科学计算业务</li>
<li>地理空间勘测分析业务</li>
<li>网络爬虫业务</li>
<li>测试业务</li>
</ul>
<p>抢占式实例适用于无状态的应用场景,例如可弹性伸缩的 Web 站点服务、图像渲染、大数据分析和大规模并行计算等。应用程序的分布度、可扩展性和容错能力越高,越适合使用抢占式实例节省成本和提升吞吐量。</p>
<h3>注意事项</h3>
<ul>
<li><strong>如何避免出价过低导致实例抢占失败?</strong></li>
</ul>
<p>需要结合自身业务特征,并充分考虑到市场价格波动的情况下选择合理的出价。</p>
<ul>
<li><strong>系统自动出价1 小时到期后是否会被释放?</strong></li>
</ul>
<p>1 小时到期时,系统会尝试再次出价,如库存充足则不会被释放。</p>
<ul>
<li><strong>系统自动出价上限是多少?</strong></li>
</ul>
<p>不超过相同规格按量最高价(原价)。</p>
<ul>
<li><strong>是否仅支持 ECS InstanceType 形式?</strong></li>
</ul>
<p>抢占式 ECI 实例依然支持 ECS InstanceType、CPU / 内存形式两种创建方式。</p>
<ul>
<li><strong>是否支持 GPU 实例?</strong></li>
</ul>
<p>支持,跟非 GPU 方式一样。</p>
</div>
</div>
<div>
<div style="float: left">
<a href="/专栏/Serverless 技术公开课(完)/15 Serverless Kubernetes 应用部署及扩缩容.md.html">上一页</a>
</div>
<div style="float: right">
<a href="/专栏/Serverless 技术公开课(完)/17 低成本运行 Spark 数据计算.md.html">下一页</a>
</div>
</div>
</div>
</div>
</div>
</div>
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
</div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"7099747a58553d60","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
</body>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-NPSEEVD756');
var path = window.location.pathname
var cookie = getCookie("lastPath");
console.log(path)
if (path.replace("/", "") === "") {
if (cookie.replace("/", "") !== "") {
console.log(cookie)
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
}
} else {
setCookie("lastPath", path)
}
function setCookie(cname, cvalue) {
var d = new Date();
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
}
return "";
}
</script>
</html>