gin + es 实践 08
自动扩缩容
本文档详细介绍如何在Kubernetes环境中实现Go-ES应用的自动扩缩容,包括水平Pod自动扩缩容(HPA)、垂直Pod自动扩缩容(VPA)和集群自动扩缩容。
1. 自动扩缩容概述
自动扩缩容是指根据负载变化自动调整计算资源的过程,主要目标是:
- 在高负载时自动增加资源,确保应用性能和可用性
- 在低负载时自动减少资源,优化成本和资源利用率
- 无需人工干预,系统能够根据实际需求自动调整
Kubernetes提供了多种自动扩缩容机制,适合不同的应用场景和需求。
2. 水平Pod自动扩缩容(HPA)
HPA通过增加或减少Pod副本数来实现应用的水平扩展。
2.1 HPA基本原理
HPA控制器定期(默认15秒)检查指定的指标,并根据目标值计算所需的副本数:
所需副本数 = ceil[当前副本数 * (当前指标值 / 目标指标值)]
2.2 支持的指标类型
- 资源指标:如CPU和内存使用率
- 自定义指标:从Kubernetes指标API获取的指标
- 外部指标:来自Kubernetes集群外部的指标
- 对象指标:描述Kubernetes对象的指标
2.3 HPA配置示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: go-es-api-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: go-es-apiminReplicas: 2 # 最小副本数maxReplicas: 10 # 最大副本数behavior: # 扩缩容行为定制scaleUp:stabilizationWindowSeconds: 60 # 稳定窗口期policies:- type: Percentvalue: 100periodSeconds: 15scaleDown:stabilizationWindowSeconds: 300 # 缩容稳定窗口policies:- type: Percentvalue: 10periodSeconds: 60metrics:- type: Resource # 基于CPU使用率resource:name: cputarget:type: UtilizationaverageUtilization: 70- type: Resource # 基于内存使用率resource:name: memorytarget:type: UtilizationaverageUtilization: 80
2.4 针对Go-ES的HPA最佳实践
-
为API服务设置HPA:
- 基于CPU使用率(通常70-80%)
- 考虑同时监控内存使用率
- 为请求量大的服务配置较大的副本数范围
-
稳定窗口调优:
- 扩容窗口可以较短(60秒),快速响应负载增加
- 缩容窗口应较长(300秒以上),避免资源波动
-
扩缩策略调优:
- 扩容策略可以激进一些,例如允许一次增加100%的副本
- 缩容策略应保守,限制一次减少的副本数或百分比
3. 垂直Pod自动扩缩容(VPA)
VPA自动调整单个Pod的CPU和内存请求与限制,适合无法水平扩展的应用。
3.1 VPA组件
- Recommender:基于历史和当前资源使用情况计算推荐值
- Updater:应用推荐的资源设置,必要时重建Pod
- Admission Controller:修改新创建Pod的资源请求
3.2 VPA配置示例
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:name: go-es-mysql-vpa
spec:targetRef:apiVersion: apps/v1kind: Deploymentname: mysqlupdatePolicy:updateMode: Auto # 自动应用推荐resourcePolicy:containerPolicies:- containerName: '*'minAllowed: # 最小资源限制cpu: 100mmemory: 50MimaxAllowed: # 最大资源限制cpu: 1memory: 500MicontrolledResources: ["cpu", "memory"]
3.3 VPA的应用场景
对于Go-ES项目,VPA适用于:
- 数据库服务:MySQL等有状态服务,水平扩展复杂
- Elasticsearch节点:资源需求可能随索引大小变化
- 批处理任务:如数据导入、报表生成等
3.4 VPA最佳实践
- 为有状态服务(如MySQL、Elasticsearch)配置VPA
- 设置合理的资源上下限,避免过度分配或资源不足
- 谨慎使用Auto模式,考虑使用Initial或Recreate避免频繁重启
4. 集群自动扩缩容(Cluster Autoscaler)
Cluster Autoscaler自动调整Kubernetes集群中的节点数量。
4.1 工作原理
- 当Pod因资源不足无法调度时,自动添加节点
- 当节点长时间资源利用率低于阈值时,移除节点(前提是其上Pod可以迁移)
4.2 配置示例(AWS EKS)
apiVersion: apps/v1
kind: Deployment
metadata:name: cluster-autoscalernamespace: kube-system
spec:replicas: 1selector:matchLabels:app: cluster-autoscalertemplate:metadata:labels:app: cluster-autoscalerspec:serviceAccountName: cluster-autoscalercontainers:- image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.22.0name: cluster-autoscalercommand:- ./cluster-autoscaler- --v=4- --stderrthreshold=info- --cloud-provider=aws- --scale-down-utilization-threshold=0.5- --scale-down-delay-after-add=10m- --skip-nodes-with-local-storage=false- --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/<YOUR_CLUSTER_NAME>
4.3 关键参数
--scale-down-utilization-threshold
:节点利用率低于该值时考虑缩容(默认0.5)--scale-down-delay-after-add
:新增节点后多久可以考虑缩容(默认10分钟)--scale-down-unneeded-time
:节点空闲多久后可以被移除(默认10分钟)
4.4 实施建议
- 根据业务负载波动特性设置合理的缩容延迟和阈值
- 为不同类型的工作负载配置不同的节点组,如计算密集型、内存密集型
- 配置节点亲和性和污点(Taints),确保特定Pod调度到合适的节点
5. KEDA (Kubernetes Event-driven Autoscaling)
KEDA是一个基于事件的自动扩缩容系统,可以根据外部事件源触发扩缩容。
5.1 KEDA特点
- 支持扩展到零(零实例运行)和从零扩展
- 基于多种外部指标来源(Redis、Kafka、RabbitMQ、Prometheus等)
- 与HPA协同工作,增强其功能
5.2 安装KEDA
# 使用Helm安装
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda --namespace keda --create-namespace
5.3 KEDA配置示例
例如,基于RabbitMQ队列的自动扩缩容:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:name: go-es-worker-scaler
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: go-es-workerpollingInterval: 15 # 轮询间隔(秒)cooldownPeriod: 30 # 冷却期(秒)minReplicaCount: 0 # 最小副本数(可以为零)maxReplicaCount: 30 # 最大副本数triggers:- type: rabbitmqmetadata:protocol: amqpqueueName: task-queuehost: amqp://guest:guest@rabbitmq:5672/queueLength: '10' # 每个副本处理的队列消息数
5.4 KEDA适用场景
在Go-ES项目中,KEDA适用于:
- 异步任务处理:如索引重建、数据导入等
- 消息队列消费:处理用户上传、通知发送等
- 批处理作业:报表生成、数据分析等
6. 自动扩缩容实施指南
6.1 资源请求与限制设置
正确设置Pod的资源请求和限制是自动扩缩容的基础:
resources:requests:cpu: 100m # 请求CPU资源,作为HPA判断基础memory: 128Mi # 请求内存资源limits:cpu: 500m # CPU资源上限memory: 512Mi # 内存资源上限
6.2 应用优化
- 无状态设计:确保应用是无状态的,方便水平扩展
- 优雅启动和关闭:实现适当的启动和关闭处理,减少扩缩容影响
- 就绪探针:配置合适的就绪探针,确保新扩容的Pod就绪后才接收流量
readinessProbe:httpGet:path: /api/v1/healthport: 8080initialDelaySeconds: 10periodSeconds: 5
6.3 Go-ES应用的扩缩容策略
-
API服务:
- 使用HPA基于CPU/内存使用率自动扩缩容
- 设置minReplicas=2确保高可用性
-
数据库服务:
- 使用VPA调整资源分配
- 不建议使用HPA进行水平扩展
-
Elasticsearch服务:
- 结合VPA和Cluster Autoscaler
- 使用StatefulSet确保稳定性
-
异步工作器:
- 使用KEDA基于队列深度扩缩容
- 可以配置缩容到零
6.4 监控与告警
-
Prometheus指标:
- 监控副本数变化
- 监控资源使用率
- 跟踪扩缩容事件
-
告警配置:
- 配置频繁扩缩容告警
- 设置扩容阈值接近上限告警
- 监控扩容失败事件
7. 测试与验证
7.1 负载测试
使用如下工具模拟负载测试自动扩缩容:
# 使用hey工具模拟HTTP负载
hey -n 10000 -c 100 http://go-es-api-service/api/v1/products# 使用JMeter或Locust进行复杂场景测试
7.2 验证扩缩容行为
# 监控Pod副本数变化
kubectl get hpa go-es-api-hpa -w# 查看自动扩缩容事件
kubectl describe hpa go-es-api-hpa# 监控节点资源使用率
kubectl top nodes
7.3 生产环境调优
- 收集实际负载模式数据
- 根据负载模式和响应时间目标调整扩缩容参数
- 逐步优化配置,找到资源利用率和性能之间的平衡点
8. 故障排除
8.1 常见问题
-
HPA不扩容:
- 检查metrics-server是否正常运行
- 验证资源请求是否正确设置
- 检查当前指标是否能正确获取
-
缩容太慢:
- 检查stabilizationWindowSeconds设置
- 验证缩容策略是否过于保守
-
节点自动扩缩容失败:
- 检查IAM权限(云环境)
- 验证节点组配置
- 查看Cluster Autoscaler日志
8.2 调试方法
# 检查HPA状态和当前指标
kubectl describe hpa go-es-api-hpa# 检查metrics-server是否正常
kubectl get pods -n kube-system | grep metrics-server# 检查自定义指标可用性
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"# 查看Cluster Autoscaler日志
kubectl logs -n kube-system -l app=cluster-autoscaler
9. 最佳实践总结
- 合理设置阈值:避免过于激进的扩缩容,导致资源波动
- 分层扩缩容:结合使用HPA、VPA和Cluster Autoscaler
- 根据负载特性调整:不同类型的服务需要不同的扩缩容策略
- 监控与反馈:持续监控扩缩容行为,根据实际情况调整
- 优雅处理:确保应用能够处理扩缩容过程中的连接迁移和状态转换
通过合理配置这些自动扩缩容机制,您的Go-ES应用可以根据负载自动调整资源,既能满足高峰期需求,又能在低峰期释放资源,实现资源利用率和性能的最佳平衡。
相关文章:
gin + es 实践 08
自动扩缩容 本文档详细介绍如何在Kubernetes环境中实现Go-ES应用的自动扩缩容,包括水平Pod自动扩缩容(HPA)、垂直Pod自动扩缩容(VPA)和集群自动扩缩容。 1. 自动扩缩容概述 自动扩缩容是指根据负载变化自动调整计算资源的过程,主要目标是:…...
在Postman中高效生成测试接口:从API文档到可执行测试的完整指南
引言 在API开发与测试流程中,Postman是一款高效的工具,能将API文档快速转化为可执行的测试用例。本文以《DBC协议管理接口文档》为例,详细讲解如何通过Postman实现接口的创建、配置、批量生成及自动化测试,帮助开发者和测试人员提升效率,确保接口质量。 一、准备工作:理…...

