QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

优化容器工作负载:Kubernetes 装箱的效益和挑战

作者 | Omer Hamerman

  • 2023-12-21
    北京
  • 本文字数:3768 字

    阅读完需:约 12 分钟

大小:1.81M时长:10:30
优化容器工作负载:Kubernetes装箱的效益和挑战

Kubernetes 已经成为容器编排事实上的标准,因此企业不断寻求优化其集群资源利用的方法。其中一种技术是装箱(bin packing):在集群中有效地分配资源,以最小化运行工作负载所需的节点数量。装箱使得企业能够通过减少支持应用程序所需的节点数量来降低成本。

 

在 Kubernetes 中,装箱的概念涉及在节点内部战略性地放置容器或“箱子(bin)”,以最大化资源利用率和减少资源浪费。如果实施得当,可以实现对硬件资源更有效的利用,并降低基础设施成本。在云环境中,这尤为重要,因为基础设施支出占据 IT 开支的相当大部分。

 

在本文中,我们将探讨在 Kubernetes 中进行装箱的复杂性,讨论与这种方法相关的挑战和权衡,并提供在企业中实现装箱的示例和最佳实践。

 

Kubernetes 装箱挑战

 

尽管 Kubernetes 中的装箱在资源利用和成本节约方面提供了显著的好处,但也带来了一些需要解决的问题。

 

密度与工作负载隔离和分发

 

实现装箱的一个主要问题是在最大化资源密度和保持工作负载隔离性之间找到平衡,同时要确保工作负载分布在系统和可用区(AZ)中,以御硬件故障。将容器高密度地打包到节点上可以提高资源利用率,但也可能增加对共享资源(如 CPU 和内存)争用的风险。

 

这可能导致性能下降,并可能影响整个集群的稳定性。此外,过度的装箱可能与分配的概念相矛盾,降低系统抵御硬件故障的能力。因此,我们有必要明智地并只在用例有意义的情况下应用装箱策略。

 

为了更深入地理解这种权衡的含义,有必要考虑密度的增加对集群容错性所造成的影响。当容器被高密度地打包到较少的节点上时,单个节点的故障可能对应用程序的整体健康和可用性产生更大的影响。这带来了一个问题:在节省成本的同时,如何确保你的工作负载对潜在故障的弹性?

 

在节点上过度集中应用程序的风险

 

在节点中过度装箱应用程序的风险与保持分布式部署的“最佳实践”是两个对立面。把所有的鸡蛋放在一个篮子里,这是典型的风险管理错误。这是一种操作风险,如果某些节点宕机,整个部署的更大部分也将随之离线。因此,一方面,出于弹性的考虑,你希望尽可能偏向分布式。另一方面,你希望控制成本,而装箱是一个很好地解决方案。在这种平衡中找到最佳的点才是关键。

 

当多个容器争用单个节点有限的资源(如内存或 CPU)时,这些问题变得更加明显,从而导致资源匮乏和应用程序性能下降。此外,以非逐渐方式或突发方式扩展系统还可能导致不必要的故障,进一步加剧这些挑战。为了应对这些不一致性,可以尝试设置策略限制,确保向应用程序提供可靠的资源。

 

在高密度装箱到节点时需要考虑的另一个问题是对维护和更新的潜在影响。随着在单个节点上运行更多的容器,对维护任务或软件更新的影响可能会被放大,导致更长时间的停机或降低应用程序性能。在进行装箱时,如何管理更新和维护而不对工作负载性能产生负面影响,是需要认真考虑的问题。

 

解决挑战的调度策略

 

Kubernetes 提供了几种调度策略来帮助解决与装箱相关的问题:

 

  • 资源请求和限制 允许你配置 Kubernetes 调度程序在进行调度决策时考虑每个节点上的可用资源,这使你能够将容器放置在具有适当资源量的节点上。

  • Pod亲和性和反亲和性规则 允许你根据其他 Pod 的存在来指定 Pod 应该或不应该放置在哪些节点上,这有助于确保工作负载在整个集群中均匀分布,或者根据特定要求在某些节点上进行分组。例如,处理基本客户数据的数据关键系统需要尽可能偏向分布式,以增强可靠性和性能。这种方法可以降低单点故障风险,带来更好的整体系统弹性。

  • Pod拓扑传播约束 使你能够考虑区域等因素,控制 Pod 在节点之间的分布方式。通过使用这些约束,你可以确保工作负载均匀分布,最大限度地减少单个节点过载的风险,并提高整体集群弹性。

 

通过仔细考虑和实施这些调度策略,你可以有效地解决在 Kubernetes 中进行装箱所面临的挑战,同时保持最佳的资源利用率和性能。

 

Kubernetes 装箱示例

 

关于在 Kubernetes 中如何有效地为不同类型的工作负载(从无状态的 Web 应用程序到数据库实例等)实施装箱,我们将在下面探讨其中一些示例。

 

