云原生之深入解析Airbnb的动态Kubernetes集群扩缩容

news2024/10/6 6:39:54

一、前言

  • Airbnb 基础设施的一个重要作用是保证我们的云能够根据需求上升或下降进行自动扩缩容,我们每天的流量波动都非常大,需要依靠动态扩缩容来保证服务的正常运行。为了支持扩缩容,Airbnb 使用了 Kubernetes 编排系统,并且使用了一种基于 Kubernetes 的服务配置接口。
  • 现在来讨论一下如何使用 Kubernetes Cluster Autoscaler 来动态调整集群的大小,这些改进增加了可定制性和灵活性,以满足 Airbnb 独特的业务需求。

二、Airbnb 的 Kubernetes 集群

  • 在过去的几年中,Airbnb 已经将几乎所有的在线服务从手动编排的 EC2 实例迁移到了 Kubernetes。现如今,在近百个集群中运行了上千个节点来适应这些工作负载。
  • 然而,这些变化并不是一蹴而就的,在迁移过程中,随着新技术栈上的工作负载和流量越来越多,底层的 Kubernetes 集群也随之变得越来越复杂。这些演变可以划分为如下三个阶段:
    • 同质集群,手动扩容;
    • 多集群类型,独立扩缩容;
    • 异构集群,自动扩缩容。

① 同质集群,手动扩缩容

  • 在使用 Kubernetes 之前,每个服务实例都运行在其所在的机器上,通过手动分配足够的容量来满足流量增加的场景。每个团队的容量管理方式都不尽相同,且一旦负载下降,很少会取消配置。
  • 一开始 Kubernetes 集群的配置相对比较简单,配置有几个集群,每个集群都有单独的底层节点类型和配置,它们只运行无状态的在线服务。随着服务开始迁移到 Kubernetes,我们便开始在多租户环境中运行容器化的服务。这种聚合方式减少了资源浪费,并且将这些服务的容量管理整合到 Kuberentes 控制平面上。
  • 在这个阶段,需要我们手动扩展集群,但相比之前仍然有着显著的提升。

在这里插入图片描述

② 多集群类型,独立扩缩容

  • 集群配置的第二个阶段是因为更多样化的工作负载而出现的,每个试图在 Kubernetes 上运行的工作负载都有着不同的需求。为了满足这些需求,为此创建了一个抽象的集群类型,集群类型定义了集群的底层配置,这意味着集群类型的所有集群都是相同的,从节点类型到集群组件设置都是相同的。
  • 越来越多的集群类型导致出现了越来越多的集群,最初通过手动方式来调节每个集群容量的方式,很快就变得崩溃了。为了解决这个问题,我们为每个集群添加了 Kubernetes Cluster Autoscaler 组件,该组件会基于pod requests 来动态调节集群的大小。如果一个集群的容量被耗尽,则 Cluster Autoscaler 会添加一个新的节点来满足 pending 状态的 pods。
  • 同样,如果在一段时间内集群的某些节点的利用率偏低,则 Cluster Autoscaler 会移除这些节点。这种方式非常适合我们的场景,为我们节省了大约 5% 的总的云开销,以及手动扩展集群的运维开销。

在这里插入图片描述

③ 异构集群,自动扩缩容

  • 当 Airbnb 的几乎所有在线计算都转移到 Kubernetes 时,集群类型的数量已经增长到 30 多个了,集群的数量也增加到了 100 多个。这种扩展使得 Kubernetes 集群管理相当乏味,例如,在集群升级时需要单独对每种类型的集群进行单独测试。
  • 在第三个阶段,通过创建异构集群来整合集群类型,这些集群可以通过单个 Kubernetes 控制平面来容纳许多不同的工作负载:
    • 首先,这种方式极大降低了集群管理的开销,因为拥有更少、更通用的集群会减少需要测试的配置数量;
    • 其次,现在大多数 Airbnb 的服务已经运行在 Kubernetes 集群上,每个集群的效率可以为成本优化提供一个很大的杠杆。
  • 整合集群类型允许在每个集群中运行不同的工作负载,这种工作负载类型的聚合(有些大,有些小)可以带来更好的封装和效率,从而提高利用率。通过这种额外的工作负载灵活性,可以有更多的空间来实施复杂的扩展策略,而不是默认的 Cluster Autoscaler 扩展逻辑。具体来说就是计划实现与 Airbnb 特定业务逻辑相关的扩缩容逻辑。

