享道出行:容器弹性技术驱动下的智慧出行稳定性实践

作者:郑嘉扬、何杉

前言

享道出行是一家专注于出行服务的专业品牌,是上汽集团实现汽车产业“新四化”(即“电动化、智能网联化、共享化、国际化”)的重要组成部分。作为上汽集团移动出行战略品牌,享道出行充分利用全产业链竞争优势,从消费者对安全及品质的需求出发,通过为消费者提供安全、高效、舒适、便捷的品质体验,打造品质出行服务平台。

图片

在快速的业务发展过程中,基础设施规模的不断增长,为企业管理者带来了对于效率和成本的高度关注。容器技术作为云计算时代基础设施的核心,自然成为了我们关注的焦点。随着容器技术及其生态的不断成熟,对于企业级开发者来说,在提高部署速度、优化资源利用率以及降低环境间差异等方面展现出了巨大的潜力。然而,随着容器数量的激增,如何管理和调度这些容器也成为了一个挑战。

业务架构与痛点

当前业务开发主要采用 Java 技术栈,应用部署架构如图所示:

图片

核心痛点

  • 目前使用的 Kubernetes 原生 HPA 弹性扩缩容方案以及 CronHPA 方案,在容器算力准备阶段流程长,包括算力资源准备、调度、镜像拉取、容器创建、容器启动以及应用启动导致冷启动基本是分钟级弹性。
  • 无法承接预期外流量,流量损失对业务有感。
  • 需要运维人员通过编码、维护程序自动化测算生产环境资源水位,评估扩缩容阈值,运维成本较高。测算结果不够精准也会导致资源浪费或影响业务稳定。

解决方案

针对以上痛点,为解决弹性滞后的问题同时兼顾成本最优,方案如下:

  • ACK AHPA 智能弹性
  • ECS、ECI 混合部署

图片

作为出行行业,享道的业务特征具备明显的潮汐效应,通过弹性架构改造,我们能够充分发挥云弹性算力的优势,进一步提升了业务自身的容错性。

图片

ACK 智能弹性(AHPA)

针对传统弹性能力所存在的问题,在方案设计阶段我们采用了 阿里云ACK 容器服务推出的 AHPA(Advanced Horizontal Pod Autoscaler)弹性预测,可以根据历史 Pod 的 Ready Time 以及历史 Metrics 自动学习规律,在业务量上涨之前的一个 Ready Time 开始扩容,在业务量上涨时 Pod 已提前准备,可以及时供给资源,解决弹性滞后的问题。

AHPA 弹性预测根据历史数据自动规划未来 24 小时每一分钟的应用实例数,相当于进行 1440 个点(一天为 1440 分钟)的 CronHPA 定时配置。

预先扩容

由于业务具有很强的潮汐属性,每日的涨潮落潮时间比较固定,AHPA 会根据过往的数据推测之后的所需要的 Pod 数量。例如,服务A根据以往双休日情况预测出这个双休日可能出现的 Pod 数量最大值为 16,那么就可以预先扩出来满足这些额外 pod。

图片

ECS、ECI 混合部署

如前文所述,AHPA 只能够解决应用层的弹性滞后问题,并不能提前对底层资源是否足够提前做出判断。这也意味着当底层资源不足时,仍存在使应用扩容时间被无限拉长的风险。

弹性容器实例 ECI(Elastic Container Instance) 作为一种纯 Serverless 容器运行服务,对于用户而言,无需管理底层服务器资源,同样也不需要关心运行过程中的容量规划,只需要提供打包好的 Docker 镜像,即可运行容器,非常适合应对这种流量突发场景下的业务场景。

但从成本性上讲,单位价格会相对裸金属 ECS 较贵,该方案结合了各付费模式和底层架构的优势,当前采取混合部署模式,兼顾成本及稳定性两方面的业务目标。如下图所示,未来目标是一半以上的应用作为业务基线部署在裸金属 ECS 上,对于周期型应用部署在按量付费的 ECS 资源,结合出行行业早晚高峰,剩余 10% 以上的场景均通过 ECI 实例保障。

图片

注: ECI 的计算资源与 ECS 等实例完全解耦,在每个可用区有单独的资源划分给到 Serverless 架构相关产品,对于大部分场景(CPU 数不超过 1 万 Core),无需担心资源不足的情况产生。因此 ECI 也是一种相对可靠的算力容量保障手段。

