网站首页 > 技术文章 正文
弹性伸缩式K8S中的一大亮点功能,当负载大的时候,可以对应用进行扩容,提升pod的副本数来应对大量的流量,当负载小的时候可以对应用进行缩容,以避免资源浪费。功能是通过Kubernetes HPA(Horizontal Pod Autoscaling)Pod水平自动伸缩来实现,只需简单的配置,集群便可以利用监控指标(cpu使用率等)自动的扩容或者缩容服务中Pod数量,当业务需求增加时,系统将会无缝地自动增加适量容器 ,提高系统稳定性。
弹性伸缩分类
K8S弹性伸缩分为两类:
- 资源维度:保障集群资源池大小满足整体规划,当集群内的资源不足以支撑产出新的pod时,就会触发边界进行扩容
- 应用维度:保障应用的负载处在预期的容量规划内
伸缩策略:
水平伸缩:
- 集群维度:自动调整资源池规模(新增/删除Worker节点)
- Pod维度:自动调整Pod的副本集数量
垂直伸缩:
- 集群维度:不支持
- Pod维度:自动调整应用的资源分配(增大/减少pod的cpu、内存占用)
其中最为成熟也是最为常用的伸缩策略就是HPA(水平Pod伸缩)。
HPA概述
HPA在kubernetes中被设计为一个controller,可以简单的使用kubectl autoscale命令来创建。HPA Controller默认15秒轮询一次,查询指定的resource中(Deployment,RC)的资源使用率,并且与创建时设定的值和指标做对比,从而实现自动伸缩的功能。
Pod只有设置request后,HPA才会工作。
目前HPA默认采集指标的实现是Heapster,它主要采集CPU的使用率,因此可以简单认为,HPA就是通过CPU的使用率作为监控指标的。
HPA自动伸缩算法
具体的每次扩容或者缩容的多少Pod的算法为:
Ceil(前采集到的使用率 / 用户自定义的使用率) * Pod数量) desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
ceil表示向上取整,举个实际例子,假设某个服务运行了6个Pod,当前的CPU使用率为50%,预期的CPU使用率为25%,那么满足预期的实际Pod数量就是6 * (50% / 25%) = 12个,即需要将Pod容量扩大一倍,增加6个Pod来满足需求。
K8S会尽可能的让指标往期望值靠近,而不是完全相等,HPA Controller中有一个tolerance(容忍力)的概念,它允许一定范围内的使用量的不稳定,现在默认为0.1,这也是出于维护系统稳定性的考虑。例如,设定HPA调度策略为cpu使用率高于50%触发扩容,那么只有当使用率大于55%或者小于45%才会触发伸缩活动,HPA会尽力把Pod的使用率控制在这个范围之间(容忍度可以通过--horizontal-pod-autoscaler-tolerance来调整)。
当pod所需要的CPU负荷过大,从而在创建一个新pod的过程中,系统的CPU使用量可能会同样在有一个攀升的过程。所以,在每一次作出决策后的一段时间内,将不再进行扩展决策。对于扩容而言,这个时间段为3分钟,缩容为5分钟。
每次最大扩容pod数量不会超过当前副本数量的2倍。
HPA YAML文件概述
apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: creationTimestamp: 2019-12-11T11:04:08Z name: nginxtest namespace: default resourceVersion: "1234567" selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginxtest uid: 86febb63-5ca1-11e7-abef-5254gyui79a3 spec: maxReplicas: 5 //资源最大副本数 minReplicas: 1 //资源最小副本数 scaleTargetRef: apiVersion: extensions/v1beta1 kind: Deployment //需要伸缩的资源类型 name: test //需要伸缩的资源名称 targetCPUUtilizationPercentage: 50 //触发伸缩的cpu使用率 status: currentCPUUtilizationPercentage: 48 //当前资源下pod的cpu使用率 currentReplicas: 1 //当前的副本数 desiredReplicas: 2 //期望的副本数
题外话
HPA虽好,但是也有弊端,它可以对服务的容器数量做自动伸缩,这对于服务稳定性是一个很好提升,但是也有弊端,目前稳定版只有CPU这一个指标,所以可能会发生判断不准确而导致不必要的自动伸缩。如何使用,还是在我们自己。
猜你喜欢
- 2024-10-10 K8S集群metrics-server组件安装 k8s集群包含哪些组件
- 2024-10-10 第6课 Kubernetes之深入掌握Pod机制及应用
- 2024-10-10 万字长文 | 使用 RBAC 限制对 Kubernetes 资源的访问
- 2024-10-10 Kubernetes:监控指南 kubernetes 监控
- 2024-10-10 《蹲坑学K8S》之21-1:Metrics-Server监控
- 2024-10-10 K8S架构设计及工作流程分析 k8s 结构图
- 2024-10-10 Metrics Server 快速安装 melsoft安装教程
- 2024-10-10 K8S系统的监控及HPA控制器 k8s dashboard 监控
- 2024-10-10 如何通过在多个Vagrant管理的虚拟机上部署多节点Kubernetes集群
- 2024-10-10 Kubernetes集群的自动水平伸缩 kubernetes 自动伸缩
你 发表评论:
欢迎- 最近发表
-
- 在 Spring Boot 项目中使用 activiti
- 开箱即用-activiti流程引擎(active 流程引擎)
- 在springBoot项目中整合使用activiti
- activiti中的网关是干什么的?(activiti包含网关)
- SpringBoot集成工作流Activiti(完整源码和配套文档)
- Activiti工作流介绍及使用(activiti工作流会签)
- SpringBoot集成工作流Activiti(实际项目演示)
- activiti工作流引擎(activiti工作流引擎怎么用)
- 工作流Activiti初体验及在数据库中生成的表
- Activiti工作流浅析(activiti6.0工作流引擎深度解析)
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)