【Kubernetes】k8s 自动伸缩机制—— HPA 部署

一、在K8s中扩缩容分为两种:

●Node层面:对K8s物理节点扩容和缩容,根据业务规模实现物理节点自动扩缩容
Pod层面:我们一般会使用Deployment中的Replicas参数,设置多个副本集来保证服务的高可用,但是这是一个固定的值,比如我们设置10个副本,就会启10个pod同时Running来提供服务。如果这个服务平时流量很少的时候,也是10个Pod同时在Running,而流量突然暴增时,又可能出现10个Pod不够用的情况,针对这种情况就要使用扩容和缩容
自动扩容和缩容:VPA、KPA、HPA 

KPA(Knative Pod Autoscaler)

基于请求数对Pod自动扩缩容,KPA的主要限制在于它不支持基于CPU的自动扩缩容

●根据并发请求数实现自动扩缩容
●设置扩缩容边界实现自动扩缩容

扩缩容边界是指应用程序提供服务的最小和最大Pod数量。通过设置应用程序服务的最小和最大Pod数量实现自动扩缩容。

VPA

Kubernetes VPA(Vertical Pod Autoscaler)垂直Pod自动扩缩容,VPA会基于Pod的资源使用情况自动为集群设置资源占用的限制,从而让集群将Pod调度到足够资源的最佳节点上。VPA也会保持最初容器定义中资源Request和Limit的占比。

它会根据容器资源使用率自动设置Pod的CPU和内存的Request,从而允许在节点上进行适当的调度,以便为每个Pod提供适当的可用的节点。它既可以缩小过度请求资源的容器,也可以根据其使用情况随时提升资源不足的容量。

HPA

HPA(Horizontal Pod Autoscaling)Pod 水平自动伸缩,Kubernetes 有一个 HPA 的资源,HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者Replica Set 中的 Pod 数量。

(1)HPA 基于 Master 上的 kube-controller-manager 服务启动参数 horizontal-pod-autoscaler-sync-period 定义的时长(默认为30秒),周期性的检测 Pod 的 CPU 使用率。
(2)HPA 与之前的 RC、Deployment 一样,也属于一种 Kubernetes 资源对象。通过追踪分析 RC 控制的所有目标 Pod 的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理
(3)metrics-server 也需要部署到集群中, 它可以通过 resource metrics API 对外提供度量数据。

HPA 是kubernetes 中实现自动扩缩容Pod 副本数量的机制
它允许集群中的工作负载根据实际的负载情况自动调整pod的数量,以此来优化资源的使用和提高服务的响应能力

核心概念

水平扩展(Horizontal Scaling):增加Pod的数量来分摊负载,与垂直扩展(增加单个Pod的资源)相对。
Pod副本(Pod Replicas):运行应用程序的容器实例,通常是在Deployment或ReplicaSet等控制器下管理的。
指标(Metrics):用于触发HPA扩缩容的度量值,如CPU使用率、内存使用量、自定义的应用程序指标等

HPA 的配置关键参数

●ScaleTargetRef:指定 HPA 将要作用的资源对象,如 Deployment、Replica Set 或 RC 的名称。
●MinReplicas:最小副本数,即使在负载很低时也不会低于这个数量。
●MaxReplicas:最大副本数,即使在负载很高时也不会超过这个数量。
●Metrics:定义用于触发伸缩的度量标准和目标值。例如,可以设置 CPU 的利用率目标,当实际利用率超过这个目标值时,HPA 会增加副本数量;当利用率低于目标值时,HPA 会减少副本数量

二、部署 metrics-server

●metrics-server:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如kubectl、hpa、scheduler等。

//在所有 Node 节点上传 metrics-server.tar 镜像包到 /opt 目录

cd /opt/
docker load -i metrics-server.tar

设置 Helm 仓库和下载 Metrics Server 的 Helm Chart

#创建一个目录 /opt/metrics 用于存放 metrics-server 的配置文件
mkdir /opt/metrics
cd /opt/metrics#移除旧的 Helm 仓库(没有的话不用移)
helm repo remove stable
#添加新的 Helm 仓库,可以选择使用官方源或镜像源,建议使用官方
helm repo add stable https://charts.helm.sh/stable
#或
helm repo add stable http://mirror.azure.cn/kubernetes/charts
#更新Helm 仓库
helm repo update#从 Helm 仓库拉取 metrics-server chart
helm pull stable/metrics-server

 配置Metrics-Server