自定义弹性资源优先级调度

在资源的调度策略上,由于采用了 ECS 及 ECI 两种部署模式,我们期望应用扩容和缩容行为都是确定性的,当应用需要部署一个 Deployment,此时集群中有对应的多种类型的资源,分别是包年包月的 ECS、按量付费的 ECS 和弹性实例 ECI。

那么,部署的服务优先调度顺序理论上依次为:包年包月的 ECS、按量付费的 ECS、弹性实例 ECI。 同时在服务缩容时优先删除 ECI 上的 Pod,释放 ECI 的节点资源,然后删除按量付费的 ECS 上的 Pod,最后删除包年包月的 ECS 上的 Pod。

图片

对于包年包月及按量付费两种不同付费类型的节点需通过打上不同 label 标签实现。然后创建 ResourcePolicy 自定义节点池调度顺序。

ResourcePolicy 配置示例:

  apiVersion: scheduling.alibabacloud.com/v1alpha1kind: ResourcePolicymetadata:name: DEMOnamespace: demo-nsspec:units:- max: 15nodeSelector:env: prdresource: ecs- max: 5nodeSelector:foo: barresource: ecs- resource: eciwhenExceedMax: NeverEvict

这里具体的调度策略可根据实际业务场景区分,若对于成本不敏感,且业务的波峰波谷抖动较大的场景,也可以考虑当 ECS 资源不足时,使用 ECI 弹性资源,进而加速 Pod 的启动时间。

向虚拟节点 Pod 注入 Sidecar 容器

在享道的集群架构中,存在采集微服务日志的场景,日志采集器会在 ECS 节点上通过 DaemonSet 方式部署 Agent,但虚拟节点不是真实节点,不支持运行 DaemonSet Pod,如何让调度到虚拟节点的 Pod 也支持上述 Agent 的同等能力呢?答案是向虚拟节点 Pod 注入 Sidecar 容器。

在实施过程中,我们希望做到:

  • 维护一份 Deployment 发布模板。在资源调度部署时,自动对底层 ECS 和 ECI 做区分,当 Pod 被调度到 ECS 节点时,无需注入 Sidecar 容器,当 Pod 被调度到虚拟节点时,则自动向 Pod 中注入 Sidecar 容器,从而实现通过维护一份 Deployment 发布模版,即可同时满足不同架构下的兼容性需求。
  • 对已有存量业务入侵尽可能小。根据软件设计开闭原则,应该对修改关闭,避免改动线上已经运行稳定的存量业务(如 DaemonSet),只增加新的或对新增内容做改变。

使用一个 Deployment 在原生 K8s 架构中无法做到,原因是添加 Sidecar 容器需要修改 Pod Spec,而原生 K8s 架构中 Pod Spec 落到 etcd 之后就不允许修改了,但 Pod 是否调度到虚拟节点是在 Pod Spec 落到 etcd 后由调度器决定的。因此,使用 OpenKruise 原生 SidecarSet,因为采用 Admission Webhook 机制,在 Pod 创建阶段通过 Label 的匹配所有符合条件的 Pod,此时 Pod 还未调度到虚拟节点,无法仅对调度到虚拟节点的 Pod 生效。

注: SidecarSet 是阿里云开源的云原生应用自动化引擎 OpenKruise 的核心功能之一。使用 SidecarSet 可以为集群中创建的符合条件的 Pod 自动注入 Sidecar 容器,实现 Sidecar 容器(如监控、日志等 agent)的定义和生命周期与业务容器解耦。

虚拟节点支持 SidecarSet 就是专门用于解决该问题。借助虚拟节点组件(ACK Virtual Node)仅为调度到虚拟节点上的 Pod 自动注入 Sidecar 容器,来解耦虚拟节点 Pod 的 Sidecar 容器与业务容器。其原理如下图所示:

图片

通过标签 Serverless.alibabacloud.com/virtual-node:“true” 指定,该标签会在 Pod 确定调度到虚拟节点后自动打上。同时,该方案与 OpenKrusie 原生 SidecarSet 完全兼容,对于后续 Sidecar 容器的升级、运维等操作,仍可以继续使用OpenKrusie原生 SidecarSet 实现。

