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

简介: 作为 Severless Framework 就离不开按需分配资源的能力,Knative 提供了基于流量的自动扩缩容能力,可以根据应用的请求量在高峰时期自动扩容实例数,当请求量减少以后自动缩容实例数,做到自动化的帮助您节省成本。此外 Knative 还提供了基于流量的灰度发布能力,可以根据流量百分比进行灰度发布。

导读

作为 Severless Framework 就离不开按需分配资源的能力,Knative 提供了基于流量的自动扩缩容能力,可以根据应用的请求量在高峰时期自动扩容实例数,当请求量减少以后自动缩容实例数,做到自动化的帮助您节省成本。此外 Knative 还提供了基于流量的灰度发布能力,可以根据流量百分比进行灰度发布。本文会从以下 4 个方面展开介绍:

  • ASK Knative 中流量请求机制
  • 基于流量的灰度发布
  • 弹性自动扩缩容
  • 示例演示


介绍Knative 灰度发布和自动弹性前,我们先来看一下 ASK Knative 中流量请求机制。

ASK Knative 流量请求机制

在 ASK Knative 中,流量首先通过SLB网关,然后根据转发规则,将请求转发到对应服务的POD上,这里转发规则是通过Knative Ingress Controlller创建,该 controller 通过 Route 中设置的规则,最终转换成 SLB 规则。

image.png

Service

Configuration

Route

externaltrafficarrives

throughthegateway

Revision

Revision1

ECI

Revision2

lngressGateway

Pod

(SLB)

a0IJss8Y

Revision3

10%

Jeuieiuo.

enENO

ECI

Jasn

Pod

Jeuiejuo.

保留规格

Route

Jsn

aneND

lngress(SLB)

Deployment

reference

scale

Autoscaler

HPA

KPA

Knative

ASK

再谈 Knative 应用生命周期


Knative Service 是直接面向开发者操作的资源对象它直接负责对Route和Configuration的管控,一个Service 分别对应一个Route和一个Configuration


Service

每次 Service 变化如果需要创建新的 Workload 就更新 Configuration,然后每次 Configuration 更更新都会创建一个唯一的 Revision。Configuration 可以认为是版本控制器,负责管理多个Revision版本

image.png

Service

Configuration

管理容器期望的状态

类似版本控制器,每次更新

Configuration都会创建新的Revision

Configuration

Route

apiversionserying.knatied/llh

kind:configuration

metadata:

Revision

name:coffee

spec:

template:

spec:

containers:

image:tegistzy.cnhangzhou

enV:

nAme:TARGET

"coffee"

value:

Route

Route 主要负责 Knative 的流量管理,控制流量分发到不同到Revision, 并且支持按照百分比进行流量分发。这里我们可以通过在Traffic中对不同的Revison 设置不同对流量比例即可控制流量分发。

image.png

Service

Route

控制流量分发到不同的Revision

支持按照百分比进行流量分发

Route

Configuration

apiversionservingknti/

kind:Route

10%

metadata:

Revision

name:coffee

spec:

traffic:

90%

Revision

revisionNamecoFfee-08-17-2019

percent:90

reyisionName:coffee-0819-2020

percent:10

Revision

Revision. 一个Revision可以认为是一个Configuration的快照。通过Revision可以实现历史版本追踪,以及灰度发布的过程中进行回滚等功能。

image.png

Service

Revision

一个Configuration的快照

.版本追踪,回滚

Configuration

Route

apiversionservingte

kind:Revision

metadata:

Revision

name:coffee-b7g8d

spec:

template:

Revision

spec:

containers:

mage:tegsty:changhou

enV:

name:TARGET

value:"coffee"



基于流量的灰度发布

那么接下来我们看一下基于流量的灰度发布我们可以怎样做。