vim metrics-server.yaml
args:
- --logtostderr
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP
image:repository: k8s.gcr.io/metrics-server-amd64tag: v0.3.2
--------------------------------------------------
# 在 Metrics Server 的容器启动参数中添加了以下选项:
args:- --logtostderr    # 将日志输出到标准错误输出(stderr),这对于容器环境中的日志收集很常见。- --kubelet-insecure-tls   # 允许 Metrics Server 以不安全的方式与 kubelet 通信,忽略 TLS 证书验证。这在测试或非生产环境中可能用到,但生产环境应避免。- --kubelet-preferred-address-types=InternalIP  # 指定 Metrics Server 优先使用节点的 InternalIP 地址来与 kubelet 通讯,这有助于在具有多个网络接口的节点上正确路由。# 镜像信息设置:
image:repository: k8s.gcr.io/metrics-server-amd64   # 使用了 Kubernetes 官方仓库中的 Metrics Server 镜像,适用于 amd64 架构。tag: v0.3.2    # 指定了镜像的标签为 v0.3.2,代表使用的 Metrics Server 版本。
--------------------------------------------------

使用 helm install 安装 metrics-server

helm install metrics-server stable/metrics-server -n kube-system -f metrics-server.yamlkubectl get pods -n kube-system | grep metrics-server

#需要多等一会儿

kubectl top nodekubectl top pods --all-namespaces

通过这些步骤,确保 metrics-server 成功部署在 Kubernetes 集群中,并且可以提供集群资源使用情况的聚合信息,这对于 Kubernetes 集群的运维和自动扩缩容策略的实施非常关键。

部署 HPA

//在所有节点上传 hpa-example.tar 镜像文件到 /opt 目录

hpa-example.tar 是谷歌基于 PHP 语言开发的用于测试 HPA 的镜像,其中包含了一些可以运行 CPU 密集计算任务的代码。

cd /opt
docker load -i hpa-example.tardocker images | grep hpa-example

//创建用于测试的 Pod 资源,并设置请求资源为 cpu=200m

vim hpa-pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:run: php-apachename: php-apache
spec:replicas: 1selector:matchLabels:run: php-apachetemplate:metadata:labels:run: php-apachespec:containers:- image: gcr.io/google_containers/hpa-examplename: php-apacheimagePullPolicy: IfNotPresentports:- containerPort: 80resources:requests:cpu: 200m
---
apiVersion: v1
kind: Service
metadata:name: php-apache
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:run: php-apache
kubectl apply -f hpa-pod.yamlkubectl get pods

通过这些步骤,可以在 Kubernetes 集群中部署一个应用程序,并使用 HPA 根据实际负载自动调整 Pod 副本数,从而实现应用程序的自动扩缩容

三、配置和使用 HPA

创建 HPA 控制器

//使用 kubectl autoscale 命令创建 HPA 控制器,设置 cpu 负载阈值为请求资源的 50%,指定最少负载节点数量为 1 个,最大负载节点数量为 10 个

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

监控 HPA 状态

//需要等一会儿,才能获取到指标信息 TARGETS

kubectl get hpakubectl top pods

查看 HPA 的状态,包括当前的 CPU 负载百分比、最小和最大 Pod 数量以及当前的 Pod 副本数

压力测试

创建一个测试客户端容器
kubectl run -it load-generator --image=busybox /bin/sh
增加负载
# while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

打开一个新的窗口,查看负载节点数目

kubectl get hpa -w

#以上可以看到经过压测,负载节点数量最大上升到 10 个,并且 cpu 负载也随之下降。

#观察 HPA 控制器的响应,可以看到随着 CPU 负载的增加,Pod 的副本数从 1 个增加到最大限制的 10 个

如果 cpu 性能较好导致负载节点上升不到 10 个,可再创建一个测试客户端同时测试:

//如果 cpu 性能较好导致负载节点上升不到 10 个,可再创建一个测试客户端同时测试:
kubectl run -i --tty load-generator1 --image=busybox /bin/sh
# while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done
//查看 Pod 状态,也发现已经创建了 10 个 Pod 资源
kubectl get pods

#HPA 扩容的时候,负载节点数量上升速度会比较快;但回收的时候,负载节点数量下降速度会比较慢。
原因是防止在业务高峰期时因为网络波动等原因的场景下,如果回收策略比较积极的话,K8S集群可能会认为访问流量变小而快速收缩负载节点数量,而仅剩的负载节点又承受不了高负载的压力导致崩溃,从而影响业务。

