Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
Knative Serving 默认情况下,提供了开箱即用的快速、基于请求的自动扩缩容功能 - Knative Pod Autoscaler(KPA)。下面带你体验如何在 Knative 中玩转 Autoscaler。
Autoscaler 机制
Knative Serving 为每个 POD 注入 QUEUE 代理容器 (queue-proxy),该容器负责向 Autoscaler 报告用户容器并发指标。Autoscaler 接收到这些指标之后,会根据并发请求数及相应的算法,调整 Deployment 的 POD 数量,从而实现自动扩缩容。
算法
Autoscaler 基于每个 POD 的平均请求数(并发数)进行扩所容处理。默认并发数为 100。
POD 数=并发请求总数/容器并发数
如果服务中并发数设置了 10,这时候如果加载了 50 个并发请求的服务,Autoscaler 就会创建了 5 个 POD (50 个并发请求/10=POD)。
Autoscaler 实现了两种操作模式的缩放算法:Stable(稳定模式)和 Panic(恐慌模式)。
稳定模式
在稳定模式下,Autoscaler 调整 Deployment 的大小,以实现每个 POD 所需的平均并发数。 POD 的并发数是根据 60 秒窗口内接收所有数据请求的平均数来计算得出。
恐慌模式
Autoscaler 计算 60 秒窗口内的平均并发数,系统需要 1 分钟稳定在所需的并发级别。但是,Autoscaler 也会计算 6 秒的恐慌窗口,如果该窗口达到目标并发的 2 倍,则会进入恐慌模式。在恐慌模式下,Autoscaler 在更短、更敏感的紧急窗口上工作。一旦紧急情况持续 60 秒后,Autoscaler 将返回初始的 60 秒稳定窗口。
- |
- Panic Target---> +--|
- | |
- | <------Panic Window
- | |
- Stable Target---> +-------------------------|--| CONCURRENCY
- | | |
- | <-----------Stable Window
- | | |
- --------------------------+-------------------------+--+
- TIME
配置 KPA
通过上面的介绍,我们对 Knative Pod Autoscaler 工作机制有了初步的了解,那么接下来介绍如何配置 KPA。在 Knative 中配置 KPA 信息,需要修改 k8s 中的 ConfigMap:config-autoscaler,该 ConfigMap 在 knative-serving 命名空间下。查看 config-autoscaler 使用如下命令:
- kubectl -n knative-serving get cm config-autoscaler
默认的 ConfigMap 如下:
- apiVersion: v1
- kind: ConfigMap
- metadata:
- name: config-autoscaler
- namespace: knative-serving
- data:
- container-concurrency-target-default:
- container-concurrency-target-percentage: 1.0
- enable-scale-to-zero: true
- enable-vertical-pod-autoscaling: false
- max-scale-up-rate:
- panic-window: 6s
- scale-to-zero-grace-period: 30s
- stable-window: 60s
- tick-interval: 2s
为 KPA 配置缩容至 0
为了正确配置使 Revision 缩容为 0,需要修改 ConfigMap 中的如下参数。
scale-to-zero-grace-period
scale-to-zero-grace-period 表示在缩为 0 之前,inactive revison 保留的运行时间(最小是3 0s)。
- scale-to-zero-grace-period: 30s
stable-window
当在 stable mode 模式运行中,autoscaler 在稳定窗口期下平均并发数下的操作。
- stable-window: 60s
stable-window 同样可以配置在 Revision 注释中。
- autoscaling.knative.dev/window: 60s
enable-scale-to-zero
保证 enable-scale-to-zero 参数设置为 true
Termination period
Termination period(终止时间)是 POD 在最后一个请求完成后关闭的时间。POD 的终止周期等于稳定窗口值和缩放至零宽限期参数的总和。在本例中,Termination period 为 90 秒。
配置并发数
可以使用以下方法配置 Autoscaler 的并发数:
target
target 定义在给定时间(软限制)需要多少并发请求,是 Knative 中 Autoscaler 的推荐配置。
在 ConfigMap 中默认配置的并发 target 为 100。
- `container-concurrency-target-default: `
这个值可以通过 Revision 中的 autoscaling.knative.dev/target
注释进行修改:
- autoscaling.knative.dev/target:
containerConcurrency
注意:只有在明确需要限制在给定时间有多少请求到达应用程序时,才应该使用 containerConcurrency (容器并发)。只有当应用程序需要强制的并发约束时,才建议使用 containerConcurrency。
containerConcurrency 限制在给定时间允许并发请求的数量(硬限制),并在 Revision 模板中配置。
- containerConcurrency: | | -N
- 1: 将确保一次只有一个请求由 Revision 给定的容器实例处理;
- 2-N: 请求的并发值限制为2或更多;
- 0: 表示不作限制,有系统自身决定。
配置扩缩容边界(minScale 和 maxScale)
通过 minScale 和 maxScale 可以配置应用程序提供服务的最小和最大 Pod 数量。通过这两个参数配置可以控制服务冷启动或者控制计算成本。
minScale 和 maxScale 可以在 Revision 模板中按照以下方式进行配置:
- spec:
- template:
- metadata:
- autoscaling.knative.dev/minScale: ""
- autoscaling.knative.dev/maxScale: ""
通过在 Revision 模板中修改这些参数,将会影响到 PodAutoscaler 对象,这也表明在无需修改 Knative Serving 系统配置的情况下,PodAutoscaler 对象是可被修改的。
- edit podautoscaler <revision-name>
注意:这些注释适用于 Revision 的整个生命周期。即使 Revision 没有被任何 route 引用,minscale 指定的最小 POD 计数仍将提供。请记住,不可路由的 Revision 可能被垃圾收集掉。
默认情况
如果未设置 minscale 注释,pods 将缩放为零(如果根据上面提到的 configmap,enable-scale-to-zero 为 false,则缩放为 1)。
如果未设置 maxscale 注释,则创建的 Pod 数量将没有上限。
基于 KPA 配置的示例
Knative 0.7 版本部署安装可以参考:阿里云部署 Knative
我们使用官方提供的 autoscale-go 示例来进行演示,示例 service.yaml 如下:
- apiVersion: serving.knative.dev/v1alpha1
- kind: Service
- metadata:
- name: autoscale-go
- namespace: default
- spec:
- template:
- metadata:
- labels:
- app: autoscale-go
- annotations:
- autoscaling.knative.dev/target: ""
- spec:
- containers:
- - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1
获取访问网关:
- $ kubectl get svc istio-ingressgateway --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}"
- 121.199.194.150
Knative 0.7 版本中获取域名信息:
- $ kubectl get route autoscale-go --output jsonpath="{.status.url}"| awk -F/ '{print $3}'
- autoscale-go.default.example.com
场景1:并发请求示例
如上配置,当前最大并发请求数 10。 我们执行 30s 内保持 50 个并发请求,看一下执行情况:
- hey -z 30s -c -host "autoscale-go.default.example.com" "http://121.199.194.150?sleep=100&prime=10000&bloat=5"
结果正如我们所预期的:扩容出来了 5 个 POD。
场景2:扩缩容边界示例
修改一下 servcie.yaml 配置如下:
- apiVersion: serving.knative.dev/v1alpha1
- kind: Service
- metadata:
- name: autoscale-go
- namespace: default
- spec:
- template:
- metadata:
- labels:
- app: autoscale-go
- annotations:
- autoscaling.knative.dev/target: ""
- autoscaling.knative.dev/minScale: ""
- autoscaling.knative.dev/maxScale: ""
- spec:
- containers:
- - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1
当前最大并发请求数 10,minScale 最小保留实例数为 1,maxScale 最大扩容实例数为 3。
我们依然执行 30s 内保持 50 个并发请求,看一下执行情况:
- hey -z 30s -c -host "autoscale-go.default.example.com" "http://121.199.194.150?sleep=100&prime=10000&bloat=5"
结果如我们所预期:最多扩容出来了 3 个POD,并且即使在无访问请求流量的情况下,保持了 1 个运行的 POD。
结论
看了上面的介绍,是不是感觉在 Knative 中配置应用扩缩容是如此简单?其实 Knative 中除了支持 KPA 之外,也支持K8s HPA。你可以通过如下配置基于 CPU 的 Horizontal POD Autoscaler(HPA)。
通过在修订模板中添加或修改 autoscaling.knative.dev/class
和 autoscaling.knative.dev/metric
值作为注释,可以将Knative 配置为使用基于 CPU 的自动缩放,而不是默认的基于请求的度量。配置如下:
- spec:
- template:
- metadata:
- autoscaling.knative.dev/metric: concurrency
- autoscaling.knative.dev/class: hpa.autoscaling.knative.dev
你可以自由的将 Knative Autoscaling 配置为使用默认的 KPA 或 Horizontal POD Autoscaler(HPA)。
欢迎加入 Knative 交流群
Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler的更多相关文章
- 三十三、HPA实现自动扩缩容
通过HPA实现业务应用的动态扩缩容 HPA控制器介绍 当系统资源过高的时候,我们可以使用如下命令来实现 Pod 的扩缩容功能 $ kubectl -n luffy scale deployment m ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容
上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...
- Marathon自动扩缩容(marathon-lb-autoscale)
我们在服务里面创建如下的应用(以下是创建完复制过来的json): { "id": "/nginxtest", "cmd": null, &q ...
- minikube metrics-server HPA 自动扩缩容错误
minikube metrics-server pod 错误 启动 minikube addons enable metrics-server 之后查看 metrics-server pod 会有如下 ...
- 【六】K8s-Pod 水平自动扩缩实践(简称HPA)
一.概述 Pod 水平自动扩缩(Horizontal Pod Autoscaler)简称 HPA,HPA 可以根据 CPU 利用率进行自动伸缩 Pod 副本数量,除了 CPU 利用率,也可以基于其他应 ...
- 13.深入k8s:Pod 水平自动扩缩HPA及其源码分析
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 Pod 水平自动扩缩 Pod 水平自动扩缩工作原理 Pod 水平自动 ...
- Knative 基本功能深入剖析:Knative Serving 之服务路由管理
导读:本文主要围绕 Knative Service 域名展开,介绍了 Knative Service 的路由管理.文章首先介绍了如何修改默认主域名,紧接着深入一层介绍了如何添加自定义域名以及如何根据 ...
- Knative 基本功能深入剖析:Knative Serving 的流量灰度和版本管理
作者|冬岛 阿里云技术专家 本篇主要介绍 Knative Serving 的流量灰度,通过一个 rest-api 的例子演示如何创建不同的 Revision.如何在不同的 Revision 之间按照流 ...
- Knative 基本功能深入剖析:Knative Eventing 之 Sequence 介绍
作者 | 元毅,阿里云容器平台高级开发工程师,负责阿里云容器平台 Knative 相关工作. 导读:在实际的开发中我们经常会遇到将一条数据需要经过多次处理的场景,称为 Pipeline.那么在 Kna ...
随机推荐
- DedeCMS V5.7 SP2后台代码执行漏洞复现(CNVD-2018-01221)
dedeCMS V5.7 SP2后台代码执行漏洞复现(CNVD-2018-01221) 一.漏洞描述 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统.Dedecms V5.7 SP2 ...
- nginx: [emerg] unknown directive “ ” in /usr/local/nginx/nginx.conf.conf:xx报错处理
当我们在修改Nginx的配置文件,然后加载配置文件./nginx -s reload 报错类似的错误, nginx: [emerg] unknown directive “ ” in /usr/l ...
- JAVA的基本语法1
1.关键字 关键字的定义和特点 定义:被JAVA语言赋予了特殊含义,用作专门用途的字符串(单词). 就是在java语言编程的时候,在关键的地方使用的单词,体现关键的地方的含义.这些单词都是特有的,并且 ...
- 【win10】通过环境变量来快速打开应用程序
step1:建一个空文件夹,并把文件夹路径复制到剪贴板. step2:依次右键点击“此电脑”.属性.高级系统设置.环境变量,定位到“系统变量”,点击新建. (说明:环境变量分为用户变量和系统变量,用户 ...
- C# 结构与类
结构是一种可以包含数据成员和方法成员的值类型数据结构.为结构分配数据时不需要从托管堆中分配内存,结构类型的变量直接包含了该结构的数据.结构中可以包含构造函数,常量,字段方法,属性,运算符,事件和嵌套类 ...
- 按需动态加载js
有些时间我们希望能按需动态加载js文件,而不是直接在HTML中写script标签. 以下为示例代码: var js = document.createElement('script'); js.asy ...
- Dynamics CRM中的操作(action)是否是一个事务(transaction)?
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复168或者20151104可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 以前的博文 微软Dynamics ...
- RSA加密算法破解及原理
- RSA算法原理 - - 加密与解密 在RSA中,Bob想给Alice发一个消息X,Alice公钥为(e,n),私钥为(n,d). 加密和解密的过程如下: - RSA暴力破解 RSA暴力破解,简单理 ...
- DIY客户端框架
C/S类型的客户端做过好多轮了,在架构上每次都调整优化一部分,慢慢的形成了DIY的框架性东西. 可是最近这一看呢,已经不像MVC了,然后有一天看到了MVP概念,咦!很像.再一看,嗯,就该是MVP. M ...
- iOS10 新特性一
链接:http://www.jianshu.com/p/0cc7aad638d9 1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是 ...