Kubernetes Autoscaler解析

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介: 随着Kubernetes生态的不断壮大,一度被誉为新一代数据中心操作系统(DCOS),从资源角度来讲,K8S其核心工作也是管理整个集群的计算资源,并按需合理分配给系统里的程序(以Pod为基础的各种WorkLoad)。本质也是解决资源与业务负载之间供需平衡的问题。因此,了解Kubernetes自动扩展功能的相关原理,可以帮助我们在资源管理层面获得更多的价值,有利于提升运维效能。

      随着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的指标后,我们可以看到相关详细信息:


[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行为,具体如下所示:


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 水平自动扩缩控制器根据当前指标和期望指标来计算扩缩比例。具体可参考:


期望副本数 = 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的弹性伸缩机制以及其所涉及的关键要素。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
存储 Kubernetes API
使用Kubernetes管理容器化应用的深度解析
【5月更文挑战第20天】本文深度解析Kubernetes在管理容器化应用中的作用。Kubernetes是一个开源平台,用于自动化部署、扩展和管理容器,提供API对象描述应用资源并维持其期望状态。核心组件包括负责集群控制的Master节点(含API Server、Scheduler、Controller Manager和Etcd)和运行Pod的工作节点Node(含Kubelet、Kube-Proxy和容器运行时环境)。
|
2月前
|
域名解析 Kubernetes 网络协议
【域名解析DNS专栏】云原生环境下的DNS服务:Kubernetes中的DNS解析
【5月更文挑战第29天】本文探讨了Kubernetes中的DNS解析机制,解释了DNS如何将服务名转换为网络地址,促进集群内服务通信。Kubernetes使用kube-dns或CoreDNS作为内置DNS服务器,每个Service自动分配Cluster IP和DNS条目。通过示例展示了创建Service和使用DNS访问的流程,并提出了优化DNS解析的策略,包括使用高性能DNS解析器、启用DNS缓存及监控日志,以实现更高效、可靠的DNS服务。
|
18天前
|
Kubernetes 应用服务中间件 API
Kubernetes关键组件解析
【6月更文挑战第12天】Kubernetes是一个用于管理容器集群的平台,由Master节点负责集群控制,而Node节点执行管理命令。
|
2月前
|
存储 弹性计算 Kubernetes
【阿里云云原生专栏】深入解析阿里云Kubernetes服务ACK:企业级容器编排实战
【5月更文挑战第20天】阿里云ACK是高性能的Kubernetes服务,基于开源Kubernetes并融合VPC、SLB等云资源。它提供强大的集群管理、无缝兼容Kubernetes API、弹性伸缩、安全隔离及监控日志功能。用户可通过控制台或kubectl轻松创建和部署应用,如Nginx。此外,ACK支持自动扩缩容、服务发现、负载均衡和持久化存储。多重安全保障和集成监控使其成为企业云原生环境的理想选择。
235 3
|
2月前
|
SQL Kubernetes 调度
【技术解析 | 实践】部署Kubernetes模式的Havenask集群
本次分享内容为havenask的kubernetes模式部署,由下面2个部分组成(部署Kubernetes模式Havenask集群、 Kubernetes模式相关问题排查),希望可以帮助大家更好了解和使用Havenask。
59653 9
|
2月前
|
Kubernetes 调度 异构计算
Kubernetes 调用 GPU解析
Kubernetes (K8s) 支持调用GPU以利用其统一调度和分配集群资源的能力,管理异构计算,如加速部署、提高资源使用率和保证资源独享。通过容器化和设备隔离,K8s确保GPU高效、安全地被应用使用。要调用GPU,需安装NVIDIA GPU驱动、CUDA工具包和Device Plugin,然后在Pod配置中指定GPU需求。安装步骤包括:确保GPU节点、安装GPU驱动和NVIDIA容器运行时、创建GPU资源要求的Pod并部署到集群。
|
2月前
|
运维 监控 Kubernetes
Kubernetes Pod深度解析:构建可靠微服务的秘密武器(下)
本文旨在全面而深入地探讨Kubernetes(K8s)中的Pod概念,为读者提供对其核心特性和应用场景的深入理解。Pod作为Kubernetes的最小部署单元,承载着容器化应用的核心功能,是构建云原生应用的重要基石。
|
29天前
|
Kubernetes 微服务 容器
Aspire项目发布到远程k8s集群
Aspire项目发布到远程k8s集群
380 2
Aspire项目发布到远程k8s集群
|
17天前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
205 3
|
2天前
|
Kubernetes 网络协议 Docker
k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船
k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船

推荐镜像

更多