修改图像分辨率
在这个教程中,您将学习如何使用Python和深度学习技术来调整图像的分辨率。我们将从基础的图像处理技术开始,逐步深入到使用预训练的深度学习模型进行图像超分辨率处理。 一、常规修改方法 1. 安装Pillow库 首先,你需要确保你的Python环境中…...
2025.05.08-得物春招算法岗-第二题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 数字魔术分割 问题描述 LYA是一位数字魔术师,他有一个特殊的技能可以对任意一个正整数的数字进行重新排列,然后将排列后的数字序列分割成若干段,每段组成一个新的数字,最后…...
Node.js面试题
一、什么是Node.js? Node.js 是一个开源的跨平台 JavaScript 运行时环境,允许开发者在服务器端运行 JavaScript 代码。它基于 Chrome 的 V8 JavaScript 引擎构建,能够高效地处理 I/O 操作,适合构建高性能的网络应用。 异步非阻塞&…...
Spring MVC Controller 方法的返回类型有哪些?
Spring MVC Controller 方法的返回类型非常灵活,可以根据不同的需求返回多种类型的值。Spring MVC 会根据返回值的类型和相关的注解来决定如何处理响应。 以下是一些常见的 Controller 方法返回类型: String: 最常见的类型之一,用于返回逻辑…...

