Kubernetes 的自动伸缩你用对了吗?

d78f4734e12fb1ea7054d5c46518d224.gif

作者 | AddoZhang

来源 | 云原生指北

本文翻译自 learnk8s 的 Architecting Kubernetes clusters — choosing the best autoscaling strategy[1],有增删部分内容。

9fbe770662d6b3dc99d46a9525d2f479.png

TL;DR: 在默认设置下,扩展 Kubernetes 集群中的 pod 和节点可能需要几分钟时间。了解如何调整集群节点的大小、配置水平和集群自动缩放器以及过度配置集群以加快扩展速度。

自动扩展器

在 Kubernetes 中,常说的“自动扩展”有:

•HPA:Pod 水平缩放器[2]

•VPA:Pod 垂直缩放器[3]

•CA:集群自动缩放器[4]

不同类型的自动缩放器,使用的场景不一样。

HPA

HPA 定期检查内存和 CPU 等指标,自动调整 Deployment 中的副本数,比如流量变化:

2ee993d05c29b78281747d57c9f5c915.png

调整前

6d7aa74e2e6c49858022750b9f506edf.png

调整后

VPA

有些时候无法通过增加 Pod 数来扩容,比如数据库。这时候可以通过 VPA 增加 Pod 的大小,比如调整 Pod 的 CPU 和内存:

f04d387ac8959eab47c5f3f59006df60.png

调整前

e887bc75b5ac6c5c28efb6ed153e85de.png

调整后

CA

当集群资源不足时,CA 会自动配置新的计算资源并添加到集群中:

a3779a815a0ddbca3af8ed505c90cecc.png

调整前

5de9001b3b38c2201af153195601f6fd.png

调整后

自动缩放 Pod 出错时

比如一个应用需要 1.5 GB 内存和 0.25 个 vCPU。一个 8GB 和 2 个 vCPU 的节点,可以容纳 4 个这样的 Pod,完美!

72ff74dc77e63ea7f8b6478af93e881f.png

做如下配置:

1.HPA:每增加 10 个并发,增加一个副本。即 40 个并发的时候,自动扩展到 4 个副本。(这里使用自定义指标,比如来自 Ingress Controller 的 QPS)

2.CA:在资源不足的时候,增加计算节点。

当并发达到 30 的时候,系统是下面这样。完美!HPA 工作正常,CA 没工作。

123ceac089efc9568b0d2b95ce96b232.png

当增加到 40 个并发的时候,系统是下面的情况:

1.HPA 增加了一个 Pod

2.Pod 挂起

3.CA 增加了一个节点

3087110ea8e84113988fe4683ccd114a.png

HPA 工作

50f526a7d72a96a62c16ab7643de476d.png

CA 工作

为什么 Pod 没有部署成功?

节点上的操作系统进程和 kubelet 也会消耗一部分资源,8G 和 2 vCPU 并不是全都可以提供给 Pod 用的。并且还有一个驱逐阈值[5]:在节点系统剩余资源达到阈值时,会驱逐 Pod,避免 OOM 的发生。

c9a98967635349ca24a482947da2299c.png

当然上面的这些都是可配置[6]的。

那为什么在创建该 Pod 之前,CA 没有增加新的节点呢?

CA 如何工作?

CA 在触发自动缩放时,不会查看可用的内存或 CPU。

CA 是面向事件工作的,并每 10 秒检查一次是否存在不可调度(Pending)的 Pod。

当调度器无法找到可以容纳 Pod 的节点时,这个 Pod 是不可调度的。

此时,CA 开始创建新节点:CA 扫描集群并检查是否有不可调度的 Pod。

当集群有多种节点池,CA 会通过选择下面的一种策略:

random:默认的扩展器,随机选择一种节点池

most-pods:能够调度最多 Pod 的节点池

least-waste:选择扩展后,资源空闲最少的节点池

price:选择成本最低的节点池

priority:选择用户分配的具有最高优先级的节点池

确定类型后,CA 会调用相关 API 来创建资源。(云厂商会实现 API,比如 AWS 添加 EC2;Azure 添加 Virtual Machine;阿里云增加 ECS;GCP 增加 Compute Engine)

计算资源就绪后,就会进行节点的初始化[7]

注意,这里需要一定的耗时,通常比较慢。

探索 Pod 自动缩放的前置时间

四个因素:

1.HPA 的响应耗时

2.CA 的响应耗时

3.节点的初始化耗时

4.Pod 的创建时间

默认情况下,kubelet 每 10 秒抓取一次 Pod 的 CPU 和内存占用情况[8]

每分钟,Metrics Server 会将聚合的指标开放[9]给 Kubernetes API 的其他组件使用。

