6个优化策略,助你降低K8S成本
Kubernetes 早已成为容器编排引擎的事实标准,而随着 Kubernetes 环境的复杂性持续增长,成本也在不断攀升。CNCF 发布的调查报告《Kubernetes 的 FinOps》显示,68%的受访者表示 Kubernetes 开销正在上涨,并且一半的人所在的组织经历了每年超过20%的开销增长。
因此,Kubernetes 成本管理和优化亟需得到系统管理员的重视。本文我们将了解6个优化 Kubernetes 成本的策略和方法。
1、合理调整 Pod 和节点
降低成本最简单的方式之一是管理 Pod 和节点使用的资源。尽管通常的建议是留有足够的机动空间,但过度配置或允许应用程序无限制地使用资源会带来灾难性的后果。例如,假设一个Pod由于应用程序的错误而消耗了节点的所有可用内存,不必要地利用了资源,这会导致其他 Pod 完全没有资源可用。
为避免这一情况的发生,用户可以在命名空间级别用 Kubernetes 资源配额和限制区间来限制资源利用率。此外,还可以在容器层面上指定资源请求和限制,强制执行容器可以请求多少资源以及资源的最大限制。
节点的大小取决于 Pod 所使用的资源。如果你的工作负载只利用了节点中50%的资源,并且短期内资源使用量不会激增,那么用户可以适当缩小节点的规模以降低成本。
另一个考虑因素是调整在单个节点上可以运行的 Pod 数量。即便在没有硬性限制的情况下,在单个节点上运行大量的 Pod 也会导致资源利用效率低下。鉴于这类情况,一部分K8S的托管服务提供商已经限制了单个节点上可以运行 Pod 的数量。
2、监控集群和基础设施
合理监控集群环境,包括底层或依赖项资源,有助于管理成本。无论你是使用托管的 Kubernetes 集群还是自建的集群,监控资源利用率和总体成本都是降低成本的第一步,这能够让用户一目了然地了解计算、存储、网络利用率等情况,以及成本在它们之间的分布情况。
云厂商通常能够提供内置工具和基本的监控功能。而利用 Prometheus、Kubecost 等工具可以让用户获得更为全面的洞察。近日发布的应用统一部署与管理平台 Seal AppManager 中也内置了成本管理视图,提供 Kubernetes 的资源开销、共享费用(如空闲费用、管理费用)的成本汇算和分摊,并内置多维度成本分析视图为用户提供成本洞察。另外,用户也可以依据集群、项目、应用等维度自定义成本视图。

