原文首发于云妙算

Slack 是一款 AI 工作管理和协作平台。随着业务需求的增长,Slack 对其内部计算编排平台进行了重大改造,以增强可扩展性、提高效率并降低成本。该内部平台的代号为“Bedrock”,基于 Amazon EKS 和 Karpnter 构建。

通过利用 Bedrock,Slack 将容器部署和管理简化为单个 YAML 文件,从而简化了内部开发人员的工作流程。借助 Jenkins、Nebula overlay 网络和 FQDN 服务发现等工具,Slack 超过 80% 的应用程序现在都在 Bedrock 上运行,从而提高了测试准确度和基础架构管理水平。然而,随着业务范围的扩大,Slack 在管理可扩展性和资源利用率方面面临挑战,因此采用了开源集群自动扩缩容工具 Karpenter。

在本篇文章中,我们将深入探讨 Slack 在亚马逊 EKS 上对其容器平台进行现代化改造的过程,以及他们如何通过利用 Karpenter 来节约成本并提高运维效率。

采用 Karpenter 之前:Slack 面临的挑战

在集成 Karpenter 之前,Slack 依靠管理多个自动扩展组 (ASG) 来处理其 EKS 计算资源。虽然这种方法最初很有效,但在工作负载和复杂性不断增加的情况下,开始出现瓶颈:

1. 可扩展性问题: 随着实例类型和应用需求的增加,管理多个 ASG 变得非常具有挑战性。

2. 升级瓶颈: 对拥有数千个工作节点的 EKS 集群进行频繁更新会降低部署速度。

3. 架构限制: 单副本架构带来了漏洞,而跨区管理不同的实例需求又造成了效率低下。

这些限制因素促使 Slack 寻求一种更具弹性、更高效、更动态的弹性伸缩解决方案。

两步走战略:逐步推广 Karpenter

Karpenter 能够根据工作负载需求动态调度和扩展节点,是满足 Slack 需求的理想解决方案。通过与亚马逊 EC2 的 Fleet API 直接交互,Karpenter 可以评估 pod 的资源需求,并为工作选择最佳实例类型。Slack 采用了缜密的两阶段推广策略,以确保平稳过渡:

第 1 阶段:验证

最初,Karpenter 与核心应用程序一起部署在托管节点组中。在这一阶段,Karpenter 的整合功能(通过重新分配工作负载来优化节点利用率)被禁用,重点是验证其在特定工作负载中的功能。这一阶段还包括大量测试,以识别和解决 pod 配置错误,确保工作负载得到优化,从而实现高效调度。

第 2 阶段:全面推广

Slack 将 Karpenter 控制器工作负载转移到专用的 ASG,确保 Karpenter 不会在其管理的节点上运行。经过严格测试后,Slack 最终在超过 200 个 EKS 集群(运行着数千个工作节点)的环境中全面部署了 Karpenter。在此阶段启用了整合功能,使 Slack 能够最大限度地提高资源利用率并显著节约成本。

由于 Karpenter 是分阶段采用的, 因此可以控制哪些集群启用了 Karpenter。这使 Slack 能够在 Karpenter 中验证工作负载的性能,并在收到问题报告时快速回滚。

当工作负载没有适当的 request/limits 时,Karpenter 会分配较小的实例或仅分配大型实例的一小部分,从而导致负载增加时频繁的 pod churn(指 Pod 和容器的创建、销毁和随后重新创建的循环)。Slack 通过 Karpenter 发现了这一问题,进而改进其平台,以确保 Pod 的设置符合要求,并将其分配到适当的节点上。对于需要特定实例类型的工作负载,Slack 能够调整 NodePool 自定义资源,并使用 Karpenter 标签将 pod 固定在相关实例类型上。

如下图所示,Slack 的 Bedrock EKS 集群在架构上的优势是其弹性和效率。Bedrock 和 Karpenter 对 Slack EKS 架构的综合影响显而易见。

采用 Karpenter 之后:Slack 取得的成果

Slack 采用 Karpenter 后,在多个方面都取得了明显改善:

1、资源优化

Karpenter 根据 pod 需求动态选择实例类型(从 8xlarge32xlarge),对于无需特定实例类型的工作负载可以高效地使用所有可用资源,大大提高了集群利用率。利用整合功能通过重新分配工作负载消除了闲置实例,减少了对跨可用区(AZ)最小 ASG 规模的需求。