无状态应用程序

 

Kubernetes 可以将多个无状态应用程序实例打包到单个节点中,同时确保每个实例都具有足够的资源。通过使用资源请求和限制,你可以引导 Kubernetes 调度程序为每个实例分配适当数量的 CPU 和内存。只要这些实例有足够的资源,它们就会启动并运行,并确保无状态应用程序(如 Web 应用程序或面向客户的应用程序)具有高可用性。

 

数据库实例

 

在处理数据库时,Kubernetes 可以有效地将不同有状态应用程序的单个实例打包到节点中,以最大化吞吐量和最小化延迟。通过利用 Pod 亲和性规则,你可以确保数据库实例放置在拥有必要的卷并与其他组件(如缓存服务器或应用程序服务器)接近的节点上。这有助于优化资源使用,同时保持数据库操作的高性能和低延迟。

 

批处理和机器学习工作负载

 

装箱也能给批处理和机器学习工作负载带来好处。Kubernetes 可以使用 Pod 拓扑传播约束确保这些工作负载均匀分布在节点上,防止资源争用,保持性能处于最佳状态。

 

大型多节点集群

 

如果需要将服务分布到大量节点(例如 2000 个节点)中,资源优化仍然是一个重要的考虑因素。虽然将这些服务分散开对于容错能力来说是必不可少的,但仍然需要考虑对剩余的服务进行装箱,以提高节点的利用率。

 

如果使用了特定的节点资源,Kubernetes 可以通过拓扑传播配置(例如PodTopologySpreadArgs)来管理它们。集群管理员和云供应商应该要确保节点得到相应的配置,以平衡分散的服务和装箱的服务。

 

通过理解和应用这些示例,你可以利用装箱来优化资源利用率,提高集群的整体效率。

 

Kubernetes 装箱的成本效益

 

通过在集群内有效地分配资源并最小化支持工作负载所需的节点数量,装箱有助于降低基础设施成本。这是通过将多个容器合并到较少的节点上实现的,减少了对额外硬件或云资源的需求。因此,企业可以在硬件、能源和维护方面节省开支。

 

在云环境中,基础设施成本占 IT 开支的很大一部分,因此通过装箱实现的成本节省可能非常显著。云提供商通常根据使用的节点数量和大小向客户收费,通过装箱优化资源利用率直接可以转化为减少云基础设施费用。

 

Kubernetes 装箱最佳实践

 

要充分利用 Kubernetes 装箱所带来的好处,需要遵循一些最佳实践,确保在防止出现性能问题的同时实现最佳资源利用。以下是三个重要的最佳实践。

 

谨慎的规划和测试

 

在 Kubernetes 环境中实施装箱之前,需要仔细规划和测试容器在节点中的放置。这可能涉及分析工作负载的资源需求,确定适当的密度水平,并在不同场景下测试集群的性能和稳定性。此外,设置内存的硬限制至关重要,因为内存是不可压缩的资源,应谨慎分配,以避免影响其他的应用程序。还要考虑潜在的内存泄漏问题,确保一个节点的内存泄漏不会在整个系统中造成混乱。

 

花一些时间进行规划和测试有助于避免与装箱相关的潜在问题,如资源争用和性能下降。

 

正确设置节点和容器大小

 

正确设置节点和容器大小是优化 Kubernetes 环境中资源利用的关键。为实现这一目标,首先需要评估应用程序的资源需求,如 CPU、内存和存储。这些信息有助于确定最适合的节点大小和容器资源限制,以最大限度地减少浪费和提高效率。为工作负载设置适当的节点和容器大小至关重要,因为如果你的容器太大并占用了节点相当比例的资源,那么你将无法将其他容器放置到节点上。例如,如果你运行一个非常大的容器,占用了每个节点 75%的资源,那么将导致 25%的浪费,无论你设置了多少装箱规则。在优化 Kubernetes 环境时,容器分配的资源和机器提供的资源是需要考虑的关键因素。

 

随时监控和调整

 

在 Kubernetes 集群中保持最佳资源利用需要进行持续的监控和调整。随着工作负载和需求的演变,可能需要重新评估装箱策略,以确保其有效性。

 

进行定期监控可以帮助你及早识别问题,如资源争用或未被充分利用的节点,让你能够在问题升级之前做出调整。

 

利用 Kubernetes 特性进行装箱

 

  • 资源配额 允许你限制命名空间可以消耗的资源量,确保不存在单个工作负载垄断集群的可用资源。

  • 资源请求和限制 可以让你引导 Kubernetes 调度程序将容器放置在具有适当资源量的节点上,这有助于确保工作负载被高效分配,并最小化资源争用。

 