假设一开始我们创建了V1版本的Revison, 这时候如果有新的版本变更,那么我们只需要更新Service 中的Configuration, 就会创建出V2版本,然后我们可以通过Route对V1、V2设置不同对流量比例,这里v1是70%, v2是30%, 那么流量就会分别按照7:3的比例分发到这两个版本上。一旦新到V2版本验证没有问题,那么我们接下来就可以通过调整比例继续灰度,直到新版本V2 100%。在这个灰度到过程中,一旦发现新版本有异常,可以通过调整比例进行回滚操作。

除此以外,我们可以在Route到Traffic 中对Revison打Tag,  打完Tag的Revison, 我们可以直接通过Url进行单独的版本测试,对这个版本对调试不会影响正常对流量访问。

image.png

Service

Configuration

Route

Revision1

Revision2

Revision3

自动弹性

接下来我们聊一下自动弹性。作为 Severless Framework 就离不开按需分配资源的能力,Knative 提供了基于流量的自动扩缩容KPA能力,以及基于CPU和Memory的HPA弹性能力,除此以外,Knative 提供了弹性的扩展能力,我们可以基于不同的指标自定义弹性功能。

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


KPA

Knative Serving 中默认使用KPA。

image.png

Route

active

inactive

route

route

resize

create

Pods

Deployment

Activator

metrics

Autoscaler

activate

Revision

上图展示了 Knative Autoscaler 的工作机制,Route 负责接入流量,Autoscaler 负责做弹性伸缩。当没有业务请求的时候会缩容到零,缩容到零后 Route 进来的请求会转到 Activator 上。当第一个请求进来之后 Activator 会保持住 http 链接,然后通知 Autoscaler 去做扩容。Autoscaler 把第一个 pod 扩容完成以后 Activator 就把流量转发到 Pod ,从而做到了缩容到零也不会损失流量的目的。

当后续有流量进来之后,流量会直接Route到Pod上,这时候Autoscaler会直接采集Pod中的指标,根据指标进行1-N的扩缩容操作。


HPA

基于CPU、Memory的自动扩缩容-HPA

image.png


利用 Horizontal Pod Autoscaling,kubernetes 能够根据监测到的 CPU 、Memory利用率 通过 修改deployment  中 pod 的数量,进行扩容。在Knative 中集成了HPA的能力,通过autoscaling class可以选择HPA的能力。


定时与HPA融合

支持定时+HPA的自动扩缩容:

  • 提前规划容量进行资源预热
  • 与CPU、Memory弹性指标相结合


image.png

Pod

Pod

Pod

Deployment

Revision

定时

HPA

事件网关

基于流量请求的精准弹性:

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

image.png

事件网关

POD

POD

Event

Gateway

POD

POD

Deployment

任务数

Scaler

自动弹性

自定义扩缩容插件

Knative 中提供了灵活的扩缩容插件机制, 开发者可以通过设置`autoscaling.knative.dev/class`来指定所使用的具体插件。自定义扩缩容插件只需要实现下面两个关键能力即可:

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

image.png

示例演示

这里我们分别演示一下基于流量灰度发布和自动扩缩容的功能。

灰度流量发布

我们以 helloworld 的服务为例,分别执行如下操作:

  • 创建 helloworld 服务
  • 升级服务
  • 灰度发布

创建 helloworld 服务

  1. 登录容器服务管理控制台
  2. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  3. 在集群管理页左侧导航栏中,选择应用 > Knative
  4. 服务管理页签右上角,单击创建服务
  5. 设置集群命名空间服务名称,选择所要使用的镜像和镜像版本等配置信息。这里我们创建 helloworld-go 服务。

image.png

  1. 单击创建创建完成后,您可以在服务管理页签的列表中,点击helloworld-go看到新创建的服务。


image.png

此时我们访问服务:

$ curl -H "host: helloworld-go.default.example.com" http://39.106.199.35
Hello World!

升级服务

点击【创建修订版本】,这里我们设置新版本环境变量为:TARGET=Knative

image.png

环块变量

安量/变量引用

奥型

安量名称

TARGET

自定义

KnaLivel

数称卷:

加本地存馆

存储寻炎型

挂盐源

容器路径

