原文首发于云妙算

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. maven依赖拉取小技巧

    依赖对应的dependency搜索库 https://mvnrepository.com/ 前往搜索  点击对应的依赖版本复制xml的代码  然后idea中刷新maven即可拉出来

  2. 我恨 gevent

    报错了一晚上,最后发现是 python 版本不对.3.11,3.12,3.8,3.10 试了个遍,最后 3.10 终于编译通过了‍ 还有这个 greenlet,每次都是它和 gevent 合着来恶心我 ...

  3. uniapp中,getApp()返回的实例到底是什么?为什么getApp()返回的实例无法访问vuex的$store

    按uniapp官方手册中说,getApp()函数用于获取当前应用实例.当前应用,也就是说当前应用程序.因为getApp()返回的实例可以用于访问app.vue中的globaldata,因此这个当前应用 ...

  4. MySQL的索引原理及使用

    MySQL中的索引模型 Mysql中的索引使用的数据结构一般为搜索树,这里的搜索树,一般使用B树,这里补一下数据结构中的B树结构:说B树之前,先顺一个前置的知识点,平衡二叉树: 平衡二叉树 二叉树应该 ...

  5. OpenFeign深入学习笔记

    OpenFeign 是一个声明式的 Web 服务客户端,它使得编写 Web 服务客户端变得更加容易.OpenFeign 是在 Spring Cloud 生态系统中的一个组件,它整合了 Ribbon(客 ...

  6. JavaScript之Blob对象基本用法及分片上传示例

    Blob基本用法 创建 通过Blob的构造函数创建Blob对象: new Blob(blobParts[, options]) blobParts: 数组类型, 数组中的每一项连接起来构成Blob对象 ...

  7. Servlet——Response对象

    Response对象         Response 设置响应数据   1.响应行          void setStatus(int sc):设置响应状态码   2.响应头           ...

  8. QT疑难杂症之如何使用自定义模型实现文件系统模型?类似QFileSystemModel,却比QFileSystemModel更好用

    简介 本文讨论了QT文件系统模型QFileSystemModel的不足之处,并且讨论了改进目标,如何实现自定义文件系统模型,以及进一步改进的空间. 目录 QFileSystemModel的不足之处 改 ...

  9. Kubernetes Deployment控制器(二十)

    前面我们学习了 ReplicaSet 控制器,了解到该控制器是用来维护集群中运行的 Pod 数量的,但是往往在实际操作的时候,我们反而不会去直接使用 RS,而是会使用更上层的控制器,比如我们今天要学习 ...

  10. 《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略

    本文分享自华为云社区<<华为云DTSE>期刊第四期赋能云专刊,赋能云场景下DTSE服务各类开发者的案例分享>,作者:HuaweiCloudDeveloper. 把公司的开发者平 ...