Redis 主从同步与对象模型(四)
目录 1.淘汰策略 1.1 expire/pexpire(设置键的过期时间) 1.2 配置 1.maxmemory 2.maxmemory-policy 3.maxmemory-samples 2.持久化 2.1背景 2.2 fork 的写时复制机制 2.3 大 key 3.持久化方式 3.1 aof(Apped Only File)…...

Linux系列:如何用perf跟踪.NET程序的mmap泄露
一:背景 1. 讲故事 如何跟踪.NET程序的mmap泄露,这个问题困扰了我差不多一年的时间,即使在官方的github库中也找不到切实可行的方案,更多海外大佬只是推荐valgrind这款工具,但这款工具底层原理是利用模拟器ÿ…...

如何租用服务器并通过ssh连接远程服务器终端
这里我使用的是智算云扉 没有打广告 但确实很便宜 还有二十小时免费额度 链接如下 注册之后 租用新实例 选择操作系统 选择显卡型号 点击租用 选择计费方式 选择镜像 如果跑深度学习的话 就选项目对应的torch版本 没有的话 就创建纯净的cuda 自己安装 点击创建实例 创建之后 …...
Git的核心作用详解
一、版本控制与历史追溯 Git作为分布式版本控制系统,其核心作用是记录代码的每一次修改,形成完整的历史记录。通过快照机制,Git会保存每次提交时所有文件的完整状态(而非仅记录差异),确保开发者可以随时回…...