楼加云存声明(Persistentvolumeclaim)

挂裁源

容器游经

存储糕英型

下一步

返回

点击下一步,我们可以设置新版本的流量比例,这里我们设置新版本流量为0,点击创建。

image.png

集群:knative-系列直播-y

创建修订版本

default

b-yuanyi/命名空间:

创建完成

流晕设置

基本信息

流量设亡:

添加

流量比阿%

特订版本

最新停订版本

100

hellovrorldgom4w[2021-02-0915:23:37]

上一步

创廷

在服务详情中,可以看到新的版本已经创建完成,如图:

image.png

集群:knative-系列直番-yuany/Knative服务普理:hellowordgo

别乐

返回列表

创延修订版本

访问设五

设直流量比例

苏本信息

服务名称:

hellowiorld-go

访问网关:

39.106.199.35

默认域名:

成功

状态:

创连时间:

2021-02-0915:23:37

停订版本信

操作

锭俊

流量

创注时间

状态

2021-02-0915:32:42

工作负苛

hellowarid-go-5zcv[最新停订版本]

出险

0%

成功

registyCnhangzou.Alyncscomnemplhewq.7b

2021-02-0915:23:37

registycn-hangzhou.liyun.complh

工作负载

别险

音君Yaml

100%

球功

helloworld-qo-m45w8

由于新版本流量为0,所以当前访问helloworld-go 服务的话,还是请求到原来的版本中。

此时我们访问服务:

$ curl -H "host: helloworld-go.default.example.com" http://39.106.199.35
Hello World!

灰度发布

接下来我们开始灰度流量发布,点击【设置流量比例】,将新、旧版本各设置为50%。

image.png

在服务详情中,可以看到新、旧的版本已经创建完成,如图:

image.png

创滨停订版本

朱群:knative-系列直播-yuanyl/knative服务管理:helloworid-qo

设置流量比例

访问设置

返回列表

可新

什本信息

服务名称:

helloworld-go

访问网关:

39.106.199.35

默认域名:

helloworid-go.defaultexample.com

成功

状态:

2021-02-0915:23:37

创诺时间:

传订版本信总

操作

找态

钠像

创硅时间

流量

hellowvorld-go-5zcvj[服折停订版本]

工作负栽

现隐

2021-02-0915:32:42

成功

50%

registiycnhangzhou.aliyuncs.comnate-samleowr.

2021-02-0915:23:37

工作负钱

50%

刮除

成功

查Yam

hellowyarla-qo-m4sw8

registirycn-hangzhou.lyunsmw

由于新、旧版本流量各为50%,所以当前访问helloworld-go 服务的话,基本是50%进行流量分配。

此时我们访问服务:

image.png

我们通过调整流量比例继续灰度,直到新版本100%,完成灰度发布。

image.png

在这个过程中,如何发现新版本有问题,可以随时通过调整流量比例的方式进行回滚操作。

基于流量的自动扩缩容