在这里插入图片描述

  • 随着对集群的扩展和整合,就实现了异构(每个集群有多种实例类型),我们开始在扩展期间实现特定的业务逻辑,并且意识到有必要对扩缩容的行为进行某些变更。

三、Cluster Autoscaler 改进:自定义 gRPC 扩展器

  • 要对 Cluster Autoscaler 所做的最重要的改进是提供一种新方法来确定要扩展的节点组,在内部 Cluster Autoscaler 会维护一系列映射到不同候选扩容对象的节点组,它会针对当前 Pending 状态的 pods 执行模拟调度,然后过滤掉不满足调度要求的节点组。如果存在 Pending 的 pods,Cluster Autoscaler 会尝试通过扩展集群来满足这些 pods,所有满足 pod 要求的节点组都会被传递给一个名为 Expander 的组件。

在这里插入图片描述

  • Expander 负责根据需求进一步过滤节点组,Cluster Autoscaler 有大量内置的扩展器选项,每个选型都有不同的处理逻辑。例如,默认是随机扩展器,它会随机选择可用的节点组,另一个是 Airbnb 曾经使用过的优先级扩展器 ,它会根据用户指定的分级优先级列表来选择需要扩展的节点组。
  • 当使用异构集群逻辑的同时,可以发现默认的扩展器无法在成本和实例类型选择方面满足复杂的业务需求。假设,想要实现一个基于权重的优先级扩展器,目前的优先级扩展器仅允许用户为节点组设置不同的等级,这意味着它会始终以确定的顺序来扩展节点组。如果某个等级有多个节点组,则会随机选择一个节点组。基于权重的优先级策略可以支持在同一个等级下设置两个节点组,其中 80% 的时间会扩展一个节点组,另外 20% 的时间会扩展另一个节点组,但默认并不支持基于权重的扩展器。
  • 除了当前支持的扩展器的某些限制外,还有一些操作上的问题:
    • Cluster Autoscaler 的发布流水线比较严格,在合并到上游之前,需要花大量时间来审核变更,但我们的业务逻辑和所需的扩展策略是在不断变化的,能够满足当前需求的扩展器并不一定能够满足未来的需求;
    • 我们的业务逻辑是与 Airbnb 关联的,其他用户则没有这种业务逻辑,因此实现的特定逻辑并不一定对上游用户有用;
  • 因此可以对 Cluster Autoscaler 中的新扩展器类型提出了一些要求:
    • 我们希望扩展器是可扩展的,能够被其他用户使用,其他用户在使用默认的 Expanders 可能会遇到类似的限制,那么希望提供一个通用的解决方案,并回馈上游;
    • 解决方案应该能够独立于 Cluster Autoscaler 部署,这样可以能够响应快速变更的业务需求。
    • 解决方案应该能够融入 Kubernetes Cluster Autoscaler 生态系统,这样就无需一直维护一个 Cluster Autoscale 的分支。
  • 鉴于这些需求,可以提出了一种设计,将扩展职责从 Cluster Autoscaler 的核心逻辑中分离出来,设计一种可插拔的“自定义扩展器” ,它实现 gRPC 客户端(类似 custom cloud provider),该自定义扩展器分为两个组件:
    • 第一个组件是内置到 Cluster Autoscaler 中的 gRPC 客户端,这个 Expander 与 Cluster Autoscaler 中的其他扩展器遵循相同的接口,负责将 Cluster Autoscaler 中的有效节点组信息转换为定义好的 protobuf 格式,并接收来自 gRPC 服务端的输出,将其转换回 Cluster Autoscaler 要扩展的最终的可选列表。
service Expander {
  rpc BestOptions (BestOptionsRequest) returns (BestOptionsResponse)
} message BestOptionsRequest {
  repeated Option options;
  map<string, k8s.io.api.core.v1.Node> nodeInfoMap;
} message BestOptionsResponse {
  repeated Option options;
} message Option {
  // ID of node to uniquely identify the nodeGroup
  string nodeGroupId;
  int32 nodeCount;
  string debug;
  repeated k8s.io.api.core.v1.Pod pod;
}
    • 第二个组件是 gRPC 服务端,这需要由用户实现,该服务端作为一个独立的应用或服务运行,通过客户端传递的信息以及复杂的扩展逻辑来选择需要扩容的节点组。当前通过 gRPC 传递的 protobuf 消息是 Cluster Autoscaler 中传递给 Expander 的内容的(略微)转换版本。
  • 在前面的例子中,可以非常容易地实现加权随机优先级扩展器,方法是让服务器从优先级列表中读取,并通过 confimap 读取权重百分比,然后进行相应的选择。