自定义弹性指标

如上文所述,基于 CPU/内存的弹性指标无法同真实业务工作复杂完全拟合。很多场景下,用户期望根据自定义指标对应用进行扩缩容。AHPA 所提供的 External Metrics 机制,结合 alibaba-cloud-metrics-adapter 组件,可以为应用提供更丰富的扩缩容机制。

业务价值

当前享道出行已经规模化上线智能容器弹性能力,在保证稳定性的前提下,大大节省了资源成本,并能很好地应对突发流量。 如图所示:当阈值设置为 50,指标有到 50 的趋势时,即会触发弹性扩容,能够更好地应对突发流量,保障业务稳定性的同时,也能够实现可观的降本效果。

图片

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

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

相关文章

【C++】list介绍

个人主页 : zxctscl 如有转载请先通知 文章目录 1. list介绍2. list的构造3. ist iterator的使用4. capacity5. element access6. modifiers7. 迭代器失效8. Operations8.1 reverse8.2 sort8.3 unique8.4 splice 1. list介绍 list是可以在常数范围内在任意位置进行插…

JumpServer 堡垒主机

JumpServer 堡垒机帮助企业以更安全的方式管控和登陆各种类型的资产 SSH:Linux/Unix/网络设备等Windows:Web方式连接/原生RDP连接数据库:MySQL、Oracle、SQLServer、PostgreSQL等Kubernetes:连接到K8s集群中的PodsWeb站点&#x…

微信小程序wx.navigateTo无法跳转到Component组件问题解决。(共享元素动画必备)

关于Component构造器官方是有文档说明的,然后官方文档内部也给出了组件是可以通过像pages一样跳转的。但是官方文档缺少了必要的说明,会引起wx.navigateTo无法跳转到组件问题! 以下是官方文档截图: 解决方式: 组件创建…

吴恩达2022机器学习专项课程(一) 4.2 梯度下降实践

问题预览/关键词 本节内容梯度下降更新w的公式梯度下降更新b的公式的含义α的含义为什么要控制梯度下降的幅度?导数项的含义为什么要控制梯度下降的方向?梯度下降何时结束?梯度下降算法收敛的含义正确更新梯度下降的顺序错误更新梯度下降的顺…

【软件安装】(十四)Ubuntu22.04安装Psensor硬件监视器

一个愿意伫立在巨人肩膀上的农民...... Ubuntu系统硬件运行查询输入指令太繁琐,终端展示不直观,因此这款具有可视化监控Ubuntu系统下当前电脑的硬件CPU(中央处理器)、GPU(显卡)和硬盘等温度等功能&#xff…

微信支付平台与微信服务号关联配置要点

目录 JSAPI支付 前期资料及相关准备 申请微信服务号 服务号配置要点 微信认证 基本配置 功能设置 申请微信支付号 支付号配置要点 设置操作密码 API安全 开发设置 与服务号关联 小结 JSAPI支付 我们的开发应用场景以JSAPI支付为举例,这也是常用的一…

Python读取PDF文字转txt,解决分栏识别问题,能读两栏

搜索了一下,大致有这些库能将PDF转txt 1. PyPDF/PyPDF2(截止2024.03.28这两个已经合并成了一个)pypdf PyPI 2. pdfplumber GitHub - jsvine/pdfplumber: Plumb a PDF for detailed information about each char, rectangle, line, et cete…

MATLAB多级分组绘图及图例等细节处理 ; MATLAB画图横轴时间纵轴数值按照不同sensorCode分组画不同sensorCode的曲线

