Kubernetes 学习总结(40)—— Kubernetes 之 自动伸缩 HPA、VPA、CA和CPA详解

前言

Kubernetes 提供了多种自动伸缩机制,例如 HPA(Horizontal Pod Autoscaling),可以根据不同情况动态调整 Pod 副本数量。此功能使 Pod 能够有效地处理当前流量,而无需管理员不断干预来调整副本数量。除了 HPA 之外,Kubernetes 还提供了其他相关机制,例如 VPA(Vertical Pod Autoscaler)、CA(Cluster Autoscaler)和 CPA(Custom Pod Autoscaler)。

  1. 适用场景
  2. 触发条件
  3. 调整目标

我们将深入研究每个机制的这三个维度。

HPA(水平 Pod 自动缩放器)

适用场景

Deployment/ReplicaSet 可以部署 Pod 的多个副本,但固定数量缺乏灵活性,尤其是当应用程序流量根据特定时段波动时。在这种场景下,你可以使用HPA(Horizontal Pod Autoscaler)[1]来动态调整Pod的数量。

触发条件

HPA 是 Kubernetes 中的内置控制器。它与API Server通信以确定是否调整Pod的数量(增加或减少)。当 Metrics Server 安装在环境中时,它可以利用 CPU/内存等资源使用指标来做出决策。这些指标与 Pod 中配置的 CPU/内存请求进行比较,以确定是否超出阈值。此外,可以根据总体 Pod 使用情况或特定容器使用情况来计算使用情况。

调整目标