在这里插入图片描述

  • 其实实现还包含一个故障保护选项,建议使用该选项将“多个扩展器”作为参数传递给 Cluster Autoscaler,使用该选择后,如果服务端出现故障,Cluster Autoscaler 仍然能够使用一个备用的扩展器进行扩展。
  • 由于服务端作为一个独立的应用运行,因此可以在 Cluster Autoscaler 外开发扩展逻辑,且 gRPC 服务端可以根据用户需求实现自定义,因此这种方案对整个社区来说也非常有用。
  • 在内部,从 2022 年开始,Airbnb 就一直在使用这种方案来扩缩容所有的集群,期间一直没有出现任何问题,它允许动态地选择何时去扩展特定的节点组来满足 Airbnb 的业务需求,从而实现可以开发一个可扩展的自定义扩展器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三分钟上线你自己的Midjourney

文章尾部有demo 江湖惯例&#xff1a;先来一波感谢&#xff0c;感谢laf&#xff0c;让我们可以不使用魔法、免费接入Midjourney&#xff0c;不了解laf的请猛戳 Laf介绍 背景 laf官方最近发布了一个活动&#xff0c;活动链接&#xff0c;新手也可以接入哦&#xff01;废话不多…

优维低代码实践:页面编排优化与数据联调

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

NEEPU Sec 2023公开赛Reverse题目复现

文章目录 一.Base二.How to use python1.程序逻辑分析2.爆破flag[11]~flag[14]3.爆破sha14.sha256掩码爆破 三.IKUN检查器1.查看程序信息2.分析程序逻辑3.button1_conClick函数4.check1函数5.check2函数6.check3函数7.check4函数8.check5函数 四.junk code1.使用32位动态调试工…

[Nginx 发布项目] 打包后的项目,使用nginx发布

前提 &#xff1a;使用的 mars3d 沐瑶大佬 修改后的nginx , - 下载地址 使用的是 Mars3D三维可视化平台 | 火星科技 修改后的 nginx 发布的服务&#xff0c;确保nginx发布服务时正常 &#xff1b; 如果不是&#xff0c;那这里应该没有你想要的答案&#xff1b; 1、直接替换…

006 - RCC时钟树(一)时钟树内容

006 - RCC时钟树&#xff08;一&#xff09;时钟树内容 本节内容一定要结合RCC时钟树和官方手册学习&#xff0c;如果看不明白的话&#xff0c;建议看一下野火官方的教程&#xff0c;火哥讲这节讲的很详细&#xff0c;看一遍基本就能理解了。 上节内容中分析了启动代码&#…

Web缓存服务——Squid代理服务器应用

正向代理&#xff1a;代替客户端向服务端发送请求。 反向代理&#xff1a;代理服务端&#xff0c;将请求转发给多个服务端。 一、Squid代理服务器介绍 Squid 主要提供缓存加速、应用层过滤控制的功能。 1.1 代理的工作机制&#xff08;缓存网页对象&#xff0c;减少重复请求…

2023年,Facebook Messenger群发这样做

使用SaleSmartly的企业都知道&#xff0c;SaleSmartly&#xff08;ss客服&#xff09;能在 Facebook Messenger群发信息&#xff01;Facebook Messenger在全球最受欢迎通信软件中排名第三&#xff0c;紧追头两位的 WhatsApp和微信。善用 Facebook Messenger群发工具&#xff0c…

华为OD机试真题 Java 实现【区块链文件转储系统】【2023Q2 200分】

一、题目描述 区块链底层存储是一个链式文件系统&#xff0c;由顺序的N个文件组成&#xff0c;每个文件的大小不一&#xff0c;依次为F1,F2…Fn。 随着时间的推移&#xff0c;所占存储会越来越大。 云平台考虑将区块链按文件转储到廉价的SATA盘&#xff0c;只有连续的区块链…

为什么都在学python?

自然是因为Python简单易学且应用领域广&#xff01; Python近段时间一直涨势迅猛&#xff0c;在各大编程排行榜中崭露头角&#xff0c;得益于它多功能性和简单易上手的特性&#xff0c;让它可以在很多不同的工作中发挥重大作用。 正因如此&#xff0c;目前几乎所有大中型互联…