华为设备链路聚合实验:网络工程实战指南
链路聚合就像为网络搭建 “并行高速路”,既能扩容带宽,又能保障链路冗余,超实用! 一、实验拓扑速览 图中两台交换机 LSW1 和 LSW2,PC1、PC2 归属 VLAN 10,PC3 归属 VLAN 30。LSW1 与 LSW2 通过 GE0/0/1、…...

AUTOSAR图解==>AUTOSAR_TR_AIDesignPatternsCatalogue
AUTOSAR 人工智能设计模式目录 AUTOSAR传感器执行器与仲裁设计模式的深入解析与图解 目录 简介传感器和执行器模式 架构概述组件结构交互流程应用场景 多请求者或提供者之间的仲裁模式 架构概述组件结构仲裁流程应用场景 总结 1. 简介 AUTOSAR(AUTomotive Open Sy…...
linux基础操作4------(权限管理)
一.前言 今天我们来讲讲linux的权限管理,比如文件的权限,如果大家看过前面说的app逆向的frida,我们在手机里要给frida,我们都要设置一下chomd 777 frida ,这样就给了可执行权限,这就是这一章要讲的&#x…...

双系统电脑中如何把ubuntu装进外接移动固态硬盘
电脑:win11 ubuntu22.04 实体机 虚拟机:VMware17 镜像文件:ubuntu-22.04.4-desktop-amd64.iso 或者 ubuntu20.4的镜像 外接固态硬盘1个 一、首先win11中安装vmware17 具体安装方法,网上很多教程 二、磁盘分区 1.在笔…...
Nacos源码—Nacos集群高可用分析(三)
6.CAP原则与Raft协议 (1)CAP分别指的是什么 一.C指的是一致性Consistency 各个集群节点之间的数据,必须要保证一致。 二.A指的是可用性Availability 在分布式架构中,每个请求都能在合理的时间内获得符合预期的响应。 三.P指的是分区容错性Partition To…...

【C语言】程序的预处理,#define详解
一、预定义符号 二、#define 1.#define定义标识符 #define + 自定义名称 + 代替的内容 例: #define MAX 100 #define CASE break;case #define CASE break;caseint main() {int n 0;switch (n){case 1:CASE 2:CASE 3:CASE 4:}return …...

NVM完全指南:安装、配置与最佳实践
发布于 2025年5月7日 • 阅读时间:10分钟 💡 TL;DR: 本文详细介绍了如何完整卸载旧版Node.js,安装NVM,配置阿里云镜像源,以及设置node_global与node_cache目录,打造高效Node.js开发环境。 📋 目…...

(二)毛子整洁架构(CQRS/Dapper/领域事件处理器/垂直切片)
文章目录 项目地址一、Application 层1.1 定义CQRS的接口以及其他服务1. Command2. IQuery查询3. 当前时间服务接口4. 邮件发送服务接口 1.2 ReserveBooking Command1. 处理传入的参数2. ReserveBookingCommandHandler3. BookingReservedDomainEvent 1.3 Query使用Sql查询1. 创…...
基于大核感知与非膨胀卷积的SPPF改进—融合UniRepLK的YOLOv8目标检测创新架构
在当前目标检测领域中,YOLO系列模型因其优异的速度-精度平衡能力而被广泛部署于工业界与科研场景。YOLOv8作为该系列的最新版本,在主干网络与特征金字塔结构上进行了多项优化,进一步提升了其实时性与鲁棒性。然而,其核心组件—SPPF(Spatial Pyramid Pooling Fast)模块仍采用…...
基于SpringBoot网上书店的设计与实现
pom.xml配置文件 1. 项目基本信息(没什么作用) <groupId>com.spring</groupId> <!--项目组织标识,通常对应包结构--> <artifactId>boot</artifactId> <!--项目唯一标识--> <version>0.0.1-SNAPSHOT</ve…...
小程序多线程实战
在小程序开发中,由于微信小程序的运行环境限制,原生并不支持传统意义上的多线程编程,但可以通过以下两种核心方案实现类似多线程的并发处理效果,尤其在处理复杂计算、避免主线程阻塞时非常关键: 一、官方方案ÿ…...

如何修改MySQL数据库密码
文章目录 一、忘记数据库密码该如何修改1. 关闭数据库的服务2.跳过安全检查3. 重置密码4.查询用户是否存在5.退出验证密码是否正确 二、未忘记密码该如何修改密码1.直接修改密码2.登录mysql 时间久了,忘记数据库密码了。。。。。 一、忘记数据库密码该如何修改 1. …...

【Python】mat npy npz 文件格式
1、简介 MAT 文件和 NP(.npy 或 .npz)文件是两种不同的格式,用于存储数组数据。它们分别由 MATLAB 和 NumPy 开发,主要用于各自环境中的数据存储和交换。以下是这两种格式的主要区别: 1.1 格式和用途 MAT 文件&…...

SpringBoot快速入门WebSocket(JSR-356附Demo源码)
现在我想写一篇Java快速入门WebSocket,就使用 JSR-356的websocket,我想分以下几点, 1. websocket介绍, 1.1 介绍 什么是WebSocket? WebSocket 是一种基于 TCP 的全双工通信协议,允许客户端和服务器在单个长连接上实…...
JDBC执行sql过程
1. 加载数据库驱动 JDBC 通过 驱动(Driver) 实现与不同数据库的通信。驱动需提前加载到 JVM: 手动加载(JDBC 4.0 前): Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 驱…...
VNC windows连接ubuntu桌面
✅ 步骤 1:安装 VNC 服务器 首先,我们需要在 Winux 系统上安装一个 VNC 服务器。这里我们使用 tigervnc 作为例子,它是一个常用的 VNC 服务器软件。 打开终端并更新你的软件包: sudo apt update安装 tigervnc 服务器:…...
CSS中的@import指令
一、什么是import指令? import 是CSS提供的一种引入外部样式表的方式,允许开发者在CSS文件中引入其他CSS文件,或者在HTML的<style>标签中引入外部样式。与常见的<link>标签相比,import 提供了一种更“CSS原生”的样式…...

【安装配置教程】ubuntu安装配置Kodbox
目录 一、引言 二、环境配置 1. 服务器配置 2. 必备组件 三、安装基础环境 1. 安装 PHP 8.1 及扩展 2. 安装 MySQL 数据库 3.安装 Redis(可选,提升缓存性能) 4. 配置nginx文件 4.1. 创建 Kodbox 站点目录 4.2. 编写 Ng…...
【软件设计师:数据库】13.数据库控制与安全
一、数据库语言SQL SQL是结构化查询语言(Structured Query Language)的缩写,其功能包括数据查询、数据操纵、数据定义和数据控制四个部分。 SQL 语言简洁、方便实用、功能齐全,已成为目前应用最广的关系数据库语言。SQL既是自含式语言(联机交互),又是嵌入式语言(宿主语…...

LabVIEW车牌自动识别系统
在智能交通快速发展的时代,车牌自动识别系统成为提升交通管理效率的关键技术。本案例详细介绍了基于 LabVIEW 平台,搭配大恒品牌相机构建的车牌自动识别系统,该系统在多个场景中发挥着重要作用,为交通管理提供了高效、精准的解决方…...