b7a109c5804475e32b597b514068fa3c.png

CA 每 10 秒排查不可调度的 Pod。[10]

•少于 100 个节点,且每个节点最多 30 个 Pod,时间不超过 30s。平均延迟大约 5s。

•100 到 1000个节点,不超过 60s。平均延迟大约 15s。

598e2284faab9a0c0793547f37ce041f.png

节点的配置时间,取决于云服务商。通常在 3~5 分钟。

1b8ae9b7254d87e094eccb6ac6822da8.png

容器运行时创建 Pod:启动容器的几毫秒和下载镜像的几秒钟。如果不做镜像缓存,几秒到 1 分钟不等,取决于层的大小和梳理。

c7b6b3c80febb4726e3d177a697ad097.png

对于小规模的集群,最坏的情况是 6 分 30 秒。对于 100 个以上节点规模的集群,可能高达 7 分钟。

HPA delay:1m30s+CA delay:0m30s+Cloud provider:4m+Container runtime:0m30s+=========================Total6m30s

突发情况,比如流量激增,你是否愿意等这 7 分钟?

这 7 分钟,如何优化压缩?

•HPA 的刷新时间,默认 15 秒,通过 --horizontal-pod-autoscaler-sync-period 标志控制。

•Metrics Server 的指标抓取时间,默认 60 秒,通过 metric-resolution 控制。

•CA 的扫描间隔,默认 10 秒,通过 scan-interval 控制。

•节点上缓存镜像,比如 kube-fledged[11] 等工具。

即使调小了上述设置,依然会受云服务商的时间限制。

那么,如何解决?

两种尝试:

1.尽量避免被动创建新节点

2.主动创建新节点

为 Kubernetes 选择最佳规格的节点

这会对扩展策略产生巨大影响。

这样的场景

应用程序需要 1GB 内存和 0.1 vCPU;有一个 4GB 内存和 1 个 vCPU 的节点。

排除操作系统、kubelet 和阈值保留空间后,有 2.5GB 内存和 0.7 个 vCPU 可用。

b23802a33d24eda8c7437f1d3d2d2428.png

最多只能容纳 2 个 Pod,扩展副本时最长耗时 7 分钟(HPA、CA、云服务商的资源配置耗时)

假如节点的规格是 64GB 内存和 16 个 vCPU,可用的资源为 58.32GB 和 15.8 个 vCPU。

这个节点可以托管 58 个 Pod。只有扩容第 59 个副本时,才需要创建新的节点。

b89fdaa8f078e999dd77cf865103cefa.png

CleanShot 2021-06-08 at 23.16.56@2x

这样触发 CA 的机会更少。

选择大规格的节点,还有另外一个好处:资源的利用率会更高。

e055db4b88c9add7e06808eadba1546b.png

节点上可以容纳的 Pod 数量,决定了效率的峰值。

物极必反!更大的实例,并不是一个好的选择:

1.爆炸半径(Blast radius):节点故障时,少节点的集群和多节点的集群,前者影响更大。

2.自动缩放的成本效益低:增加一个大容量的节点,其利用率会比较低(调度过去的 Pod 数少)

即使选择了正确规格的节点,配置新的计算单元时,延迟仍然存在。怎么解决?

能否提前创建节点?

为集群过度配置节点

即为集群增加备用节点,可以:

1.创建一个节点,并留空 (比如 SchedulingDisabled)

2.一旦空节点中有了一个 Pod,马上创建新的空节点

8e2d46d454dbc3b2d827b6037a6aaa3a.pngd8ec013b394f248d994cb3aba08d3c56.png

CleanShot 2021-06-08 at 23.26.26@2x

这种会产生额外的成本,但是效率会提升。

CA 并不支持此功能 -- 总是保留一个空节点。

但是,可以伪造。创建一个只占用资源,不使用资源的 Pod 占用整个 Node 节点。

038ce6c7ca9bf457aab6e057b0bb1296.png

一旦有了真正的 Pod,驱逐占位的 Pod。

06301b084beeeec792946eed5802f805.png

待后台完成新的节点配置后,将“占位” Pod 再次占用整个节点。

4be5f45b7822c0e2ebc2db4fbd68fbd1.png

这个“占位”的 Pod 可以通过永久休眠来实现空间的保留。

apiVersion: apps/v1kind:Deploymentmetadata:  name: overprovisioningspec:  replicas:1  selector:    matchLabels:      run: overprovisioningtemplate:    metadata:      labels:        run: overprovisioning    spec:      containers:- name: pause          image: k8s.gcr.io/pause          resources:            requests:              cpu:'1739m'              memory:'5.9G'

