Knative 基于流量的灰度发布和自动弹性实践

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
注册配置 MSE Nacos/ZooKeeper,182元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: Knative 提供了基于流量的自动扩缩容能力,可以根据应用的请求量,在高峰时自动扩容实例数;当请求量减少以后,自动缩容实例,做到自动化地节省资源成本。此外,Knative 还提供了基于流量的灰度发布能力,可以将流量的百分比进行灰度发布。

头图.png

作者| 李鹏(元毅)
来源 | 阿里巴巴云原生公众号

Knative

Knative 提供了基于流量的自动扩缩容能力,可以根据应用的请求量,在高峰时自动扩容实例数;当请求量减少以后,自动缩容实例,做到自动化地节省资源成本。此外,Knative 还提供了基于流量的灰度发布能力,可以将流量的百分比进行灰度发布。

在介绍 Knative 灰度发布和自动弹性之前,先带大家了解一下 ASK Knative 中的流量请求机制

1.png

如上图所示,整体的流量请求机制分为以下部分:

  • 左侧是 Knative Service 的版本信息,可以对流量设置百分比;下面是路由策略,在路由策略里,通过 Ingress controller 将相应的路由规则设置到阿里云 SLB;
  • 右侧是对应创建的服务版本 Revision,在版本里对应有 Deployment 的资源,当流量通过 SLB 进来之后,直接根据相应的转发规则,转到后端服务器 Pod 上。

除了流量请求机制外,上图还展示了相应的弹性策略,如 KPA、HPA 等。

Service 生命周期

Service 是直接面向开发者操作的资源对象,包含两部分的资源:Route 和 Configuration。

2.png

如上图所示,用户可以通过配置 Configuration 里面的信息,设置相应的镜像、内容以及环境变量信息。

1. Configuration

3.png

Configuration 是:

  • 管理容器期望的状态;
  • 类似版本控制器,每次更新 Configuration 都会创建新的版本(Revision)。

如上图所示,与 Knative Service 相比较,Configuration 和它的配置很接近,Configuration 里配置的就是容器期望的资源信息。

2. Route

4.png

Route 可以:

  • 控制流量分发到不同的版本(Revision);
  • 支持按照百分比进行流量分发。

如上图所示,一个 Route 资源,下面包括一个 traffic 信息,traffic 里面可以设置对应的版本和每个版本对应的流量比例。

3. Revision

5.png

  • 一个 Configuration 的快照;
  • 版本追踪、回滚。

Knative Service 中版本管理的资源:Revision,它是 Configuration 的快照,每次更新 Configuration 就会创建一个新的 Revision,可以通过 Revision 实现版本追踪、灰度发布以及回滚。在 Revision 资源里面,可以直接地看到配置的镜像信息。

基于流量的灰度发布

6.png

如上图所示,假如一开始我们创建了 V1 版本的 Revision,这时如果有新的版本变更,那么我们只需要更新 Service 中的 Configuration,就会相应的创建出 V2 版本。然后通过 Route 对 V1 和 V2 设置不同的流量比例,上图中 V1 是 70%,V2 是 30%,流量会按照 7:3 的比例分别分发到两个版本上。一旦 V2 版本验证没有问题,接下来就可以通过调整流量比例的方式进行继续灰度,直到新的版本 V2 达到 100%。

在灰度的过程中,一旦发现新版本有异常,随时可以调整流量比例进行回滚。假设灰度到 30% 的时候,发现 V2 版本有问题,我们就可以把比例调回去,在原来的 V1 版本上设置流量 100%,实现回滚操作。

除此之外,我们还可以在 Route 中通过 traffic 对 Revision 打上一个 Tag,打完 Tag 之后,在 Knative 中会自动对当前的 Revision 生成一个可直接访问的 URL,通过这个 URL 我们可以直接把相应的流量打到当前的某一个版本上去,这样可以实现对某个版本的调试。

自动弹性

