Knative 基本功能深入剖析: Knative Serving 自动扩缩容 Autoscaler - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AlibabaSS
V2EX    推广

Knative 基本功能深入剖析: Knative Serving 自动扩缩容 Autoscaler

  •  
  •   AlibabaSS 2019-07-26 10:40:39 +08:00 1955 次点击

    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---> +--| 20 | | | <------Panic Window | | Stable Target---> +-------------------------|--| 10 CONCURRENCY | | | | <-----------Stable Window | | | --------------------------+-------------------------+--+ 0 120 60 0 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: 100 container-concurrency-target-percentage: 1.0 enable-scale-to-zero: true enable-vertical-pod-autoscaling: false max-scale-up-rate: 10 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: 100` 

    这个值可以通过 Revision 中的 autoscaling.knative.dev/target 注释进行修改:

    autoscaling.knative.dev/target: 50 

    containerConcurrency

    注意:只有在明确需要限制在给定时间有多少请求到达应用程序时,才应该使用 containerConcurrency (容器并发)。只有当应用程序需要强制的并发约束时,才建议使用 containerConcurrency。

    containerConcurrency 限制在给定时间允许并发请求的数量(硬限制),并在 Revision 模板中配置。

    containerConcurrency: 0 | 1 | 2-N 
    • 1: 将确保一次只有一个请求由 Revision 给定的容器实例处理;
    • 2-N: 请求的并发值限制为 2 或更多;
    • 0: 表示不作限制,有系统自身决定。

    配置扩缩容边界( minScale 和 maxScale )

    通过 minScale 和 maxScale 可以配置应用程序提供服务的最小和最大 Pod 数量。通过这两个参数配置可以控制服务冷启动或者控制计算成本。

    minScale 和 maxScale 可以在 Revision 模板中按照以下方式进行配置:

    spec: template: metadata: autoscaling.knative.dev/minScale: "2" autoscaling.knative.dev/maxScale: "10" 

    通过在 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: "10" 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 50 -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: "10" autoscaling.knative.dev/minScale: "1" autoscaling.knative.dev/maxScale: "3" 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 50 -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/classautoscaling.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 交流群

    2 条回复    2019-09-06 14:00:04 +08:00
    6i3BMhWCpKaXhqQi
        1
    6i3BMhWCpKaXhqQi  
       2019-09-04 17:27:34 +08:00
    mark 写得不出,交流群在哪里,加一下。
    AlibabaSS
        2
    AlibabaSS  
    OP
       2019-09-06 14:00:04 +08:00
    @changhai 钉钉群号:23302777
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1072 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 23:17 PVG 07:17 LAX 15:17 JFK 18:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86