云妙算的智能节点选择功能可以进一步优化 Karpenter 的动态实例选择,智能匹配超过750种实例类型,为用户的工作负载自动匹配多样化的实例类型,以减少资源浪费,提升计算性能,增强应用稳定性。

2、成本优化

通过自动扩展节点和利用更丰富的实例系列,Slack 的计算成本降低了 12%。动态实例分配还减轻了基础设施团队的负担,他们以前的任务是维护多套 ASG 配置。

3、提升性能

由于 Karpenter 可以即时做出节点自动扩缩决策,加速了节点配置,缩短了 pod 的启动时间,从而在工作负载高峰期实现更快的扩展。此外,Slack 在运行 Karpenter 时采用了自定义超额配置,为突发的流量高峰提供缓冲。

Karpenter 与 Amazon EC2 的直接 API 交互与重试(retry)机制提高了恢复能力,确保在可用区(AZ)发生故障时更快地恢复。

4、简化操作

通过移除 Terraform 配置中的硬编码实例类型,有助于更快地启动 pod,进而缓解了对 Slack 系统升级的担忧,因为可以在升级过程中迅速驱逐和轮换节点。自定义的 Helm Chart 配置使 Slack 能够在 200 多个 EKS 集群中使用单个 NodePool 和 EC2NodeClass。

由于 Karpenter 提供的实例系列中有多种实例类型可供选择,在使用动态调度约束时,从一种实例类型切换到另一种实例类型很有帮助。这减轻了基础设施团队的负担,并降低了实例类型更改的风险。

未来规划

Slack 成功部署 Karpenter 标志着其进一步优化之旅的开始。Slack 目前正在努力简化当前的 Karpenter 配置,以进一步改善运维操作并节省更多成本:

  • 自定义 Kubelet 配置: Slack 计划绕过基础设施即代码 (IaC) 解决方案,通过 Karpenter 的 EC2NodeClass 直接配置 kubelet flag,从而缩短实例启动时间。

  • 用于快速扩展的 Warmpool: Slack 正在探索如何让 Karpenter 从 warm pool 中挑选实例,而不是调用亚马逊 EC2 Fleet API,从而缩短启动时间。

  • 中断控制: 加强中断控制,最大限度地减少整合对应用程序可用性的影响,确保即使在高并发期间应用也能顺利运行。

总 结

在这篇文章中,我们讨论了 Slack 的 Bedrock 通过从基于 ASG 的自动扩展过渡到 Karpenter,改善 Amazon EKS 集群的运行,提高了可扩展性。我们还讨论了 Slack 如何利用 Karpenter 作为 EKS 集群的弹性伸缩工具来精简基础设施并且降低成本。展望未来,Slack 将更加专注于通过贡献和利用新功能来进一步优化 Karpenter 环境,从而构建一个稳健且强大的平台。