四、资源限制 - Pod

Kubernetes对资源的限制实际上是通过cgroup来控制的,cgroup是容器的一组用来控制内核如何运行进程的相关属性集合。针对内存、CPU 和各种设备都有对应的 cgroup。
默认情况下,Pod 运行没有 CPU 和内存的限额。这意味着系统中的任何 Pod 将能够像执行该 Pod 所在的节点一样, 消耗足够多的 CPU 和内存。

一般会针对某些应用的 pod 资源进行资源限制,这个资源限制是通过 resources 的 requests 和 limits 来实现。requests 为创建 Pod 时初始要分配的资源,limits 为 Pod 最高请求的资源值

cgroup 的作用

●控制组: cgroup(Control Groups)是 Linux 内核的一个特性,它允许对系统资源进行分组管理和限制。

●资源隔离: cgroup 通过为每个组设置资源配额和限制,实现了对 CPU、内存、I/O 等资源的隔离和控制。

Pod 资源限制

●requests: 指定 Pod 运行所需的最小资源量。Kubernetes 调度器会考虑这些请求来决定在哪个节点上调度 Pod。如果节点无法满足 Pod 的资源请求,Pod 将不会被调度到该节点。
●limits: 指定 Pod 可以使用的最大资源量。如果 Pod 尝试使用超过其限制的资源,系统将通过 cgroup 强制限制资源使用,可能会导致 Pod 被杀死或重启

示例:
spec:containers:- image: xxxximagePullPolicy: IfNotPresentname: authports:- containerPort: 8080protocol: TCPresources:limits:cpu: "2"        # 限制 CPU 使用量为 2 个单位(可以是核心数或毫核)memory: 1Gi     # 限制内存使用量为 1Gi(Gibibytes)requests: cpu: 250m       # 请求 CPU 使用量为 250 毫核memory: 250Mi   # 请求内存使用量为 250Mi(Mebibytes)

在这个配置中,auth 容器请求了 250 毫核的 CPU 和 250Mi 的内存,同时设置了 2 个单位的 CPU 和 1Gi 内存的限制。这意味着 Kubernetes 会确保 auth 容器至少有 250 毫核的 CPU 和 250Mi 的内存可用,但如果资源充足,它可以使用更多,但不会超过 2 个单位的 CPU 和 1Gi 的内存

资源限制 - 命名空间

1.计算资源配额

在 Kubernetes 中使用 ResourceQuota 和 LimitRange 资源类型来对命名空间级别的资源使用进行限制和管理

apiVersion: v1
kind: ResourceQuota        #使用 ResourceQuota 资源类型
metadata:name: compute-resourcesnamespace: spark-cluster  #指定命令空间
spec:hard:pods: "20"    #设置 Pod 数量最大值requests.cpu: "2"requests.memory: 1Gilimits.cpu: "4"limits.memory: 2Gi

2.配置对象数量配额限制

apiVersion: v1
kind: ResourceQuota
metadata:name: object-countsnamespace: spark-cluster
spec:hard:configmaps: "10"persistentvolumeclaims: "4"		#设置 pvc 数量最大值replicationcontrollers: "20"    #设置 rc 数量最大值secrets: "10"services: "10"services.loadbalancers: "2"

ResourceQuota 被命名为 object-counts,它限制了 spark-cluster 命名空间中的配置对象数量:
configmaps、persistentvolumeclaims、replicationcontrollers、secrets、services:这些项限制了各种类型配置对象的数量。
services.loadbalancers:特别限制了使用负载均衡器类型的服务数量

#如果Pod没有设置requests和limits,则会使用当前命名空间的最大资源;如果命名空间也没设置,则会使用集群的最大资源。
K8S 会根据 limits 限制 Pod 使用资源,当内存超过 limits 时 cgruops 会触发 OOM。

这里就需要创建 LimitRange 资源来设置 Pod 或其中的 Container 能够使用资源的最大默认值

apiVersion: v1
kind: LimitRange     #使用 LimitRange 资源类型
metadata:name: mem-limit-rangenamespace: test    #可以给指定的 namespace 增加一个资源限制
spec:limits:- default:         #default 即 limit 的值memory: 512Micpu: 500mdefaultRequest:   #defaultRequest 即 request 的值memory: 256Micpu: 100mtype: Container  #类型支持 Container、Pod、PVC

