前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kubernetes Autoscaler解析

Kubernetes Autoscaler解析

作者头像
Luga Lee
发布于 2021-12-09 12:42:49
发布于 2021-12-09 12:42:49
98000
代码可运行
举报
文章被收录于专栏:架构驿站架构驿站
运行总次数:0
代码可运行

随着Kubernetes生态的不断壮大,一度被誉为新一代数据中心操作系统(DCOS),从资源角度来讲,K8S其核心工作也是管理整个集群的计算资源,并按需合理分配给系统里的程序(以Pod为基础的各种WorkLoad)。本质也是解决资源与业务负载之间供需平衡的问题。因此,了解Kubernetes自动扩展功能的相关原理,可以帮助我们在资源管理层面获得更多的价值,有利于提升运维效能。

伸缩对象?

在Kubernetes生态环境中,通常有两件关键事项需要进行弹性伸缩,以使得资源处于最优状态:

Pod:对于给定的应用程序,假设我们正在运行X副本,如果发出的请求超出X Pod池的处理能力,则为该应用程序扩展到多个X副本是一个好主意。为了使它无缝运行,我们的节点应具有足够的可用资源,以便可以成功调度和执行这些额外的Pod。这使我们进入了扩展规模的第二部分。

Node:所有节点的总容量代表集群的容量。如果工作负载需求超出了此容量,则必须将节点添加到集群中,并确保可以有效地计划和执行工作负载。如果Pod继续扩展,则有时节点可用的资源将耗尽,我们将不得不添加更多节点以增加集群级别的整体可用资源。

伸缩时机?

何时扩缩的决定包括两个部分:一个是连续测量某个指标,而该指标何时超过阈值,然后通过缩放特定资源对其进行操作。例如,我们可能想要测量我们的Pod的平均CPU消耗,然后在CPU消耗超过80%时触发定标操作。但是一个度量标准并不适合所有用例,对于不同类型的应用程序,该度量标准可能会有所不同。例如,对于消息队列,处于等待状态的消息数可能是适当的指标。对于内存密集型应用程序,内存消耗可能是该指标。如果我们有一个业务应用程序,对于给定的容量Pod,每秒处理大约1000个事务,那么我们可能要使用该指标并在Pod中的TPS达到850以上时进行扩展。

到目前为止,我们仅考虑了扩展部分,但是当工作负载使用率下降时,应该有一种方法可以适当地进行扩展,而不会引起正在处理的现有请求的中断。我们将在后面的部分中查看这些事情的实现细节。

如何伸缩?

对于Pod而言,只需在复制控制器中更改副本数即可。对于节点,若基于云平台,我们可以调用云提供商的API,创建一个新实例,并使它成为群集的一部分,只不过相对平常的操作,可能会花费更多时间。

Kubernetes弹性伸缩

了解了弹性伸缩后,让我们讨论Kubernetes弹性伸缩的特定实现和技术细节。

1、Cluster Autoscaler

集群自动扩缩器在Kubernetes中用于动态扩展集群(即节点)。它会持续监视Pod,如果发现Pod无法安排,则根据Pod Condition,选择扩展。这比查看节点的CPU总百分比要有效得多。由于创建节点最多可能需要一分钟或更长时间,具体取决于我们的云提供商和其他因素,因此可能需要一些时间才能安排Pod。在集群中,我们可能有多个节点池,例如,一个用于计费应用程序的节点池和另一个用于机器学习工作负载的节点池。此外,节点可以分布在区域中的各个可用区中,并且扩展方式可能会因拓扑而异。集群自动扩缩器提供各种标记和方法来调整节点扩缩行为。

为了缩减规模,需要查看该节点上的平均利用率,当然也可以依据其他因素。例如,如果具有节点中断预算的节点在无法重新调度的节点上运行,则无法从群集中剔除该节点。集群自动扩缩器提供了一种方法,可以优雅地终止节点,并且最多可以有10分钟的时间来移动Pod。

2、Horizontal Pod Autoscaler (HPA)

Pod水平自动扩缩器是一个控制回路,可监视和扩缩部署中的Pod。由控制器管理器的 --horizontal-pod-autoscaler-sync-period 参数指定周期(默认值为 15 秒)。每个周期内,控制管理器根据每个 HorizontalPodAutoscaler 定义中指定的指标查询资源利用率。控制管理器可以从资源度量指标 API(按 Pod 统计的资源用量)和自定义度量指标 API(其他指标)获取度量值。我们可以定义阈值以及部署应扩展到的最小和最大扩展。HPA的原始版本为GA(autoscaling / v1),仅支持将CPU作为可以监控的指标。Beta版的当前HPA版本(autoscaling / v2beta1)支持内存和其他自定义指标。我们来看下Pod 水平自动扩缩工作机制,如下图所示:

通常情况下,控制器将从一系列的聚合 API(metrics.k8s.io、custom.metrics.k8s.io 和 external.metrics.k8s.io)中获取度量值。创建HPA对象并能够查询该Pod的指标后,我们可以看到相关详细信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[administrator@JavaLangOutOfMemory k8s-master %]kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE helloetst-ownay28d Deployment/helloetst-ownay28d 8% / 60% 1 4 1 23h

我们可以通过向控制管理器添加标志来对水平pod自动缩放器的行为进行一些调整:

1、通过使用标志-horizontal-pod-autoscaler-sync-periodon控制管理器,确定hPa监视Pod池上给定指标的频率。默认同步周期为30秒。

2、两次操作之间的延迟默认为3分钟,可以使用标志-horizontal-pod-autoscaler-upscale-delay进行控制。

3、两次缩减操作之间的延迟默认情况下为5分钟,并且可以通过标志-horizontal-pod-autoscaler-downscale-delay进行调整。

关于指标, 在Kubernetes 1.9及更高版本中,API指标服务器是首选方法。

伸缩策略

从 v1.18 开始,v2beta2 API 允许通过 HPA 的 behavior 字段配置扩缩行为。在 behavior 字段中的 scaleUp 和 scaleDown 分别指定扩容和缩容行为。可以两个方向指定一个稳定窗口,以防止扩缩目标中副本数量的波动。类似地,指定扩缩策略可以控制扩缩时副本数的变化率。我们看一个关于默认的Demo行为,具体如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
behavior:
  scaleDown:
    stabilizationWindowSeconds: 300
    policies:
    - type: Percent
      value: 100
      periodSeconds: 15
  scaleUp:
    stabilizationWindowSeconds: 0
    policies:
    - type: Percent
      value: 100
      periodSeconds: 15
    - type: Pods
      value: 4
      periodSeconds: 15
    selectPolicy: Max

用于缩小稳定窗口的时间为 300 秒(或是 --horizontal-pod-autoscaler-downscale-stabilization 参数设定值)。只有一种缩容的策略,允许 100% 删除当前运行的副本,这意味着扩缩目标可以缩小到允许的最小副本数。对于扩容,没有稳定窗口。当指标显示目标应该扩容时,目标会立即扩容。这里有两种策略:每 15 秒添加 4 个 Pod 或 100% 当前运行的副本数,直到 HPA 达到稳定状态。其他的策略可参考官网定义。

伸缩算法

从最基本的角度来看,Pod 水平自动扩缩控制器根据当前指标和期望指标来计算扩缩比例。具体可参考:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]

举个简单的场景:假设当前度量值为 200m,目标设定值为 100m,那么根据公式 200.0/100.0 =2.0, 副本数量将会翻倍。如果当前指标为 50m,副本数量将会减半,因为50.0/100.0 = 0.5。如果计算出的扩缩比例接近 1.0 (根据--horizontal-pod-autoscaler-tolerance 参数全局配置的容忍值,默认为 0.1),将会放弃本次扩缩。

针对如下异常场景,算法策略如下:

1、如果 HorizontalPodAutoscaler 指定的是 targetAverageValue 或targetAverage

Utilization, 那么将会把指定 Pod 度量值的平均值做为 currentMetricValue。 然而,在检查容忍度和决定最终扩缩值前,我们仍然会把那些无法获取指标的 Pod 统计进去。

2、所有被标记了删除时间戳(Pod 正在关闭过程中)的 Pod 和失败的 Pod 都会被忽略。

3、如果某个 Pod 缺失度量值,它将会被搁置,只在最终确定扩缩数量时再考虑。

4、当使用 CPU 指标来扩缩时,任何还未就绪(例如还在初始化)状态的 Pod 或 最近的指标 度量值采集于就绪状态前的 Pod,该 Pod 也会被搁置。

5、由于受技术限制,Pod 水平扩缩控制器无法准确的知道 Pod 什么时候就绪, 也就无法决定是否暂时搁置该 Pod。--horizontal-pod-autoscaler-initial-readiness-delay 参数(默认为 30s)用于设置 Pod 准备时间, 在此时间内的 Pod 统统被认为未就绪。--horizontal-pod-autoscaler-cpu-initialization-period 参数(默认为5分钟) 用于设置 Pod 的初始化时间, 在此时间内的 Pod,CPU 资源度量值将不会被采纳。