使用优先级和抢占[12],来实现创建真正的 Pod 后驱逐“占位”的 Pod。

使用 PodPriorityClass 在配置 Pod 优先级:

apiVersion: scheduling.k8s.io/v1beta1kind:PriorityClassmetadata:  name: overprovisioningvalue:-1#默认的是 0,这个表示比默认的低globalDefault:falsedescription:'Priority class used by overprovisioning.'

为“占位” Pod 配置优先级:

apiVersion: apps/v1kind:Deploymentmetadata:  name: overprovisioningspec:  replicas:1  selector:    matchLabels:      run: overprovisioningtemplate:    metadata:      labels:        run: overprovisioning    spec:      priorityClassName: overprovisioning #HERE      containers:- name: reserve-resources          image: k8s.gcr.io/pause          resources:            requests:              cpu:'1739m'              memory:'5.9G'

已经做完过度配置,应用程序是否需要优化?

为 Pod 选择正确的内存和 CPU 请求

Kubernetes 是根据 Pod 的内存和 CPU 请求,为其分配节点。

如果 Pod 的资源请求配置不正确,可能会过晚(或过早)触发自动缩放器。

这样一个场景:

•应用程序平均负载下消耗 512MB 内存和 0.25 个 vCPU。

•高峰时,消耗 4GB 内存 和 1 个 vCPU。(即资源限制,Limit)

a038bb1a2b0fec0e1d1ae373ae5ba244.png

有三种请求的配置选择:

1.远低于平均使用量

2.匹配平均使用量

3.尽量接近限制

67fe782cdec7bd125aba6a06b77118da.png7932882f3ebd4213f7850c71222434a4.pngde93a9c60acaf1b20b6d2cd3b68e42f0.png

第一种的问题在于超卖严重,过度使用节点。kubelet 负载高,稳定性差。

9c8e7bfcd935ee45fd9bf5090a56396f.png

第三种,会造成资源的利用率低,浪费资源。这种通常被称为 QoS:Quality of Service class[13] 中的 Guaranteed 级别,Pod 不会被终止和驱逐。

4aa803afe1b9c5e44f9f941c13a8eab9.png

如何在稳定性和资源使用率间做权衡?

这就是 QoS:Quality of Service class[14] 中的 Burstable 级别,即 Pod 偶尔会使用更多的内存和 CPU。

1.如果节点中有可用资源,应用程序会在返回基线(baseline)前使用这些资源。

2.如果资源不足,Pod 将竞争资源(CPU),kubelet 也有可能尝试驱逐 Pod(内存)。

在 Guaranteed 和 Burstable 之前如何做选择?取决于:

1.想尽量减少 Pod 的重新调度和驱逐,应该是用 Guaranteed

2.如果想充分利用资源时,使用 Burstable。比如弹性较大的服务,Web 或者 REST 服务。

如何做出正确的配置?

应该分析应用程序,并测算空闲、负载和峰值时的内存和 CPU 消耗。

甚至可以通过部署 VPA 来自动调整。

如何进行集群缩容?

每 10 秒,当请求(request)利用率低于 50%时,CA 才会决定删除节点。

CA 会汇总同一个节点上的所有 Pod 的 CPU 和内存请求。小于节点容量的一半,就会考虑对当前节点进行缩减。

需要注意的是,CA 不考虑实际的 CPU 和内存使用或者限制(limit),只看请求(request)。

移除节点之前,CA 会:

1.检查 Pod[15] 确保可以调度到其他节点上。

2.检查节点[16],避免节点被过早的销毁,比如两个节点的请求都低于 50%。

检查都通过之后,才会删除节点。

为什么不根据内存或 CPU 进行自动缩放?

基于内存和 CPU 的自动缩放器,不关进 pod。

比如配置缩放器在节点的 CPU 达到总量的 80%,就自动增加节点。

当你创建 3 个副本的 Deployment,3 个节点的 CPU 达到了 85%。这时会创建一个节点,但你并不需要第 4 个副本,新的节点就空闲了。

不建议使用这种类型的自动缩放器。

总结

定义和实施成功的扩展策略,需要掌握以下几点:

•节点的可分配资源。

•微调 Metrics Server、HPA 和 CA 的刷新间隔。

•设计集群和节点的规格。

•缓存容器镜像到节点。

•应用程序的基准测试和分析。

配合适当的监控工具,可以反复测试扩展策略并调整集群的缩放速度和成本。

引用链接