我们模拟并发场景,并发50,持续30s。使用hey工具(hey压测工具的详细介绍请参见hey

hey -z 30s -c 50   -host "helloworld-go.default.example.com"   "http://39.106.199.35"

结果如下:

$ kubectl get po
helloworld-go-g2qfr-deployment-5f557f97cc-76mjb                   2/2     Running   0          38s
helloworld-go-g2qfr-deployment-5f557f97cc-7j797                   2/2     Running   0          34s
helloworld-go-g2qfr-deployment-5f557f97cc-fh4nl                   2/2     Running   0          2m4s
helloworld-go-g2qfr-deployment-5f557f97cc-kdqjx                   2/2     Running   0          38s
helloworld-go-g2qfr-deployment-5f557f97cc-kmxsz                   2/2     Running   0          26s
helloworld-go-g2qfr-deployment-5f557f97cc-p24s8                   2/2     Running   0          2m48s
helloworld-go-g2qfr-deployment-5f557f97cc-wq89q                   2/2     Running   0          36s
helloworld-go-g2qfr-deployment-5f557f97cc-zfhf6                   2/2     Running   0          38s
helloworld-go-g2qfr-deployment-5f557f97cc-xvdf6                   2/2     Running   0          38s
helloworld-go-g2qfr-deployment-5f557f97cc-aeaf8                   2/2     Running   0          37s
helloworld-go-g2qfr-deployment-5f557f97cc-dfdsa                   2/2     Running   0          46s

当然,我们也可以在日志服务中配置查看Pod扩缩容趋势

image.png


总结

本文我们介绍了基于流量的灰度发布以及自动弹性策略,并分别进行了示例演示。欢迎有兴趣同学关注 Knative 钉钉交流群。

image.png


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
JavaScript 算法
Vue的数据为什么频繁变化但只会更新一次
Vue的数据为什么频繁变化但只会更新一次
408 1
|
4月前
|
人工智能 文字识别 安全
大模型能力评测方式很多?
AI评测非单一分数比拼,而是多维度、多方法的系统工程。其核心框架可拆解为基础维度、主流基准与关键方法,共同构成模型能力的“CT扫描”系统。
431 0
|
Kubernetes 测试技术 数据库
详解微服务应用灰度发布最佳实践
相对于传统软件研发,微服务架构下典型的需求交付最大的区别在于有了能够小范围真实验证的机制,且交付单位较小,风险可控,灰度发布可以弥补线下测试的不足。本文从 DevOps 视角概述灰度发布实践,介绍如何将灰度发布与 DevOps 工作融合,快来了解吧~
33360 19
|
9月前
|
存储 Java 文件存储
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
本文介绍了如何基于Spring Boot 3和MinIO实现分布式文件存储。随着应用规模扩大,传统的单机文件存储方案难以应对大规模数据和高并发访问,分布式文件存储系统成为更好的选择。文章详细讲解了MinIO的安装、配置及与Spring Boot的整合步骤,包括Docker部署、MinIO控制台操作、Spring Boot项目中的依赖引入、配置类编写及工具类封装等内容。最后通过一个上传头像的接口示例展示了具体的开发和测试过程,强调了将API操作封装成通用工具类以提高代码复用性和可维护性的重要性。
2034 7
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
|
Kubernetes 安全 Serverless
基于Service Mesh管理Knative流量最佳实践
Istio扩展了Kubernetes,以建立可编程、应用程序感知的服务网格(Service Mesh)。Istio与Knative结合使用,可以为Serverless应用工作负载带来标准、通用的流量管理、可观测和安全性能力。
基于Service Mesh管理Knative流量最佳实践
|
算法 测试技术 持续交付
四种灰度分布方案
【6月更文挑战第10天】产品迭代加速,灰度发布成为降低风险、优化用户体验的关键。它允许新老版本并存,逐步引入流量验证新版本稳定性。
|
Kubernetes 监控 Java
发布策略:蓝绿部署、金丝雀发布(灰度发布)、AB测试、滚动发布、红黑部署的概念与区别
发布策略:蓝绿部署、金丝雀发布(灰度发布)、AB测试、滚动发布、红黑部署的概念与区别
3111 1
|
存储 Linux 程序员
Linux解压Zip文件命令详解
Linux解压Zip文件命令详解
|
tengine 运维 Kubernetes
MSE | 阿里巴巴云原生网关三位一体的选择与实践
三位一体是阿里巴巴“自研”、“开源”、“商业化”采用的统一技术体系,希望以开源做内核、结合阿里巴巴内部丰富的业态和业务需求,通过自研进一步打磨软件的性能与高可用性,最终形成三位一体的旋转飞轮。
1753 100
MSE | 阿里巴巴云原生网关三位一体的选择与实践
|
消息中间件 Kubernetes Java
全链路灰度之 RocketMQ 灰度
本文将以上次介绍过的《如何用 20 分钟就能获得同款企业级全链路灰度能力?》中的场景为基础,来进一步介绍消息场景的全链路灰度。
全链路灰度之 RocketMQ 灰度