博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Kubernetes和Istio的Serverless框架Knative解析之Autoscaler
阅读量:6240 次
发布时间:2019-06-22

本文共 3109 字,大约阅读时间需要 10 分钟。

我们都是知道Kubernetes中个资源对象叫 autoscaler,该对象在serverless架构中更是不可或缺,有了它可以负责应用的自动水平伸缩,用户再也不用关心示例的个数和资源消耗,本文是来自阿里巴巴UC事业群基础研发部的陈有坤同学对Knative的解析之autoscaler部分,还有大量的解析等待放出,起关注本站的后续内容。

是一款基于Kubernetes的平台,用来构建、部署和管理现代serverless应用的框架。该框架试图将云原生应用开发的以下三个领域的最佳实践结合起来:

  • 构建容器(和函数)
  • 为工作负载提供服务(和动态扩展)
  • 事件

Knative是由谷歌与、、 和紧密协作开发的。

Knative构建在Kubernetes和之上,它的设计考虑到了多种角色通过该框架进行交互,包括开发人员、运维人员和平台提供者。

Knative所涉及的角色(图片来源于)

Knative致力于提供可重用的“通用模式和最佳实践组合”实现,目前可用的组件包括:

  • :从源到容器的构建编排;
  • :管理和交付事件;
  • :请求驱动的计算,可以缩放到零。

以上内容引用自:

以上是对Knative的基本介绍,关于Knative的更多信息大家可以关注其GitHub:

下面首先解析的是Serving中的Autoscaling组件,该组件的功能是根据网络流量来自动伸缩应用实例的个数。

Knative是如何做伸缩容的?

处理伸缩容问题,首先要解决的问题是根据什么指标判断伸缩容?cpu、内存、请求数?这里knative使用的是请求数。

其次是伸缩多少的问题。

Knative的伸缩是依赖修改deployment的replica数实现的。

如何采集请求数?

启动revision的pod时,也会启动一个autoscaler(一个knative revision只启动一个autoscaler),autoscaler自己本身也会scale到0,用于接收请求数统计和处理伸缩容。

业务pod中,会注入queue-proxy sidecar,用于接收请求,在这里会统计并发数,每秒向autoscaler汇报,接收到的请求会转发给业务container。

注:单租户模式下一个revision启动一个autoscaler,多租户共用一个autoscaler

计算需要pod的个数?

autoscaler接收到并发统计的时候,会根据算法计算需要的pod个数。

算法中有两种模式,分别是panic和stable模式,一个是短时间,一个是长时间,为了解决短时间内请求突增的场景,需要快速扩容。

的算法是,默认的target concurrency是1,如果一个revision 35QPS,每个请求花费0.25秒,Knative Serving 觉得需要 9 个 pod。

ceil(35 * .25) = ceil(8.75) = 9复制代码

Stable Mode(稳定模式)

在稳定模式下,Autoscaler 根据每个pod期望的并发来调整Deployment的副本个数。根据每个pod在60秒窗口内的平均并发来计算,而不是根据现有副本个数计算,因为pod的数量增加和pod变为可服务和提供指标数据有一定时间间隔。

Panic Mode (恐慌模式)

Panic时间窗口默认是6秒,如果在6秒内达到2倍期望的并发,则转换到恐慌模式下。在恐慌模式下,Autoscaler根据这6秒的时间窗口计算,这样更能及时的响应突发的流量请求。每2秒调整Deployment的副本数达到想要的pod个数(或者最大10倍当前pod的数量),为了避免pod数量频繁变动,在恐慌模式下只能增加,不会减少。60秒后会恢复回稳定模式。

autoscaler单租户图

上图基于 绘制。

模式

const (   // 每个pod实例同时只处理一个请求   RevisionRequestConcurrencyModelSingle RevisionRequestConcurrencyModelType = "Single"   // 每个pod实例同时处理多个请求   RevisionRequestConcurrencyModelMulti RevisionRequestConcurrencyModelType = "Multi")复制代码

配置

apiVersion: v1kind: ConfigMapmetadata:  name: config-autoscaler  namespace: knative-servingdata:  # Static parameters:  # 期望每个pod并发请求数  multi-concurrency-target: "1.0"  # 如果是单个并发,值要接近1.0  single-concurrency-target: "0.9"  # stable窗口时间,计算平均并发会用到。如果进入panic模式后,经过stable窗口时间也会恢复stable  stable-window: "60s"  # 如果平均并发在panic窗口时间内达到2倍目标并发,autoscaler进入panic模式。  # 在panic模式下,自动伸缩按在panic窗口时间的平均并发来操作。  panic-window: "6s"  # 最大增长比例,每次调整会根据并发计算增长比例,最大增长不超过这个值  max-scale-up-rate: "10"  # 计算并发值的参数,每一段时间得到最大并发,作为一个bucket,最后汇报的时候,  # 平均并发 = 各个bucket最大并发之和 / 总bucket数,汇报间隔是1秒(hard coded)  concurrency-quantum-of-time: "100ms"  # 是否开启缩容到0  enable-scale-to-zero: "true"  # 实验性:开启垂直扩容  # Requires a VPA installation (e.g. ./third_party/vpa/install-vpa.sh)  enable-vertical-pod-autoscaling: "false"   # 如果开启了enable-vertical-pod-autoscaling,这个值就会替代multi-concurrency-target,  # 如果成熟了后期会变成默认值  vpa-multi-concurrency-target: "10.0"  # 多长时间调整一次  tick-interval: "2s"    # Dynamic parameters (take effect when config map is updated):  # 空闲多长时间缩容到0  scale-to-zero-threshold: "5m"复制代码

本文转载自:

ServiceMesher社区信息

社区官网:

Slack: 需要邀请才能加入,有志于加入ServiceMesher社区为Service Mesh作出贡献的同学可以联系我。

Twitter:

更多Service Mesh咨询请扫码关注微信公众号ServiceMesher。

作者:ServiceMesher
链接:https://juejin.im/post/5b69003df265da0f7c4fea96
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的文章
(转)Eclipse新增安卓虚拟机
查看>>
SpringMvc访问Controller去掉do
查看>>
PHPnow升级PHP 5.4与Mysql 5.5
查看>>
正则表达式验证邮箱格式
查看>>
如何围绕企业战略,建设BI驾驶舱?
查看>>
java多线程stop,suspend使用代码实际例子
查看>>
中小型研发团队架构实践三:微服务架构(MSA)
查看>>
Windows动态库学习心得
查看>>
在VMware虚拟机上安装Ubuntu 10.04
查看>>
LDA主题模型简介
查看>>
可拖动的DIV续
查看>>
关于“类型初始值设定项引发异常”
查看>>
MySql 小表驱动大表
查看>>
Redis 数据结构的底层实现 (一) RealObject,embstr,sds,ziplist,quicklist
查看>>
SQL语句注入的问题
查看>>
jQueryEasyUI Messager基本使用
查看>>
【C语言学习趣事】_33_关于C语言和C++语言中的取余数(求模)的计算_有符号和无符号数的相互转换问题...
查看>>
Tensorboard教程:显示计算图中节点信息
查看>>
java 线程基本概念 可见性 同步
查看>>
Java:JUnit包
查看>>