3、配置弹性伸缩
Kubernetes 支持3类弹性伸缩:
- HPA:自动水平伸缩
- VPA:垂直自动伸缩
- 集群自动伸缩
自动充分利用 Kubernetes 弹性伸缩的特性可以帮助用户以一种简单、高效的方式降低整体 Kubernetes 成本。
HPA 可以监控 Pod 的使用情况,自动调整大小,以保持预期的使用水平。VPA 则可以调整集群中的资源请求和容器限制。自动伸缩会根据需求自动从 Kubernetes 集群中添加或删除节点,它有助于确保工作负载总是有足够的基础设施资源来完成它们的工作,但又不至于让用户最终为闲置的基础设施付费。
现阶段而言,并非所有的 Kubernetes 服务或发行版都支持自动伸缩。但是,如果你所采用的服务支持,那么它可以帮助你大幅降低 Kubernetes 成本。
4、为 K8s 工作负载选择不同的购买策略
对于 AWS 或者 GCP 来说,按需实例是最昂贵的选项。因此,我们应该充分利用预留的实例甚至是 Spot instances(竞价型实例)。
相较于按需价格,Spot instances 最高可获得90%的折扣(即1折)。它们是短期工作或无状态服务的最佳选择,可以快速重新调度,同时不会丢失数据。为避免中断,用户可以使用工作负载管理工具,将 Spot 实例保留在某个固定时段内。
为每个节点都规划购买策略,并在可能的情况下优先使用 Spot 实例,以充分利用购买折扣。如果 Spot 实例不适合你的工作负载,比如你的容器正在运行数据库,那么可以购买具备稳定可用性的节点。在任何情况下,尽量减少使用按需资源。
5、Kubernetes 调度
调整 Pod 和节点的大小和规模后,需要确保 pod 被调度到了正确的节点上。K8s 调度流程将 Pod 与节点相匹配,并且调度器的默认行为可以自定义。假设你想把具有关键业务功能的容器放在一个高性能的节点上,而把其他不太关键的组件放在相对较低性能的节点上。默认情况下,即便在不同性能层上配置节点,K8s 也无法匹配正确的节点。
如果一个非关键的pod被安排在一个高性能的节点上,会导致性能浪费并最终提高成本。Kubernetes 提供诸如 nodeSelector、亲和性以及污点和容忍等特性以解决此类问题并优化调度。它们可以用来完全配置Kubernetes的调度过程,以满足用户的需求,从而使用户能够有效地使用整个节点的可用资源。
6、简化开发
尽管容器化的浪潮愈演愈烈,但并不意味着一切都需要容器化。一些开发团队试图为了容器化而容器化应用程序或工作负载,这可能会导致在 Kubernetes 集群上运行不必要的工作负载。这类工作负载在其他技术上也可以轻松运行,并且成本会更低。譬如,可以将无服务器技术用于基于事件的特性,而主要将 Kubernetes 用于高可用性和关键任务的功能。
总结
成本管理并不总是开发人员的最高优先级,但是确实是必须考虑的方面。正确的解决方案可以使Kubernetes的成本管理变得及时、经济和毫不费力,使企业能够在成本和性能之间实现完美的平衡。
利用不同的云供应商建立多云环境可以使用户从每个平台提供的折扣中获益,甚至可以在平台之间迁移工作负载以选择最优惠的选项,同时不会出现服务中断或服务质量下降的情况。另外,也可以选择使用不同的技术,将功能卸载到最符合要求的技术或服务上。这种选择可以在有效管理整个应用程序的同时,更深度地管理成本。
6个优化策略,助你降低K8S成本的更多相关文章
- 直播推流端弱网优化策略 | 直播 SDK 性能优化实践
弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...
- SQL优化策略高级优化经常使用-1(The Return Of The King)
1 经常使用的优化策略 1.1 语句 1.1.1使用实际的列名 当我们查询SQL语句时.你是否觉得使用实际的列名比使用*更快呢?答案是肯定的. 为了证实这一点,感兴趣的朋友能够自己验证一下.我这 ...
- mysql 30大优化策略
mysql 30大优化策略 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 wher ...
- 常见性能优化策略的总结 good
阅读目录 代码 数据库 缓存 异步 NoSQL JVM调优 多线程与分布式 度量系统(监控.报警.服务依赖管理) 案例一:商家与控制区关系的刷新job 案例二:POI缓存设计与实现 案例三:业务运营后 ...
- EasyPlayer-RTSP-Android安卓播放器播放RTSP延迟优化策略,极低延时!
EasyPlayer-RTSP-Android安卓RTSP播放器低延迟播放延时优化策略 EasyPlayer-RTSP-Android播放器是一款专门针对RTSP协议进行过优化的流媒体播放器,其中我们 ...
- MIC性能优化策略
MIC性能优化主要包括系统级和内核级:系统级优化包括节点之间,CPU与MIC之间的负载均衡优化:MIC内存空间优化:计算与IO并行优化:IO与IO并行优化:数据传递优化:网络性能优化:硬盘性能优化等. ...
- EasyPlayer Android安卓RTSP服务器低延时再优化策略
EasyPlayer低延迟再优化策略 EasyPlayer是一款专门针对RTSP协议进行过优化的播放器.其中两个我们引以为傲的的优点就是起播快和低延迟.最近我们遇到一些需求,其对延迟要求非常苛刻,于是 ...
- EasyPlayer Android RTSP播放器延迟再优化策略
EasyPlayer延迟再优化策略 EasyPlayer是一款专门针对RTSP协议进行过优化的播放器.其中两个我们引以为傲的的优点就是起播快和低延迟.最近我们遇到一些需求,其对延迟要求非常苛刻,于是我 ...
- c++ 性能优化策略
c++ 性能优化策略 作者:D_Guco 来源:CSDN 原文:https://blog.csdn.net/D_Guco/article/details/75729259 1 关于继承:不可否认良好的 ...
- MySQL中的SQL的常见优化策略
MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 1 避免全表扫描对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 ...
随机推荐
- CV入坑
https://www.cnblogs.com/fldev/p/14360149.html
- 宝塔linux面板进行数据库操作显示"数据库管理密码"
在使用宝塔linux面板时,对数据库进行操作之后,显示数据库管理密码错误.经历了卸载数据库并删除了数据库文件和olddata, 在从新安装,仍然显示数据库管理密码错误. 这时,我们可以进入到 /www ...
- C语言编译概念理解
1.编译与CPU.操作系统的联系 参考:https://blog.csdn.net/dong_daxia/article/details/95328479?ops_request_misc=%257B ...
- selenium--- 数据驱动测试 ddt
通过使用数据驱动测试的方法,可以在需要验证多组数据的测试场景中,使用外部数据源实现对输入值和期望值的参数化,从而避免在测试中仅使用硬编码的数据.将测试数据和测试脚本分离开,使得测试脚本在不同数据集合下 ...
- [UnityAI]行为树的中断机制
参考链接: https://www.cnblogs.com/01zxs/p/9863715.html https://blog.csdn.net/AcmHonor/article/details/12 ...
- P2962 [USACO09NOV]Lights G(Meet In The Middle)
[USACO09NOV]Lights G 题目描述 给出一张n个点n条边的无向图,每个点的初始状态都为0. 你可以操作任意一个点,操作结束后该点以及所有与该点相邻的点的状态都会改变,由0变成1或由1变 ...
- 微信开发 回复用户消息 .net C#
前段时间开发了公司的微信 这里做个知识总结分享下经验,望一起学习..... 感觉后面写个系列的最好了 .... 企业需求: 给指定企业用户发送消息:如考勤信息. 企业通知.个人信息推送等等, /// ...
- 关于k8s微服务的基础知识分享总结
1.说起k8s,先得讲讲微服务,来个图(百度上找到的图),初识 1.微服务架构强调的是一种架构模式,提倡将单一的应用程序,划分为一组小的服务,每个服务运行在其独立的自己的进程中,服务之间相互协调配合, ...
- progress监视linux命令进程
progress监视linux命令进程 可以查看哪些命令进程 cp mv tar dd gzip cat grep 如何在ubuntu安装 sudo apt install progress 使用方法 ...
- [Python]语音识别媒体中的音频到文本
@ 目录 准备工作 视频转音频 识别音频到文本 音频直接转换文本 准备工作 安装python3环境 申请一个可用的语音转换API,此篇以Microsoft Azure Speech为例 在Micros ...