[1] Architecting Kubernetes clusters — choosing the best autoscaling strategy: https://learnk8s.io/kubernetes-autoscaling-strategies#when-autoscaling-pods-goes-wrong
[2] HPA:Pod 水平缩放器: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
[3] VPA:Pod 垂直缩放器: https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler
[4] CA:集群自动缩放器: https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler
[5] 驱逐阈值: https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/#eviction-thresholds
[6] 可配置: https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable
[7] 节点的初始化: https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/
[8] kubelet 每 10 秒抓取一次 Pod 的 CPU 和内存占用情况: https://github.com/kubernetes/kubernetes/blob/2da8d1c18fb9406bd8bb9a51da58d5f8108cb8f7/pkg/kubelet/kubelet.go#L1855
[9] 每分钟,Metrics Server 会将聚合的指标开放: https://github.com/kubernetes-sigs/metrics-server/blob/master/FAQ.md#how-often-metrics-are-scraped
[10] CA 每 10 秒排查不可调度的 Pod。: https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#how-does-scale-up-work
[11] kube-fledged: https://github.com/senthilrch/kube-fledged
[12] 优先级和抢占: https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/
[13] QoS:Quality of Service class: https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#qos-classes
[14] QoS:Quality of Service class: https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#qos-classes
[15] 检查 Pod: https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#what-types-of-pods-can-prevent-ca-from-removing-a-node
[16] 检查节点: https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#i-have-a-couple-of-nodes-with-low-utilization-but-they-are-not-scaled-down-why

61739ab64970cd982484f958eec4a6c7.gif

往期推荐

如果让你来设计网络

这种本机网络 IO 方法,性能可以翻倍!

留不住客户?该从你的系统上找找原因了!

明明还有大量内存,为啥报错“无法分配内存”?

7c9e5f6b8c5812bee4b3896fd1973fe1.gif

点分享

5c28743d41b9808f57567d668ecfc8c4.gif

点收藏

dfbe87f7bf8bb16331f49f5cebced978.gif

点点赞

81846676c4444c8c5d9e8254d983e054.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贾扬清谈云原生-让数据湖加速迈入3.0时代

简介: 摘要:2021云栖大会云原生企业级数据湖专场,阿里云智能高级研究员贾扬清为我们带来《云原生--让数据湖加速迈入3.0时代》的分享。 摘要:2021云栖大会云原生企业级数据湖专场,阿里云智能高级研究员贾扬清为我们带…

一张图教你玩转阿里云双11上云狂欢节

一年一度的双11狂欢节已经开启啦!下面一张图教你如何玩转阿里云双11上云狂欢节! 双11主会场地址:http://click.aliyun.com/m/1000305076/

写时复制就这么几行代码,还是不会?

‍作者 | 闪客来源 | 低并发编程这里讲的是 Linux 内核里的写时复制原理。写时复制的原理网上讲述的文章很多,今天来一篇很直接的文章,通过看看 Linux 0.11 这个最简单的操作系统,从源码层面把写时复制的原理搞清楚。很简单哦,你可…

划重点|iOS15正式发布, 全新的通知推送系统,你必须要知道

简介: 今年友盟联合达摩院决策智能实验室讲算法技术,推出国内首个智能推送功能,帮助产品运营人员实现一键式触达的精细化运营。通过精心打磨的在线学习与优化算法,对推送人群与推送文案进行精准匹配,最大化用户点击量。…

万物互联下的碎片化怎么破?UINO优锘推出物联网产业元宇宙“物联森友会”

编辑 | 宋慧 出品 | CSDN云计算 移动浪潮之后,随着5G普及,IoT物联网已经成为下一个技术聚焦的领域。不过,万物互联中的“万物”终端,一直都存在着庞杂的应用场景,品类众多、技术指标各异的传感器,以及海量…

云湖共生-释放企业数据价值

摘要:2021云栖大会云原生企业级数据湖专场,阿里云智能资深技术专家、对象存储 OSS 负责人罗庆超为我们带来《云湖共生-释放企业数据价值》的分享。本文主要从数据湖存储演进之路、数据湖存储3.0 进化亮点等方面分享了云湖共生带来的企业价值。 摘要&…

数据湖构建与计算

简介: 2021云栖大会云原生企业级数据湖专场,阿里云智能高级产品专家李冰为我们带来《数据湖构建与计算》的分享。本文主要从数据的入湖和管理、引擎的选择展开介绍了数据湖方案降本增效的特性。 摘要:2021云栖大会云原生企业级数据湖专场&am…

天天讲路由,那 Linux 路由到底咋实现的!?