在 Knative 中提供了丰富的弹性策略,除此之外,ASK Knative 中还扩展了一些相应的弹性机制,接下来分别介绍以下几个弹性策略:

  • Knative Pod 自动扩缩容 (KPA);
  • Pod 水平自动扩缩容 (HPA);
  • 支持定时 + HPA 的自动扩缩容策略;
  • 事件网关(基于流量请求的精准弹性);
  • 扩展自定义扩缩容插件。

1. 自动扩缩容-KPA

7.png
▲Knative Pod 自动扩缩容(KPA)

如上图所示,Route 可以理解成流量网关;Activator 在 Knative 中承载着 0~1 的职责,当没有请求流量时, Knative 会把相应的服务挂到 Activator Pod 上面,一旦有第一个流量进来,首先会进入到 Activator,Activator 收到流量之后,会通过 Autoscaler 扩容 Pod,扩容完成之后 Activator 把请求转发到相应的 Pod 上去。一旦 Pod ready 之后,那么接下来相应的服务会通过 Route 直接打到 Pod 上面去,这时 Activator 已经结束了它的使命。

在 1~N 的过程中,Pod 通过 kube-proxy 容器可以采集每个 Pod 里面的请求并发指数­,也就是请求指标。Autoscaler 根据这些请求指标进行汇聚,计算相应的需要的扩容数,实现基于流量的最终扩缩容。

2. 水平扩缩容-HPA

8.png
▲Pod 水平自动扩缩容(HPA)

它其实是将 K8s 中原生的 HPA 做了封装,通过 Revision 配置相应的指标以及策略,使用 K8s 原生的 HPA,支持 CPU、Memory 的自动扩缩容。

3. 定时+HPA 融合

9.png

  • 提前规划容量进行资源预热;
  • 与 CPU、Memory 进行结合。

在 Knative 之上,我们将定时与 HPA 进行融合,实现提前规划容量进行资源预热。我们在使用 K8s 时可以体会到,通过 HPA 进行扩容时,等指标阈值上来之后再进行扩容的话,有时满足不了实际的突发场景。对于一些有规律性的弹性任务,可以通过定时的方式,提前规划好某个时间段需要扩容的量。

我们还与 CPU、Memory 进行结合。比如某个时间段定时设置为 10 个 Pod,但是当前 CPU 对阈值计算出来需要 20 个 Pod,这时会取二者的最大值,也就是 20 个 Pod 进行扩容,这是服务稳定性的最基本保障。

4. 事件网关

10.png

  • 基于请求数自动弹性;
  • 1 对 1 任务分发。

事件网关是基于流量请求的精准弹性。当事件进来之后,会先进入到事件网关里面,我们会根据当前进来的请求数去扩容 Pod,扩容完成之后,会产生将任务和 Pod 一对一转发的诉求。因为有时某个 Pod 同一时间只能处理一个请求,这时候我们就要对这种情况进行处理,也就是事件网关所解决的场景。

5. 自定义扩缩容插件

11.png

自定义扩缩容插件有 2 个关键点:

  • 采集指标;
  • 调整 Pod 实例数。

指标从哪来?像 Knative 社区提供的基于流量的 KPA,它的指标是通过一个定时的任务去每个 Pod 的 queue-proxy 容器中拉取 Metric 指标。通过 controller 对获取这些指标进行处理,做汇聚并计算需要扩容多少 Pod。

怎么执行扩缩容?其实通过调整相应的 Deployment 里面的 Pod 数即可。

调整采集指标和调整 Pod 实例数,实现这两部分后就可以很容易地实现自定义扩缩容插件。

实操演示

下面进行示例演示,演示内容主要有:

  • 基于流量的灰度发布;
  • 基于流量的自动扩缩容。

作者简介

