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最佳实践

  1. 为API服务设置HPA

    • 基于CPU使用率(通常70-80%)
    • 考虑同时监控内存使用率
    • 为请求量大的服务配置较大的副本数范围
  2. 稳定窗口调优

    • 扩容窗口可以较短(60秒),快速响应负载增加
    • 缩容窗口应较长(300秒以上),避免资源波动
  3. 扩缩策略调优

    • 扩容策略可以激进一些,例如允许一次增加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适用于:

  1. 数据库服务:MySQL等有状态服务,水平扩展复杂
  2. Elasticsearch节点:资源需求可能随索引大小变化
  3. 批处理任务:如数据导入、报表生成等

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适用于:

  1. 异步任务处理:如索引重建、数据导入等
  2. 消息队列消费:处理用户上传、通知发送等
  3. 批处理作业:报表生成、数据分析等

6. 自动扩缩容实施指南

6.1 资源请求与限制设置

正确设置Pod的资源请求和限制是自动扩缩容的基础:

resources:requests:cpu: 100m        # 请求CPU资源,作为HPA判断基础memory: 128Mi    # 请求内存资源limits:cpu: 500m        # CPU资源上限memory: 512Mi    # 内存资源上限

6.2 应用优化

  1. 无状态设计:确保应用是无状态的,方便水平扩展
  2. 优雅启动和关闭:实现适当的启动和关闭处理,减少扩缩容影响
  3. 就绪探针:配置合适的就绪探针,确保新扩容的Pod就绪后才接收流量
readinessProbe:httpGet:path: /api/v1/healthport: 8080initialDelaySeconds: 10periodSeconds: 5

6.3 Go-ES应用的扩缩容策略

  1. API服务

    • 使用HPA基于CPU/内存使用率自动扩缩容
    • 设置minReplicas=2确保高可用性
  2. 数据库服务

    • 使用VPA调整资源分配
    • 不建议使用HPA进行水平扩展
  3. Elasticsearch服务

    • 结合VPA和Cluster Autoscaler
    • 使用StatefulSet确保稳定性
  4. 异步工作器

    • 使用KEDA基于队列深度扩缩容
    • 可以配置缩容到零

6.4 监控与告警

  1. Prometheus指标

    • 监控副本数变化
    • 监控资源使用率
    • 跟踪扩缩容事件
  2. 告警配置

    • 配置频繁扩缩容告警
    • 设置扩容阈值接近上限告警
    • 监控扩容失败事件

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 生产环境调优

  1. 收集实际负载模式数据
  2. 根据负载模式和响应时间目标调整扩缩容参数
  3. 逐步优化配置,找到资源利用率和性能之间的平衡点

8. 故障排除

8.1 常见问题

  1. HPA不扩容

    • 检查metrics-server是否正常运行
    • 验证资源请求是否正确设置
    • 检查当前指标是否能正确获取
  2. 缩容太慢

    • 检查stabilizationWindowSeconds设置
    • 验证缩容策略是否过于保守
  3. 节点自动扩缩容失败

    • 检查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. 最佳实践总结

  1. 合理设置阈值:避免过于激进的扩缩容,导致资源波动
  2. 分层扩缩容:结合使用HPA、VPA和Cluster Autoscaler
  3. 根据负载特性调整:不同类型的服务需要不同的扩缩容策略
  4. 监控与反馈:持续监控扩缩容行为,根据实际情况调整
  5. 优雅处理:确保应用能够处理扩缩容过程中的连接迁移和状态转换

通过合理配置这些自动扩缩容机制,您的Go-ES应用可以根据负载自动调整资源,既能满足高峰期需求,又能在低峰期释放资源,实现资源利用率和性能的最佳平衡。

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

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

相关文章

【比赛真题解析】混合可乐

这次给大家分享一道比赛题:混合可乐。 洛谷链接:U561549 混合可乐 【题目描述】 Jimmy 最近沉迷于可乐中无法自拔。 为了调配出他心目中最完美的可乐,Jimmy买来了三瓶不同品牌的可乐,然后立马喝掉了一些(他实在是忍不住了),所以 第一瓶可口可乐最大容量为 a 升,剩余 …