作者 | 张彦飞allen来源 | 开发内功修炼容器是一种新的虚拟化技术,每一个容器都是一个逻辑上独立的网络环境。Linux 上提供了软件虚拟出来的二层交换机 Bridge 可以解决同一个宿主机上多个容器之间互连的问题,但这是不够的。二层交换无法解决容器和宿主机…

治理企业“数据悬河”,阿里云DataWorks全链路数据治理新品发布

简介: 10月19日,在2021年云栖大会上,阿里云重磅发布DataWorks全链路数据治理产品体系,基于数据仓库,数据湖、湖仓一体等多种大数据架构,DataWorks帮助企业治理内部不断上涨的“数据悬河”,释放企…

函数式编程的Java编码实践:利用惰性写出高性能且抽象的代码

简介: 本文会以惰性加载为例一步步介绍函数式编程中各种概念,所以读者不需要任何函数式编程的基础,只需要对 Java 8 有些许了解即可。 作者 | 悬衡 来源 | 阿里技术公众号 本文会以惰性加载为例一步步介绍函数式编程中各种概念,所…

WorkManager从入门到实践,有这一篇就够了

作者 | Eason来源 | 程序员巴士前言一般情况下,我们大部分的操作都是在app打开的时候进行的,但是在某些情况下,即使app关闭了,我们也可能需要执行必要的动作,或者会采取一个动作,而不是让用户等待加载&…

终端卡顿优化的全记录

简介: 目前手机SOC的性能越来越少,很多程序员在终端程序的开发过程中也不太注意性能方面的优化,尤其是不注意对齐和分支优化,但是这两种问题一旦出现所引发的问题,是非常非常隐蔽难查的,不过好在项目中用到…

brew安装指定版本mysql,Mac 系统为 Valet 开发环境安装指定版本 MySQL

Mac 系统为 Valet 开发环境安装指定版本 MySQL由 学院君 创建于1年前, 最后更新于 5个月前版本号 #31547 views1 likes0 collects在 Mac 系统下使用 Valet 作为 Laravel 本地开发环境的话,需要自行安装 MySQL 数据库,我们通过 Homebrew 来安装。如果之前…

系统架构面临的三大挑战,看 Kubernetes 监控如何解决?

简介: 随着 Kubernetes 的不断实践落地,我们经常会遇到负载均衡、集群调度、水平扩展等问题。归根到底,这些问题背后都暴露出流量分布不均的问题。那么,我们该如何发现资源使用,解决流量分布不均问题呢?今天…

JavaScript 数组你都掰扯不明白,还敢说精通 JavaScript ?| 赠书

作者 | 哪吒来源 | CSDN博客最近小编在看文章的时候,总有很多刚刚入门的小白说精通这个,精通那个技术,更有意思的是,最近看到一则简历上说精通 JavaScript ,聊一聊发现数组还不明白,就对外说精通~所以今天小…

基于消息队列 RocketMQ 的大型分布式应用上云实践

简介: Apache RocketMQ 作为阿里巴巴开源的支撑万亿级数据洪峰的分布式消息中间件,在众多行业广泛应用。在选型过程中,开发者一定会关注开源版与商业版的业务价值对比。 那么,今天就围绕着商业版本的消息队列 RocketMQ和开源版本 …

Gartner发布2022年政府行业主要技术趋势:XaaS、数字化、超自动化等

作者 | Gartner研究副总裁 Bettina Tratz-Ryan Gartner杰出研究副总裁John Kost Gartner高级研究总监 相斌斌 供稿 | Gartner 政府领导人和民选官员在2022年不仅要面对巨大的挑战,还要把握疫情与经济复苏应对措施、不断变化的政治需求和持续数字化变革所带来的机遇…

RedShift到MaxCompute迁移实践指导

简介: 本文主要介绍Amazon Redshift如何迁移到MaxCompute,主要从语法对比和数据迁移两方面介绍,由于Amazon Redshift和MaxCompute存在语法差异,这篇文章讲解了一下语法差异 1.概要 本文档详细介绍了Redshift和MaxCompute之间SQL…

数字农业WMS库存操作重构及思考

简介: 数字农业库存管理系统在2020年时,部门对产地仓生鲜水果生产加工数字化的背景下应运而生。项目一期的数农WMS中的各类库存操作均为单独编写。而伴随着后续的不断迭代,这些库存操作间慢慢积累了大量的共性逻辑:如参数校验、幂…

数字营销行业大数据平台云原生升级实战

简介: 加和科技CTO 王可攀:技术是为业务价值而服务 王可攀 加和科技CTO 本文将基于加和科技大数据平台升级过程中面临的问题和挑战、如何调整数据平台架构以及调整后的变化,为大家介绍数字营销行业大数据平台云原生升级实战经验。主要分为以…