HPA 调整 Pod 的数量。 有多个参数(包括Behaviour)可以调整,允许你指定每次调整时 Pod 数量应变化的百分比或绝对值。除了默认的资源使用情况外,HPA 还可以结合 KEDA(https://keda.sh/)等指标或项目来提供不同角度的决策。

VPA(垂直 Pod 自动缩放器)

适用场景

与水平扩展副本数量以处理流量的 HPA 不同,VPA[2]会调整各个实例的资源使用情况,例如 CPU 和内存。将新应用程序部署到 Kubernetes 时,通常会遇到配置资源请求/限制设置的困难。VPA持续观察实例的资源使用情况并执行相关操作。这些操作可能涉及调整设置和重新启动 Pod,或者只是提供建议而不重新启动 Pod。后者依赖Operator根据观察到的资源使用情况收集和修改Deployment文件。

触发条件

在环境中部署 VPA 控制器后,你可以创建 VPA 来指定需要观察哪些Deployment。VPA 主要侧重于观察和计算 CPU/内存请求/限制设置的适当数字。观察这一点需要时间,并且基于太短的收集时间获得的结果可能会导致不适当的使用估计。

调整目标

VPA 以每个 Pod 为基础运行。它不会修改 Pod 副本的数量,但会估计 CPU/内存请求/限制使用情况。 Auto/Recreate模式下,设置相应的值,并重启Pod。在Off模式下,仅执行计算而不重新启动 Pod。

CPA(集群比例自动缩放器)

适用场景

HPA和VPA是管理资源使用、基于水平和垂直方面调整应用程序以满足当前需求的常用方法。CPA[3]旨在根据集群规模水平扩展 Pod 副本数量。一个常见的例子是 DNS 服务。CPA可以根据当前集群规模动态调整DNS实例数量,集群规模可以是节点数,也可以是整体CPU容量。与HPA/VPA关注应用本身的资源使用情况不同,CPA的触发调整是根据节点自身的能力进行的。设置从应用程序的角度开始,探索每个副本可以处理多少个节点实例或总 CPU 实例。相关设置包括coresPerReplicanodesPerReplica。当前合适的 Pod 数量使用以下公式计算:副本 = max(ceil(核心 * 1/coresPerReplica), ceil(节点 * 1/nodesPerReplica))

调整目标

CPA根据配置的coresPerReplicanodesPerReplica以及当前节点规模计算出合适的数量。它动态调整目标 Pod 副本。

CA(集群自动缩放器)

适用场景

之前的HPA、VPA、CPA等方法都是根据各种情况动态调整Pod的数量。CA[4]则根据具体情况动态调整节点数量。例如,当 Pod 充分利用所有节点上的资源,没有为新部署留下 CPU/内存资源时,CA 会动态添加新节点以提供额外的计算资源。反之,当节点资源使用率较低时,可以动态移除节点,尤其是在云环境中,以节省成本。在节点移除过程中,常见的做法是使用类似于Drain的方法。必须注意PodDisruptionBudget和TerminationGracePeriodSeconds等参数,以确保应用程序过渡期间对现有服务的影响最小。Drain 命令能否成功完成取决于该节点上的所有 Pod 是否都被成功移除。如果有 Pod 需要较长的时间(terminationGracePeriodSeconds)来处理 Grafecul 关闭过程,则节点驱逐的时间取决于这些 Pod 是否顺利终止。

触发条件

一个常见的触发场景是当任何 Pod 由于 k8s 集群资源不足而进入 Pending 状态时。此操作会提示 CA 控制器添加新节点。一旦新节点成功添加到 Kubernetes 集群并变为 Ready,应用程序就可以顺利部署和运行。相反,当节点使用率在一定时间内低于阈值时,可以移动目标节点上的 Pod 并删除该节点。不同的 Kubernetes 平台有不同的实现,因此需要确认具体的实现和相关设置,例如将新节点均匀分布在不同的可用区或使用注释来防止特定应用程序被驱逐。所有设置均取决于平台。

调整目标

CA 根据每个节点进行调整。 当一个节点被删除时,所有正在运行的 Pod 都会被重新调度到其他节点。

总结

Kubernetes提供了多种自动伸缩机制,如HPA(水平Pod自动缩放器),可根据不同情况动态调整Pod副本数量。此功能使Pod能够有效处理当前流量,无需管理员不断干预。除了HPA外,还有VPA(垂直Pod自动缩放器)、CA(集群比例自动缩放器)和CPA(自定义Pod自动缩放器)。它们分别从水平和垂直方面,以及整个集群规模角度,调整Pod和节点数量。这些机制相互补充,可根据需求灵活运用。

  1. 上述所有机制并不相互排斥。例如,某个应用类别可以使用HPA来调整Pod数量,并与CA相辅相成,动态调整节点数量以满足需求。

  2. 由于这些操作导致 Pod 和节点数量的增加或减少,可能会出现意外的 Pod 分发场景。在这种情况下,可能需要像descheduler[5]或Affinity、SpreadConstraint 这样的机制来平衡部署情况。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一题——LeetCode160.相交链表

个人主页:白日依山璟 专栏:Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1:示例2:提示: 2. 思路3. 代码 1. 题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的…

HarmonyOs4.0基础(一)

目录 一、HarmonyOs系统定义 1.1系统的技术特性(三大特征) 1.1.1、硬件互助、资源共享 1.1.2、一次开发、多端部署(面向开发者) 1.1.3、统一OS,弹性部署(支持多种API:ArkTs、JS、C/C、Java) 1.2、系统的技术架构 二、Harmony OS项目搭建 2.1、(D…

Github 2023-12-24 开源项目日报 Top10

根据Github Trendings的统计,今日(2023-12-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5Jupyter Notebook项目2C项目1C项目1Go项目1Java项目1JavaScript项目1Ruby项目1 Serverless Frame…

【零基础入门Docker】如何构建Web服务Dockerfile?

✍面向读者:所有人 ✍所属专栏:零基础入门Docker专栏https://blog.csdn.net/arthas777/category_12455882.html 目录 步骤1:第一步是构建我们的Docker文件,您可以使用vim编辑器。 步骤2:下一步是使用docker build命令…

【Python机器学习系列】一文搞懂机器学习中的转换器和估计器(附案例)

一、引言 表格数据一套完整的机器学习建模流程如下: 在机器学习中,转换器(Transformer)和估计器(Estimator)是两个重要的概念,转换器和估计器在机器学习中扮演不同的角色,但它们通常…

【论文解读】CNN-Based Fast HEVC Quantization Parameter Mode Decision

时间:2019 年 级别:SCI 机构:南京信息工程大学 摘要 随着多媒体呈现技术、图像采集技术和互联网行业的发展,远程通信的方式已经从以前的书信、音频转变为现在的音频/视频。和 视频在工作、学习和娱乐中的比例不断提高&#xff0…

Python如何将图片转换成字符

PIL(Python Image Library)库是Python平台上一个功能强大的图像处理标准库,支持图像的存储、显示和处理,几乎可以处理所有图片格式,如图像的压缩、裁剪、叠加、添加文字等等。 安装PIL库:pip install pillow from PIL import Image ascii_cha…

35c3 krautflare

参考这篇文章可以彻底了解本题的漏洞所在 https://xz.aliyun.com/t/6527 由于Math.expm1经过patch以后的返回值不可能是-0,但是patch的地方是在typer优化中,所以实际上如果没有优化的话是可以返回-0的,这就意味着如果我们先不停地Math.expm1…

手机技巧:安卓微信8.0.45测试版功能来了

目录 一、更新介绍 二、本次功能更新介绍 2.1 小程序界面优化 2.2 小程序个性化推荐支持关闭 三、其他实用的微信使用长按小技巧 3.1、长按对话框 3.2、长按搜索 3.3、长按相册 3.4、长按视频 3.5、长按表情包(能开启2个技巧) 3.6、长按音频文…

Linux——环境变量与本地变量

环境变量与本地变量 文章目录 环境变量与本地变量1. 环境变量1.1 命令行参数1.2 环境变量PATH1.3 环境变量的概念和相关操作1.3.1 用命令查看环境变量1.3.2 用命令添加环境变量:1.3.2 用命令删除环境变量1.3.3 利用代码查看环境变量1.3.4 利用代码修改或添加环境变量…

运行时和编译时使用的so库不同是否影响可执行文件执行

引子 近日遇到如下问题: 1.如果可执行文件依赖的so库在编译和执行阶段使用的名字一样,但是内容不一样,比如运行时相比于编译时在so库里增加了几个api定义,so库还可以正常使用吗? 2.如果可执行文件依赖的so库在编译和执行阶段使用的…

一文带你认识JVM

🚗🚗🚗今天给大家分享的关于JVM的一些基本认识。 清风的CSDN博客 🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! ✈️✈…

Lambda表达式超详解

目录 背景 Lambda表达式的用法 函数式接口 Lambda表达式的基本使用 语法精简 变量捕获 匿名内部类 匿名内部类中的变量捕获 Lambda的变量捕获 Lambda表达式在类集中的使用 Collection接口 List接口 Map接口 总结 背景 Lambda表达式是Java SE 8中的一个重要的新特性.…

cygwin64环境搭建

文章目录 cygwin64环境搭建概述为了编译GNU软件需要安装的组件如下当缺软件的时候, 可以用搜索功能END cygwin64环境搭建 概述 cygwin64主页 https://cygwin.com/ 用起来确实有用linux的感觉, 而且兼容性特别好. GNU的工程全部能编译过. 编译后的exe在win10上也运行的很正正…

Python教程(17)——python模块是什么?python模块详解

Python模块简介 模块是一个包含了Python定义和语句的文件,可用于将功能组织成可重用和可维护的代码块。每个Python文件都可以作为一个模块,模块可以包含变量、函数、类或可执行代码。通过使用模块,我们可以将代码分离成逻辑单元,…

代码规范-代码注释,及注释辅助工具

文章目录 代码规范-代码注释,及注释辅助工具1.常见代码块注释提示标签2.JSDoc3.注释格式 参考:https://knightyun.github.io/2020/03/13/js-comment-format 代码规范-代码注释,及注释辅助工具 1.常见代码块注释提示标签 descfileauthorpara…

抖音小店怎么做?三大核心做好,一周起店不是问题!

大家好,我是电商糖果 有不少朋友说自己的店铺开好之后,不会做。 店铺一直没有流量,也不出单。 糖果做电商七年了,做抖店四年了,不敢自夸自己做店有多牛逼。 但是一个项目我可以做四年之久,我的做店方法…

条款 9:绝不在构造和析构过程中调用虚函数

假设有个类的继承体系,用于建模股票交易,例如买入订单、卖出订单等。此类交易是可审计的,因此每次创建交易对象时,都需要在审计日志中创建适当的条目。 class Transaction { // 所有交易的基类 public: Transaction();virtual vo…

RIPEMD加密算法:原理、应用与安全性

一、引言 在信息时代,数据安全愈发受到重视,加密算法作为保障信息安全的关键技术,其性能和安全性备受关注。RIPEMD(RACE Integrity Primitives Evaluation Message Digest)加密算法作为一种著名的哈希函数&#xff0c…

Folium基础使用-python创建交互式地图与标记

使用 Folium 创建交互式地图与标记 Folium 是一个基于 Leaflet.js 的 Python 库,用于创建交互式地图。下面我们将分别介绍 folium.Map 和 folium.Marker 的使用,展示如何创建一个简单的地图并在上面添加标记点。 创建地图 - folium.Map 首先&#xff…