1000+节点、200+集群,Slack如何利用Karpenter降本增效?的更多相关文章

  1. 基于Docker快速搭建多节点Hadoop集群--已验证

    Docker最核心的特性之一,就是能够将任何应用包括Hadoop打包到Docker镜像中.这篇教程介绍了利用Docker在单机上快速搭建多节点 Hadoop集群的详细步骤.作者在发现目前的Hadoop ...

  2. 理解 OpenStack Swift (1):OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置

    本系列文章着重学习和研究OpenStack Swift,包括环境搭建.原理.架构.监控和性能等. (1)OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置 ( ...

  3. hadoop入门手册2:hadoop【2.7.1】【多节点】集群配置【必知配置知识2】

    问题导读 1.如何实现检测NodeManagers健康?2.配置ssh互信的作用是什么?3.启动.停止hdfs有哪些方式? 上篇: hadoop[2.7.1][多节点]集群配置[必知配置知识1]htt ...

  4. hadoop入门手册1:hadoop【2.7.1】【多节点】集群配置【必知配置知识1】

    问题导读 1.说说你对集群配置的认识?2.集群配置的配置项你了解多少?3.下面内容让你对集群的配置有了什么新的认识? 目的 目的1:这个文档描述了如何安装配置hadoop集群,从几个节点到上千节点.为 ...

  5. kafka系列二:多节点分布式集群搭建

    上一篇分享了单节点伪分布式集群搭建方法,本篇来分享一下多节点分布式集群搭建方法.多节点分布式集群结构如下图所示: 为了方便查阅,本篇将和上一篇一样从零开始一步一步进行集群搭建. 一.安装Jdk 具体安 ...

  6. ES 内存使用和GC指标——主节点每30秒会去检查其他节点的状态,如果任何节点的垃圾回收时间超过30秒(Garbage collection duration),则会导致主节点任务该节点脱离集群。

    摘录自:http://blog.csdn.net/yangwenbo214/article/details/74000458 内存使用和GC指标 在运行Elasticsearch时,内存是您要密切监控 ...

  7. 项目进阶 之 集群环境搭建(三)多管理节点MySQL集群

    上次的博文项目进阶 之 集群环境搭建(二)MySQL集群中,我们搭建了一个基础的MySQL集群,这篇博客咱们继续讲解MySQL集群的相关内容,同时针对上一篇遗留的问题提出一个解决方案. 1.单管理节点 ...

  8. 实战weblogic集群之创建节点和集群

    一.启动weblogic,访问控制台 weblogic的domain创建完成后,接下来就可以启动它,步骤如下: $ cd /app/sinova/domains/base_domain/bin $ . ...

  9. docker swarm英文文档学习-6-添加节点到集群

    Join nodes to a swarm添加节点到集群 当你第一次创建集群时,你将单个Docker引擎置于集群模式中.为了充分利用群体模式,可以在集群中添加节点: 添加工作节点可以增加容量.当你将服 ...

  10. 使用Vagrant创建多节点虚拟机集群

    摘要: 在前一篇博客中,我介绍了使用Vagrant快速创建虚拟机,但是所创建的只是单个虚拟机.这篇博客将介绍使用Vagrant创建多节点虚拟机集群,可以作为Hadoop,Spark以及Storm等分布 ...

随机推荐

  1. Cloud Studio:颠覆传统的云端开发与学习解决方案

    Cloud Studio Cloud Studio(云端 IDE)是一款基于浏览器的集成开发环境,它为开发者提供了一个高效.稳定的云端工作站.用户在使用 Cloud Studio 时,无需进行任何本地 ...

  2. Python 项目及依赖管理工具技术选型

    Python 项目及依赖管理工具,类似于 Java 中的 Maven 与 Node 中的 npm + webpack,在开发和维护项目时起着重要的作用.使用适当的依赖管理工具可以显著提高开发效率,减少 ...

  3. android 访问域名接口报错

    1. 移动端访问https域名及接口,显示 java.net.UnknownHostException: Unable to resolve host "xxx" : No add ...

  4. JDK有用的新特性-Switch

    目录 箭头表达式,新的 case 标签 yeild 返回值 Java Record Switch 的三个方面,参考: JEP 361 支持箭头表达式 支持 yied 返回值 支持 Java Recor ...

  5. .NET 最好用的验证组件 FluentValidation

    前言 一个 .NET 验证框架,支持链式操作,易于理解,功能完善,组件内提供十几种常用验证器,可扩展性好,支持自定义验证器,支持本地化多语言. 项目介绍 FluentValidation 是一个开源的 ...

  6. Python批量分割Excel后逐行做差、合并文件的方法

      本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件,首先依据某一列数据的特征截取我们需要的数据,随后对截取出来的数据逐行求差,并基于其他多个文件夹中同样大量 ...

  7. java基础 -线程(基础)的 笔记

    581,多线程机制 因为需要敌人的坦克可以自由移动并发射子弹,我们的坦克可以移动并发射子弹,这些要用到线程的知识. 根据JConsole监控线程执行情况,发现,主线程执行完了,子线程还没有执行完,并不 ...

  8. Failed to convert value of type 'java.lang.String' to required type

    DEBUG 微信小程序Java后台 Failed to convert value of type 'java.lang.String' to required type 产生这种条件的原因一般是使用 ...

  9. DatetimeFormatter字符串转日期

    在Java中,我们经常需要将字符串形式的日期时间转换为LocalDateTime.LocalDate.LocalTime等日期时间对象,或者将日期时间对象转换为字符串.为了完成这些操作,我们可以使用D ...

  10. 第24天:安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制

    #文件管理模块-上传-过滤机制 1.无过滤机制 2.黑名单过滤机制 3.白名单过滤机制 4.文件类型过滤机制 $_FILES:PHP中一个预定义的超全局变量,用于在上传文件时从客户端接收文件,并将其保 ...