平时研究需要大量的绘图Excel有时候又臃肿且麻烦 尤其是当处理大量数据时可能会拖死Windows 示例代码及数据量展示 因为数据量是万级别的折线图也变成"柱状图"了, 不过还能看出大致趋势! 横轴是时间纵轴是传感器数值图例是传感器所在深度 % data readtable(C:\U…

Network AIS Receiver R400N

目录 Introduction OVERVIEW BASIC FEATURES APPLICATIONS SPECIFICATIONS Introduction OVERVIEW The R400N provides a method of monitoring the position, speed and heading of AIS vessels within VHF range. It can decode of Class A, Class B, Aids to Navigat…

鸿蒙OS开发实例:【Web网页】

背景 HarmonyOS平台通过Web控件可支持网页加载展示,Web在中是作为专项参考的。 本篇文章将从Android和iOS平台研发角度出发来实践学习API功能 说明 整个示例是以HarmonyOS开发文档网址作为加载目标页面布局增加了三个按钮“后退”,“前进”&#xff…

TransmittableThreadLocal 问题杂记

0、前言 TransmittableThreadLocal,简称 TTL,是阿里巴巴开源的一个Java库,它能够实现ThreadLocal在多线程间的值传递,适用于使用线程池、异步调用等需要线程切换的场景,解决了ThreadLocal在使用父子线程、线程池时不能…

2022 Tesla AI Day -特斯拉自动驾驶FSD的进展和算法软件技术之数据以及虚拟

2022 Tesla AI Day -特斯拉自动驾驶FSD的进展和算法软件技术之数据以及虚拟 附赠自动驾驶学习资料和量产经验:链接 人工智能算法犹如电影的主演,我们很多时候看电影只看到主演们的精彩,但其实电影的创意和呈现都来自于背后的导演和制片等团队…

数论与线性代数——整除分块【数论分块】的【运用】【思考】【讲解】【证明(作者自己证的QWQ)】

文章目录 整除分块的思考与运用整除分块的时间复杂度证明 & 分块数量整除分块的公式 & 公式证明公式证明 代码code↓ 整除分块的思考与运用 整除分块是为了解决一个整数求和问题 题目的问题为: ∑ i 1 n ⌊ n i ⌋ \sum_{i1}^{n} \left \lfloor \frac{n}{…

让工作自动化起来!无所不能的Python

让工作自动化起来!无所不能的Python 一、Python是办公自动化的重要工具二、Python是提升职场竞争力的利器三、Python是企业数字化的重要平台四、Python是AI发展的重要通道之一内容简介作者简介前言读者对象如何阅读本书购买链接参与方式 随着我国企业数字化和信息化…

metasploit使用及内网笔记

1 基本操作 Metasploit就是一个漏洞框架。它的全称叫做The Metasploit Framework,简称叫做MSF。Metasploit作为全球最受欢迎的工具,不仅仅是因为它的方便性和强大性,更重要的是它的框架。它允许使用者开发自己的漏洞脚本,从而进行…

Unix 网络编程, Socket 以及bind(), listen(), accept(), connect(), read()write()五大函数简介

Unix网络编程是针对类Unix操作系统(包括Linux、BSD以及其他遵循POSIX标准的操作系统)进行网络通信开发的技术领域。网络编程涉及创建和管理网络连接、交换数据以及处理不同层次网络协议栈上的各种网络事件。在Unix环境中,网络编程通常涉及到以…

前后端数据交互

前后端数据交互 网页上所有的数据都是来源于后端,比如淘宝或者京东的秒杀,用户的登陆或者注册,这些都需要借助于后端来存储数据。我们前端需要做的就是把数据发送给后端,后端发送给我们的数据我们要拿到把它显示到页面上&#xff…

leetcode131分割回文串

递归树 下面这个代码是遍历处所有的子串 #include <bits/stdc.h> using namespace std; class Solution { public:vector<vector<string>> vvs;vector<string> vs;vector<vector<string>> partition(string s) {dfs(0,s);return vvs;}vo…

【Linux】进程 基础概念

目录 1.进程的基本概念 1.1基本概念 1.11进程与程序的区别: 1.12并发与并行的区别 1.2进程的状态及转换 1.3描述进程—–PCB task_struct -- PCB的一种 1.4查看进程 ps 命令 top 命令 2.进程创建 3.进程状态 ps aux / ps axj 命令 进程状体具体讲解 R运行状态 S…

【Pt】马灯贴图绘制过程 01-制作基础色

目录 一、导入模型并烘焙 二、制作基础底漆 &#xff08;1&#xff09;底漆层 &#xff08;2&#xff09;水痕层 &#xff08;3&#xff09;指纹层 一、导入模型并烘焙 1. 导入模型&#xff0c;马灯模型如下所示 2. 在纹理集设置中点击“烘焙模型贴图” 设置输出大小为…