LimitRange 示例中,mem-limit-range 为 test 命名空间中的所有容器设置了默认的内存和 CPU 限制:
default:设置了默认的资源限制值。
defaultRequest:设置了默认的资源请求值。
type:指定了这些限制适用于的类型,可以是 Container、Pod 或 PersistentVolumeClaim (PVC)

通过这些资源限制,Kubernetes 管理员可以精细地控制集群资源的使用,避免资源浪费,并确保集群的稳定性和效率

总结

HPA

●HPA 是 控制器管理pod资源的副本数量 实现自动伸缩

●原理:追踪可控制器管理的pod负载情况,来根据设置的阈值来动态调整pod副本的数量

●metrics-server 收集k8s中的node、pod 等资源的使用情况,kubectl top node/pod

●kubectl autoscale 控制器        --cpuprecent=60 --min=最小值 --max=最大值

kubectl 资源限制

●resource.requests/limits   限制pod中容器的资源量

●resourceQuota 资源类型对命名空间的资源对象或者资源量 进行配额的限制

●limitRanger 资源类型设置命名空间中 pod(容器默认的)资源限制limit requests

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

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

相关文章

前端菜鸡流水账日记 -- git管理工具(多版本)

哈喽哇,我又又又来了,其实之前就挺想进行一篇关于git管理工具的分享的,但是一直都没有来的及,直到今天,在学习的时候,,一个朋友新发现了一个vscode中的小插件,所以我就决定一起来分享…

论文阅读ReLU-KAN和Wav-KAN

这是我读KAN系列论文的第三篇,今天把两篇论文放在一起写,分别是: ReLU-KAN: https://arxiv.org/abs/2406.02075 Wav-KAN: https://arxiv.org/abs/2405.12832 之所以放在一起,是因为这两篇论文针对KAN的…

据说可以防静电和浪涌的P6KE30CA

公司有些变送器之前在最后一道校准时,经常发生烧毁的情况。所以在电路的防反接的M7二极管前面又增加了一个TVS二极管,型号P6KE30CA。但愿加了这个好使把。今天又研究了一下这个TVS管子,把搜索到的东西记录一下。放这里备忘把,忘记…

18.实战 LLaMA2-7B 指令微调

实战 LLaMA2-7B 指令微调 实战 LLaMA2-7B 指令微调大模型训练技术总结以模型训练阶段分类:Pre-Training vs Fine-Tuning以微调权重比例分类:FFT vs PEFT以模型训练方法分类:Fine-Tuning vs Instruction-Tuning以模型训练机制分类:…

【五】Linux软件仓库Yum源--SSH远程控制--SCP远程传输

RPM(红帽软件包管理器) RPM建立统一的数据库文件,记录软件信息并分析依赖关系。目前RPM的优势已经被公众所认可,使用范围也已不局限在红帽系统中了。常见RPM命令如下: 安装软件 rpm -ivh file…

PostgreSQL和Oracle的数据类型对比:时间类型 #PG培训

在数据库管理系统中,时间数据类型是非常关键的一部分。时间数据类型的选择和使用直接影响到数据存储、查询效率和应用程序的设计。本文将对比PostgreSQL和Oracle在时间类型方面的实现和特性。 #PG考试#postgresql培训#postgresql考试#postgresql认证 日期和时间类型…

示例:WPF中应用Grid的SharedSizeGroup设置整齐的布局

一、目的&#xff1a;应用Grid的SharedSizeGroup设置整齐的布局 二、实现 <ItemsControl ItemsSource"{local:GetStudents Count5}"><ItemsControl.ItemTemplate><DataTemplate><Grid ShowGridLines"True"><Grid.ColumnDefinit…

springSecurity(二):实现登入获取token与解析token

登入生成token 主要思想 springSecurity使用UsernamePasswordAuthenticationToken类来封装用户名和密码的认证信息 代码实现 发起登入请求后&#xff0c;进入到login()方法 /*** 在接口中我们通过AuthenticationManager的authenticate方法来进行用户认证,* 所以需要在Secur…

淘宝镜像地址失效

1. 使用nvm安装node时候报错 报错内容 Get "https://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt": tls: failed to verify certificate: x509: certificate has expired or is not yet valid:报错原因 淘宝镜像地址的证书过期了 解决 找到nvm安装的根目…