李鹏,花名:元毅,阿里云容器平台高级开发工程师,2016 年加入阿里, 深度参与了阿里巴巴全面容器化、连续多年支持双十一容器化链路。专注于容器、Kubernetes、Service Mesh 和 Serverless 等云原生领域,致力于构建新一代 Serverless 平台。当前负责阿里云容器服务 Knative 相关工作。

Serverless 电子书下载

本书亮点

  • 从架构演进开始,介绍 Serverless 架构及技术选型构建 Serverless 思维;
  • 了解业界流行的 Serverless 架构运行原理;
  • 掌握 10 大 Serverless 真实落地案例,活学活用。

下载链接https://developer.aliyun.com/topic/download?id=1128

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
运维 Kubernetes 监控
Log/Trace/Metric 完成 APIServer 可观测覆盖
12 月 11 日,OpenAI 出现了全球范围的故障,影响了 ChatGPT/API/Sora/Playground/Labs 等服务,持续时间超过四个小时。究其背后原因,主要是新部署的服务产生大量的对 K8s APIServer 的请求,导致 APIServer 负载升高,最终导致 DNS 解析不能工作,影响了数据面业务的功能。面对 APIServer 这类公用基础组件,如何通过 Log/Trace/Metric 完成一套立体的覆盖体系,快速预警、定位根因,降低不可用时间变得非常重要。
220 87
Log/Trace/Metric 完成 APIServer 可观测覆盖
|
存储 缓存 安全
90%的Go语言程序员map遍历方式都是错的
90%的Go语言程序员map遍历方式都是错的
485 0
|
容器 Kubernetes API
深入解析 Kubebuilder:让编写 CRD 变得更简单
作者 | 刘洋(炎寻) 阿里云高级开发工程师 导读:自定义资源 CRD(Custom Resource Definition)可以扩展 Kubernetes API,掌握 CRD 是成为 Kubernetes 高级玩家的必备技能,本文将介绍 CRD 和 Controller 的概念,并对 CRD 编写框架 Kubebuilder 进行深入分析,让您真正理解并能快速开发 CRD。
12475 3
|
10月前
|
消息中间件
使用RabbitMQ如何保证消息不丢失 ?
RabbitMQ通过发布者确认、回执机制、消息持久化及消费者确认等方案,确保消息从发送到接收的每个环节都能有效防止丢失。即便如此,特殊情况下仍可能丢失,如系统故障等。为此,可设计消息状态表,记录消息ID、内容、交换机、路由键、发送时间和签收状态等,结合定时任务检查并重发未签收消息,以进一步提升消息传输的可靠性。
193 1
|
9月前
|
数据可视化 BI 项目管理
还在手忙脚乱?快用看板可视化工具打造你的高效工作流
看板可视化工具源自生产线管理,现广泛应用于项目管理,通过卡片和泳道设计直观展示任务状态,提升团队协作效率。文章介绍了5款热门工具:板栗看板、Trello、Asana、Monday.com和Jira,分析了各自特点及适用场景,帮助团队选择合适的工具,实现高效工作流。
178 3
|
设计模式 算法 C++
C++架构之美:设计卓越应用
C++架构之美:设计卓越应用
725 3
|
人工智能 缓存 安全
Golang 搭建 WebSocket 应用(七) - 性能、可用性
Golang 搭建 WebSocket 应用(七) - 性能、可用性
131 1
|
存储 SQL 关系型数据库
你有这么高效的MySQL版本号排序,记住我给出的原理
在MySQL中,对版本号进行正确排序遇到了问题,表现为不符合常规的版本比较逻辑,如“1.0.12”被错误地排在“1.0.2”之后。这可能是由于接口在处理版本号比较时的算法或逻辑错误。为解决这个问题,提出了四个优化方案。
|
小程序 开发者
如何调试已经上线的小程序
如何调试已经上线的小程序
421 0
|
存储 NoSQL 前端开发
MongoDB——副本集与分片
 MongoDB复制是将数据同步在多个服务器的过程。
1039 0
MongoDB——副本集与分片