AI Coding的发展之路:从概念到改变世界的旅程

AI Coding的发展之路:从概念到改变世界的旅程 引言:当代码开始自己写代码 还记得第一次接触编程时的手足无措吗?那些复杂的语法规则、难以捉摸的逻辑错误,让多少人在深夜对着屏幕抓狂。而今天,一个全新的时代正在来临——AI开始帮我们写代码了。这不是科幻电影,而是正在…

基于DQN的自动驾驶小车绕圈任务

1.任务介绍 任务来源: DQN: Deep Q Learning &#xff5c;自动驾驶入门&#xff08;&#xff1f;&#xff09; &#xff5c;算法与实现 任务原始代码: self-driving car 最终效果&#xff1a; 以下所有内容&#xff0c;都是对上面DQN代码的改进&#…

Spring 必会之微服务篇(2)

经过上一篇文章的介绍,应该对微服务有了基本的认识,以及为什么要用微服务和微服务要面临的挑战和对应的解决问题,这一期继续聊聊关于微服务的相关知识。 服务拆分 为什么拆 对于大多数的小型项目来说,一般是先采用单体架构,但是随着后面的用户规模变大,业务越来越复杂…

word换行符和段落标记

换行符&#xff1a;只换行不分段 作用&#xff1a;我们需要对它进行分段&#xff0c;但它是一个信息群组&#xff0c;我希望它们有同样的段落格式&#xff01; 快捷键&#xff1a;shiftenter 段落标记&#xff1a;分段 快捷键&#xff1a;enter 修改字体格式或段落格式 …

JSON|cJSON 介绍以及具体项目编写

一、JSON介绍 JSON&#xff08;JavaScript Object Notation 即JavaScript对象表示法&#xff09;是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。 JSON是一种数据交换格式.JSON独立于编程语言(你不必学习JavaScript).JSON表达数据的方式对通…

【LLaMA-Factory】使用LoRa微调训练DeepSeek-R1-Distill-Qwen-7B

【LLaMA-Factory】使用LoRa微调训练DeepSeek-R1-Distill-Qwen-7B 本地环境说明禁用开源驱动nouveau安装nvidia-smi安装Git环境安装Anaconda(conda)环境下载DeepSeek-R1-Distill-Qwen-7B模型安装LLaMA-Factory下载LLaMA-Factory安装LLaMA-Factory依赖修改环境变量安装deepspeedA…

初始图形学(7)

上一章完成了相机类的实现&#xff0c;对之前所学的内容进行了封装与整理&#xff0c;现在要学习新的内容。 抗锯齿 我们放大之前渲染的图片&#xff0c;往往会发现我们渲染的图像边缘有尖锐的"阶梯"性质。这种阶梯状被称为"锯齿"。当真实的相机拍照时&a…

vllm笔记

目录 vllm简介vllm解决了哪些问题&#xff1f;1. **瓶颈&#xff1a;KV 缓存内存管理低效**2. **瓶颈&#xff1a;并行采样和束搜索中的内存冗余**3. **瓶颈&#xff1a;批处理请求中的内存碎片化** 快速开始安装vllm开始使用离线推理启动 vLLM 服务器 支持的模型文本语言模型生…

访问网站提示“不安全”“有风险”怎么办?

访问网站提示“不安全”“有风险”有以下几种解决方案 一、理解警告类型 1.“不安全”提示&#xff08;HTTP网站&#xff09; 原因&#xff1a;网站未使用HTTPS加密&#xff0c;传输数据&#xff08;如密码、支付信息&#xff09;可能被窃取。 表现&#xff1a;浏览器地址栏显…

vue3的响应式设计原理

Vue 3 的响应式设计是其核心特性之一&#xff0c;依赖于 Proxy 和 依赖收集机制&#xff0c;相比 Vue 2 的 Object.defineProperty&#xff0c;Vue 3 的响应式系统更加高效、灵活且易于维护。 以下是 Vue 3 响应式设计的核心原理&#xff1a; 一、核心机制概览 使用 Proxy 实现…