另外需要考虑的一点是基础设施对环境的影响。通过装箱来优化资源利用,你可以潜在地减少企业的碳排放。运行较少的节点意味着消耗更少的能源并产生更少的热量,这有助于降低温室气体排放和降低对环境的影响。这带来了一个重要的问题:企业如何在追求成本效益和性能的同时,平衡其社会责任,以减少碳排放?

 

结论

 

在 Kubernetes 中进行装箱在优化资源利用和降低基础设施成本方面发挥着至关重要的作用,但同样重要的是如何在优化 Kubernetes 资源时正确找到效率和性能之间的平衡。

 

通过在集群中战略性地分配资源,企业可以将运行工作负载所需的节点数量降到最低,实现更低的支出和更高效的基础设施管理。

 

然而,正如讨论过的那样,企业需要面对与装箱相关的一些性能挑战和权衡以及在 Kubernetes 环境中有效使用装箱的最佳实践。通过理解和利用这些技术,企业可以最大限度地利用集群中的资源,节省基础设施成本,并提高总体效率。

 

原文链接

https://www.infoq.com/articles/kubernetes-bin-packing/


相关阅读:

50+ 顶级开源 Kubernetes 工具列表

Kubernetes 效应

你该如何为 Kubernetes 定制特性

用了就会更好吗?小心 Kubernetes 陷阱

2023-12-21 00:008539

评论

发布
暂无评论
发现更多内容

大数据培训Flink基础知识分享

@零度

flink 大数据开发

低代码之火,何以燎原?

BeeWorks

ArkUI框架又有哪些新增能力?

科技汇

英特尔宋继强:以智能推动“科技+艺术”融合创新

科技新消息

《数字经济全景白皮书》数字零售篇 重磅发布!

易观分析

数字零售 数字购物

阿里云弹性计算对视觉计算的思考与实践

阿里云弹性计算

Metaverse 视觉计算

不面试别看!字节跳动2022年Java架构师岗面试题(试行版)发布

Java架构追梦

Java 程序员 java面试 后端开发

作为一名iOS开发者—面对音视频这个新风口应该怎样学习才能乘风而起?

iOSer

ios 音视频 ios开发 OpenGL ES 音视频技术

DeepMind爆发史:决定AI高峰的“游戏玩家”|深度学习崛起十年

OneFlow

人工智能 深度学习 DeepMind AGI

新思科技连续六年获评Gartner魔力象限领导者殊荣

InfoQ_434670063458

新思科技 应用安全 Gartner

首版架构师全栈”成长笔记“一经发布就获得一致好评,我不允许你没看过

Java架构追梦

Java 程序员 java面试 后端开发

「可视化案例Vol.3」数字孪生可视化园区,开启园区智慧管理新篇章

ThingJS数字孪生引擎

物联网 可视化 数字孪生

java培训MySQL一次性插入多行数据的操作

@零度

Java MySQL

WorkPlus助力深i企打造移动数字化底座

BeeWorks

如何做好部门知识管理

小炮

web前端培训Vue3 setup() 启动函数的原理

@零度

前端开发 Vue3

极光笔记 | DSP高并发应用实践

极光JIGUANG

后端 DSP

移动开发平台|助力企业安全高效搭建高质量移动应用

BeeWorks

小微企业如何在10分钟内实现持续交付

阿里云云效

云计算 阿里云 研发管理 持续交付 研发团队

头一次见这么牛的的SpringBoot从入门到实战文档

Java架构追梦

Java spring 程序员 后端开发

OneFlow获得首届“全国颠覆性技术创新大赛”最高奖

OneFlow

深度学习 技术创新

零基础学Java第一节(语法格式、数据类型)

五分钟学大数据

Java 4月月更

基于Elasticsearch生长的SREWorks数据化运维体系

阿里云大数据AI技术

分布式 SRE 数据化运维

netty系列之:protobuf在UDP协议中的使用

程序那些事

Java Netty 程序那些事 4月月更

PlatoFarm生态进展不断,通缩推动PLATO价值提升

西柚子

阿里、字节、美团的offer我都拿到了,全靠这份Java面试题

Java架构追梦

Java 程序员 java面试 后端开发

算法交易的最佳编程语言是什么?

非凸科技

rust 编程语言 交易系统 策略

为什么业务团队需要实施CRM系统?

低代码小观

CRM 客户关系管理 企业管理系统 CRM系统 客户关系管理系统

Amazon Aurora 读写能力扩展之 ShardingSphere-JDBC 篇

亚马逊云科技 (Amazon Web Services)

Tech 专栏

PlatoFarm生态进展不断,通缩推动PLATO价值提升

小哈区块

ImageKnife组件,让小白也能轻松搞定HarmonyOS图片开发

HarmonyOS开发者

HarmonyOS ArKUI 3.0

优化容器工作负载:Kubernetes装箱的效益和挑战_Serverless_InfoQ精选文章