最后,来一张简单的思维导图,可以帮助大家能够深入去了解、学习K8S的弹性伸缩机制以及其所涉及的关键要素。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构驿站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
K8s pod 动态弹性扩缩容(HPA )部署!步骤齐全,少走坑路
Horizontal Pod Autoscaler(HPA,Pod水平自动伸缩),根据平均 CPU 利用率、平均内存利用率或你指定的任何其他自定义指标自动调整 Deployment 、ReplicaSet 或 StatefulSet 或其他类似资源,实现部署的自动扩展和缩减,让部署的规模接近于实际服务的负载。HPA不适用于无法缩放的对象,例如DaemonSet。
民工哥
2022/10/27
6.8K0
K8s pod 动态弹性扩缩容(HPA )部署!步骤齐全,少走坑路
Kubernetes HPA 控制器横向伸缩的关键实现
HPA 是 Kubernetes 中横向伸缩的实现,里面有很多可以借鉴的思想,比如延迟队列、时间序列窗口、变更事件机制、稳定性考量等关键机制, 让我们一起来学习下大佬们的关键实现。
我是阳明
2020/06/19
1K0
Kubernetes HPA 控制器横向伸缩的关键实现
基于事件驱动的Kubernetes弹性伸缩工具keda
本规范描述了ScaledObject自定义资源定义,用于定义 KEDA 应如何扩展您的应用程序以及触发器是什么。
码农小辉
2022/09/07
1.8K0
一文搞懂使用 KEDA 实现 Kubernetes 自动弹性伸缩
Hello folks,我是 Luga,今天我们来聊一下云原生生态领域相关的技术 - Auto Scaling ,即 “弹性伸缩” 。
Luga Lee
2023/12/26
2.7K0
一文搞懂使用 KEDA 实现 Kubernetes 自动弹性伸缩
一文看懂 Kubernetes 弹性伸缩
在 Kubernetes 集群中,自动化资源管理和伸缩是保持应用高效运行的关键。Kubernetes 提供了几种不同的机制来帮助实现这一目标:水平自动伸缩(HPA, Horizontal Pod Autoscaler)、垂直自动伸缩(VPA, Vertical Pod Autoscaler)和集群自动伸缩(CA, Cluster Autoscaler)。这些伸缩器在功能和使用场景上有所不同:
SRE运维手记
2024/09/06
5400
一文看懂 Kubernetes 弹性伸缩
挖掘Kubernetes 弹性伸缩:水平 Pod 自动扩展的全部潜力
Kubernetes 已成为容器编排事实上的标准,为大规模管理容器化应用程序提供了强大的平台。Kubernetes 的一项基本功能是其弹性伸缩功能,它允许应用程序根据工作负载和性能指标进行扩展或缩减。在本文中,我们将探讨 Horizontal Pod Autoscaler (HPA),它是 Kubernetes 自动缩放的关键组件。我们将深入研究 HPA 的基础知识、它的工作原理以及如何使用自定义指标和资源限制来增强其性能。
用户1107783
2023/09/11
1K0
挖掘Kubernetes 弹性伸缩:水平 Pod 自动扩展的全部潜力
在腾讯云容器服务 TKE 中利用 HPA 实现业务的弹性伸缩
jokey,腾讯云容器产品工程师,热衷于云原生领域。目前主要负责腾讯云TKE 的售中、售后的技术支持,根据客户需求输出合理技术方案与最佳实践。 概述 Kubernetes Pod 水平自动扩缩(Horizontal Pod Autoscaler,以下简称 HPA)可以基于 CPU 利用率、内存利用率和其他自定义的度量指标自动扩缩 Pod 的副本数量,以使得工作负载服务的整体度量水平与用户所设定的目标值匹配。本文将介绍和使用腾讯云容器服务 TKE 的 HPA 功能实现 Pod 自动水平扩缩容。 使用场景 H
腾讯云原生
2020/12/03
2.8K0
Kubernetes 微服务最佳实践
原文作者:ryan4yin,🔗: https://thiscute.world/posts/kubernetes-best-practices/ 本文主要介绍我个人在使用 Kubernetes 的过程中,总结出的一套「Kubernetes 配置」,是我个人的「最佳实践」。其中大部分内容都经历过线上环境的考验,但是也有少部分还只在我脑子里模拟过,请谨慎参考。 阅读前的几个注意事项: 这份文档比较长,囊括了很多内容,建议当成参考手册使用,先参照目录简单读一读,有需要再细读相关内容。 这份文档需要一定的 Kube
我的小碗汤
2023/03/19
1.2K0
Kubernetes 微服务最佳实践
kubernetes(十六) k8s 弹性伸缩
常规的做法是给集群资源预留保障集群可用,通常20%左右。这种方式看似没什么问题,但放到Kubernetes中,就会发现如下2个问题。
alexhuiwang
2020/09/23
3.6K0
kubernetes(十六) k8s 弹性伸缩
Pod容器自动伸缩(HPA) 测试
HPA(Horizontal Pod Autoscaler)在k8s集群中用于POD水平自动伸缩,它是基于CPU和内存利用率对Deployment和Replicaset控制器中的pod数量进行自动扩缩容(除了CPU和内存利用率之外,也可以基于其他应程序提供的度量指标custom metrics进行自动扩缩容)。pod自动缩放不适用于无法缩放的对象,比如DaemonSets。HPA由Kubernetes API资源和控制器实现。资源决定了控制器的行为,控制器会周期性的获取CPU和内存利用率,并与目标值相比较后来调整replication controller或deployment中的副本数量。
洗尽了浮华
2020/11/24
1K0
《Kubernetes》- 认识下Pod的管理者?
大家好,我是小菜,前面几篇文章我们已经从 k8s 集群的搭建然后到 k8s 中NameSpace 再说到了 k8s 中 Pod 的使用,如果还干到意犹未尽,那么接下来的 Pod 控制器 同样是一道硬菜!死鬼~看完记得给我来个三连哦!
蔡不菜丶
2021/05/18
6030
《Kubernetes》- 认识下Pod的管理者?
cluster-proportional-autoscaler小记
此组件监视集群的可调度节点和核心的数量,并调整所需资源的副本数量。对于需要随集群大小自动扩展的应用程序,例如 DNS 和其他随集群中节点/pod 数量扩展的服务。
铜锣烧
2022/11/09
7500
一文搞懂 Kubernetes HPA 实现原理-(上篇)
Hello folks,我是 Luga,今天我们来聊一下云原生生态核心技术 Kubernetes Autoscaling 之一的—— Horizontal Pod Autoscaler (HPA)。
Luga Lee
2023/08/11
2.9K3
一文搞懂 Kubernetes HPA 实现原理-(上篇)
13.深入k8s:Pod 水平自动扩缩HPA及其源码分析
Pod 水平自动扩缩全名是Horizontal Pod Autoscaler简称HPA。它可以基于 CPU 利用率或其他指标自动扩缩 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 数量。
luozhiyun
2020/10/10
2.5K0
13.深入k8s:Pod 水平自动扩缩HPA及其源码分析
Kubernetes自动伸缩101:集群自动伸缩、水平自动伸缩和垂直豆荚自动伸缩
Kubernetes的核心是资源管理和编排工具。可以将第1天操作作为重点来探索和体验它的酷特性来部署、监控和控制你的豆荚。但是,你还需要考虑第2天的操作。你需要关注以下问题:
CNCF
2019/12/04
2.3K0
如何根据不同业务场景调节 HPA 扩缩容灵敏度
roc,腾讯高级工程师,Kubernetes Contributor,热爱开源,专注云原生领域。目前主要负责腾讯云TKE 的售中、售后的技术支持,根据客户需求输出合理技术方案与最佳实践,为客户业务保驾护航。 背景 在 K8s 1.18 之前,HPA 扩容是无法调整灵敏度的: 对于缩容,由 kube-controller-manager 的 --horizontal-pod-autoscaler-downscale-stabilization-window 参数控制缩容时间窗口,默认 5 分钟,即负载减小
腾讯云原生
2021/01/07
1.2K2
k8s技术圈一周精选[第7期]
HPA 控制器与聚合 API 获取到 Pod 性能指标数据之后,基于下面的算法计算出目标 Pod 副本数量,与当前运行的 Pod 副本数量进行对比,决定是否需要进行扩缩容操作:
我是阳明
2020/08/11
7950
【K8s】Kubernetes 稳定性之自动扩缩容
在 Kubernetes 中,自动扩缩容是一种动态调整集群资源,以灵活应对应用程序资源需求变化的机制。
行者Sun
2024/09/11
3350
【K8s】Kubernetes 稳定性之自动扩缩容
Kubernetes HPA级别扩缩容配置预览
本文分析 HPA 功能增强的建议,而不是真正的实现。Kubernetes 1.16 发布前夕,该功能增强还没有合入,所以最快也要到 1.17 版本发布。
CNCF
2019/12/05
1.6K0
Kubernetes HPA级别扩缩容配置预览
kubernetes 降本增效标准指南|理解弹性,应用弹性
王孝威,腾讯云容器产品经理,热衷于为客户提供高效的 Kubernetes 使用方式,为客户极致降本增效服务。 弹性伸缩在云计算领域的简述 弹性伸缩又称自动伸缩,是云计算场景下一种常见的方法,弹性伸缩可以根据服务器上的负载,按一定的规则进行弹性的扩缩容服务器。 弹性伸缩在不同场景下的含义: 对于服务运行在自建机房的公司,弹性伸缩通常意味着允许一些服务器在低负载时进入睡眠状态,从而节省电费(以及用于冷却机器的水费和电费)。 对于使用在托管于云上的机房的公司而言,自动扩展可能意味着更低的费用,因为大多数云提供
腾讯云原生
2021/05/28
3.2K0
推荐阅读
相关推荐
K8s pod 动态弹性扩缩容(HPA )部署!步骤齐全,少走坑路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档