echarts legend 背景色渐变

问题与本文无关&#xff1a;如果检测软件显示loadsh.js 的版本是4.17.10 装element-ui 2.15.8版本以下&#xff0c;2.15.6经过测试可以 代码&#xff1a; <template><div class"levelMain"><div class"survey-head"><div class"…

RK3568平台(音频篇)声音的数字化和数字音频接口

一.声音信号的数字化 我们应该都知道&#xff0c;声音是一种模拟信号&#xff0c;如果想用于计算机&#xff0c;就必须要将模拟信号转换为数字信号&#xff0c;这样&#xff0c;我们就能在计算机上存储声音了&#xff0c;等待用户想播放的时候&#xff0c;再将数字信号转换为模…

【Java】已解决java.lang.CloneNotSupportedException异常

文章目录 问题背景可能出错的原因错误代码示例正确代码示例注意事项 已解决java.lang.CloneNotSupportedException异常 在Java编程中&#xff0c;java.lang.CloneNotSupportedException是一个常见的运行时异常&#xff0c;它发生在尝试调用对象的clone()方法时&#xff0c;但该…

有哪些零售O2O应用模式?如何构建O2O闭环生态系统?

在零售业的演变历程中&#xff0c;O2O模式的兴起标志着一个新时代的开始。这种模式以其创新性&#xff0c;将线上的便捷与线下的实体体验完美融合&#xff0c;为消费者带来了前所未有的购物便利和体验丰富性。随着技术的不断进步和消费者需求的日益多样化&#xff0c;O2O模式已…

在windows 台式机电脑部署GLM4大模型

参考这篇文章在windows笔记本电脑部署GLM4大模型_16g显卡本地部署glm4-CSDN博客 我的环境&#xff08;PC台式机电脑&#xff1a; 处理器 Intel(R) Core(TM) i9-14900K 3.20 GHz 机带 RAM 32.0 GB (31.8 GB 可用)、32G内存、NVIDIA RTX4080&#xff08;16G&#xff09;…

Ubuntu20.04中复现FoundationPose

Ubuntu20.04中复现FoundationPose 文章目录 Ubuntu20.04中复现FoundationPose1.安装cuda和cudnn2.下载相关资源3.环境配置4.运行model-based demo5.运行ycbv demoReference &#x1f680; 非常重要的环境配置 &#x1f680; ubuntu 20.04cuda 11.8.0cudnn v8.9.7python 3.9.19…

如何理解电流镜负载的差分对的增益

我们知道最普通的电阻负载的差分对的差分增益是-gmRD&#xff0c;如果我们不希望输出是双端的&#xff0c;而是希望单端输出&#xff0c;那么使用电阻负载的差分对会导致增益变为原先的一半&#xff0c;因此引入了电流镜负载的差分对&#xff0c;它可以在保证增益与原先相同的情…

Nuxt快速学习开发 - Nuxt3静态资源Assets

Nuxt 使用两个目录来处理样式表、字体或图像等资产。 public/目录内容按原样在服务器根目录中提供。 assets/目录包含您希望构建工具&#xff08;Vite 或 webpack&#xff09;处理的所有资产。 public/目录 public目录用作静态资产的公共服务器&#xff0c;可在您的应用程序定…

氮化铝上的厚膜高功率片式电阻器

EAK厚膜高功率片式电阻器和氮化铝片式端接非常适合大多数需要在小尺寸封装中实现高导热性的应用。AlN 是 BeO 的理想替代品&#xff0c;具有高功耗且对环境或健康无危害。厚膜技术以非常实惠的价格提供稳定的电阻元件。 高稳定性厚膜电阻元件 AlN衬底材料 标准电阻范围为 10Ω…

5216万!国内自动化巨头,拟剥离旗下子业务

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 近日&#xff0c;中控技术发布公告称&#xff0c;为进一步优化资产结构和产业布局&#xff0c;提升公司核心竞争力&#xff0c;公司拟将其全资子…

多模态LLM 跨越语言与视觉的边界

一、引言 在数字时代的浪潮中&#xff0c;我们被由语言和视觉等多种模态构成的信息海洋所包围。人类大脑以其卓越的多模态上下文理解能力&#xff0c;在日常任务中游刃有余。然而&#xff0c;在人工智能领域&#xff0c;如何将这种能力赋予机器&#xff0c;尤其是如何在语言模…