原文首发于云妙算

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. k8s网络原理之Calico

    什么是Calico: Calico是一个基于BGP的纯三层网络方案,其会为每个容器(pod)分配一个可路由的IP,在通信时不需要解包和拆包,因此网络性能损耗小,易于排查和水平扩展.Calico网络功能 ...

  2. 【YashanDB知识库】如何远程连接、使用YashanDB?

    问题现象 在各个项目实施中,我们经常遇到客户.开发人员需要连接和使用YashanDB但不知如何操作的问题,本文旨在介绍远程连接.使用YashanDB的几种方式. 问题的风险及影响 无风险 问题影响的版 ...

  3. C++: 智能指针的自定义删除器 `Custom Deleter` 有什么用?

    C++11智能指针std::shared_ptr和std::unique_ptr都支持自定义删除器,本文将介绍自定义删除器的使用场景和使用方法.智能指针模板参数的第二个类型是删除器,一般是一个函数指针 ...

  4. PYRAFORMER: 用于长时间序列建模和预测的低复杂度金字塔注意力《PYRAFORMER: LOW-COMPLEXITY PYRAMIDAL ATTENTION FOR LONG-RANGE TIME SERIES MODELING AND FORECASTING》(金字塔注意力模块机制、PAM、CSCM、多尺度)

    今天是2022年10月1日,今天重读一遍这篇论文. 10月1日16:48,上次读是4月20日,时间过得好快. 论文:PYRAFORMER: LOW-COMPLEXITY PYRAMIDAL ATTEN ...

  5. Azure – Key Vault Certificate

    前言 之前有介绍过读写 Certificate Store, 但在 production server 经常会遇到权限的问题. 为了一劳永逸, 可以考虑把 Certificate 放到 Azure K ...

  6. Java中使用BigDecimal进行double类型的计算(高精度,可保留几位小数)

    Java中 小数直接进行乘除运算,会出现精度问题导致计算结果有误需要使用 BigDecimal 类型辅助运算,保证精度无误源码: import java.math.BigDecimal;import ...

  7. MyBatis——使用Mapper代理开发

    使用 Mapper 代理开发方式完成入门案例   1.定义与SQL映射文件同名的Mapper接口,并将 Mapper 接口和SQL映射文件放置在同一目录下       (企业开发中,通常是将配置文件统 ...

  8. QT数据可视化框架编程实战之三维柱状图从入门到精通_补天云QT技术培训专家

    QT数据可视化框架编程实战之三维柱状图从入门到精通_补天云QT技术培训专家 简介 本文将介绍QT数据可视化框架(QT DataVisualization 模块)编程实战之三维柱状图(Q3DBars)的 ...

  9. QT疑难杂症之QML程序中如何使用文件系统模型QFileSystemModel?

    简介 本文介绍了 QML程序中如何使用树状控件TreeView展示QT文件系统模型QFileSystemModel中的数据,并给出了两种实现模式. 目录 QML程序中使用文件系统模型的代码 树状控件自 ...

  10. 系统编程-文件IO-dup和dup2系统调用

    在linux下,一切皆文件. 文件描述符用于操作文件. 从shell中运行一个进程,默认会有3个文件描述符存在(0.1.2):)0表示标准输入,1表示标准输出,2表示标准错误. 一个进程当前有哪些打开 ...