C++模板笔记

Cpp模板笔记 文章目录 Cpp模板笔记1. 为什么要定义模板2. 模板的定义2.1 函数模板2.1.1 函数模板的重载2.1.2 头文件与实现文件形式&#xff08;重要&#xff09;2.1.3 模板的特化2.1.4 模板的参数类型2.1.5 成员函数模板2.1.6 使用模板的规则 2.2 类模板2.3 可变参数模板 模板…

递归函数(斐波那契数列0,1,1,2,3,5,8,13,21,34,55...)

目录 一、斐波那契数列&#xff08;兔子问题&#xff09; 二、迭代法&#xff08;用while循环推下一项 ) 三、递归函数 (函数的定义中调用函数自身的一种函数定义方式) 四、递归函数的底层逻辑推理 (二叉树推倒最左下节点回退法) 一、斐波那契数列&#xff08;兔子问题&…

光的本质(以暗物质维度粒子为介质的能量传导)

一、光的概要描述 1、光的本质是能量传导 空间中均匀分布着暗物质维度粒子。光不是粒子也不是波,而是没有质量和形态的能量,在临近暗物质粒子之间的一种能量传递。 2、光能传递类似牛顿钟摆(空间中的牛顿钟摆) 当光能能量骚动一个暗物质粒子后,该暗物质粒…

Open CASCADE学习|管道壳体生成

一、引言 在计算机辅助设计&#xff08;CAD&#xff09;和计算机图形学领域&#xff0c;OpenCASCADE 是一款功能强大的开源 3D 建模库。它提供了丰富的几何和拓扑建模工具&#xff0c;其中管道壳体&#xff08;Pipe Shell&#xff09;生成是其重要功能之一。管道壳体广泛应用于…

JS正则表达式介绍(JavaScript正则表达式)

文章目录 JavaScript正则表达式完全指南正则表达式基础元字符与特殊字符基本元字符. - 点号\d - 数字\D - 非数字\w - 单词字符\W - 非单词字符\s - 空白字符\S - 非空白字符 正则表达式标志常用标志详解g - 全局匹配i - 忽略大小写m - 多行匹配s - 点号匹配所有字符u - Unicod…

Kubernetes 使用 containerd 实现 GPU 支持及 GPU Operator 部署指南

目录 Kubernetes 使用 containerd 实现 GPU 支持及 GPU Operator 部署指南 一、为什么 containerd 是趋势&#xff1f; 二、目标 三、前提条件 四、方式一&#xff1a;containerd nvidia-container-toolkit&#xff08;基础方式&#xff09; 1️⃣ 安装 NVIDIA Containe…

leetcode 2918. 数组的最小相等和 中等

给你两个由正整数和 0 组成的数组 nums1 和 nums2 。 你必须将两个数组中的 所有 0 替换为 严格 正整数&#xff0c;并且满足两个数组中所有元素的和 相等 。 返回 最小 相等和 &#xff0c;如果无法使两数组相等&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入&#xf…

猿人学第十二题-js入门

1. 链接 https://match.yuanrenxue.cn/match/12 2. 抓包分析 2.1. m参数 通过观察&#xff0c;只有m参数要解决&#xff1a; 3. 逆向分析 3.1. 跟栈 直接跟栈吧&#xff0c;一下就出结果了&#xff1a; 可以看到m其实很简单&#xff0c;就是固定字符串 当前页数&#xf…

双系统电脑中如何把ubuntu装进外接移动固态硬盘

电脑&#xff1a;win11 ubuntu22.04 实体机 虚拟机&#xff1a;VMware17 镜像文件&#xff1a;ubuntu-22.04.4-desktop-amd64.iso 或者 ubuntu20.4的镜像 外接固态硬盘1个 一、首先win11中安装vmware17 具体安装方法&#xff0c;网上很多教程 二、磁盘分区 1.在笔…