毕业三年月薪才21K,真是没出息......

“害&#xff0c;毕业三年月薪才拿21k,真失败&#xff0c;真的给同龄人拖后腿&#xff01;”这是人能讲出来的话&#xff1f;这就是凡尔赛天花板&#xff1f;这就是我公司的测试部门的人说出来的话&#xff0c;他计算机专业毕业三年&#xff0c;包括实习&#xff0c;在我们公司…

LeetCode:28. 找出字符串中第一个匹配项的下标

28. 找出字符串中第一个匹配项的下标 1&#xff09;题目2&#xff09;代码1.方法一&#xff1a;每个字符进行匹配2.方法二&#xff1a;截取字符串进行匹配 3&#xff09;结果1.方法一结果2.方法二结果 1&#xff09;题目 给你两个字符串 haystack 和 needle &#xff0c;请你在…

Dropwizard 开发环境搭建

Dropwizard是一个Java框架&#xff0c;其目标是提供高性能、高可靠的Web 应用程序的实现。 一、使用Maven原型创建项目 1、新建项目->选择Maven Archetype 填写好项目名称、路径、选择JDK版本&#xff0c;这里使用JDK11及以上的版本&#xff0c;如下图所示&#xff1a; 2…

自监督对比学习系列论文(一):无引导对比学习--MOCO,SimCLR

自监督对比学习 对比学习&#xff08;self-supervised learning&#xff09;的应用场景是用无标记或者少标记的数据进行模型的预训练以得到一个较好的预训练模型&#xff0c;然后便可将该模型轻松的迁移到到下游任务上。显而易见的&#xff0c;对比学习的难点在于我们如何在没有…

【论文下饭】PatchTST中的channel-independence

PatchTST中的channel-independence 总结PatchingChannel-independence A Time Series is Worth 64 Words: Long-term Forecasting with Transformers 时间&#xff1a;2022 引用&#xff1a;8 ICLR 2023 代码&#xff1a;https://github.com/yuqinie98/PatchTST 中文参考&#…

软件开发人技能变现方案来啦~

java单体服务Uniapp客户端 欢迎大家来关注java单体服务Uniapp客户端模式开发应用程序这个模式下产品的特点互联网大厂产品特点小服务小产品-存在价值普通人慢慢挣小钱 欢迎大家来关注 你好&#xff01; 这可能是你第一次来“莹未来”这里&#xff0c;郑重欢迎您。如果你想学习…

firewalld防火墙详细介绍

目录 一、firewalld概述 二、firewalld与iptables的区别 1.位置不同 2.配置存储位置不同 3.规则运行不同 4.防火墙类型不同 三、firewalld区域的概念 四、firewalld防火墙9个区域 1、trusted&#xff08;信任区域&#xff09; 2、public&#xff08;公共区域&#xf…

JavaScript中的tab栏切换制作(排他思想)

文章目录 实现效果图排他思想tab栏切换制作思路代码部分 实现效果图 整个页面分为2个部分&#xff0c;tab_list部分&#xff08;上半部分&#xff09;和tab_con部分&#xff08;下半部分&#xff09; tab_list部分包含5个li&#xff0c;它们分别与tab_con部分的5个div盒子一一…

Eyeshot Fem 2023.1 你选Fem还是Ultimate Crack

Eyeshot Fem--当然选Fem Everything in Ultimate, plus Geometry meshing and Finite Element Analysis. Scope Modules Image Gallery Features Scope Eyeshot Fem edition is designed for Geometry meshing and Finite Element Analysis. Modules Geometric modules includ…

《终结拖延症》重新拥有计划每天的自信和控制力

关于作者 威廉区瑙斯&#xff0c; 美著名心理治疗 专家 &#xff0c; 拥有 超过 30 年 心的 理治疗 经 &#xff0c;验 他 专 精的研究 领域 &#xff0c; 是 为 代 都 市 群提 供负 面 心 理 引 导 和 治疗 &#xff0c; 比 如 抑郁 、 心 理 亚健 康 、 拖 延 症 等 等 。 除…

redis未授权访问漏洞利用+redis日志分析

redis未授权访问漏洞利用redis日志分析 redis未授权访问 远程连接redis kali: redis-cli -h IP redis常用语句 set key “value” 设置键值对 get key 获得值 incr intkey 数字类型值加1 keys * 获取当前数据库中所有的键 config set dir /home/test 设置工作目录 config set…