资源管理与HPA:让Kubernetes应用自动伸缩

引言:从“手动挡”到“自动驾驶”

想象我们驾驶一辆汽车,手动调节油门和换挡不仅费力,还难以应对突发状况。我们的应用服务也一样,在面对突然的流量增长,内存使用暴涨该如何应对。HPA(Horizontal Pod Autoscaler) 为我们提供了解决方案,它像更高级的“自动驾驶”,根据实时负载自动扩缩容。接下来我们一块学习如何应用HPA进行配置资源请求、限制与自动伸缩策略。


一、为什么需要资源管理?

1.1 资源争抢的灾难场景

  • 案例:某个Pod疯狂占用CPU,导致同节点其他应用瘫痪。
  • 后果:服务响应延迟、OOM(内存溢出)错误、节点崩溃。

资源管理的核心目标

  • 稳定性:为每个容器预留必要资源,避免争抢。
  • 利用率:合理分配资源,防止浪费。

二、资源请求与限制:为容器戴上“紧箍咒”

2.1 核心概念

  • requests(请求):容器启动所需的最低资源保障(如“至少需要1核CPU”)。
  • limits(限制):容器能使用的资源上限(如“最多使用2核CPU”)。

2.2 配置示例

在Pod或Deployment中定义资源约束:

# deployment-with-resources.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: web-app
spec:replicas: 2template:spec:containers:- name: nginximage: nginx:latestresources:requests:    # 资源请求cpu: "100m"  # 0.1核CPUmemory: "128Mi"  # 128MB内存limits:      # 资源限制cpu: "500m"  # 0.5核CPUmemory: "512Mi"  # 512MB内存

2.3 资源单位详解

  • CPU
    • 1 = 1核CPU,100m = 0.1核(毫核)。
    • 可超卖:多个Pod的CPU请求总和可超过节点实际CPU。
  • 内存
    • 单位:Mi(兆字节)、Gi(千兆字节)。
    • 不可超卖:节点内存耗尽时,会触发OOM Killer终止进程。

2.4 验证资源分配

查看Pod资源详情
kubectl describe pod <pod-name>

输出示例:

Containers:nginx:Limits:cpu:     500mmemory:  512MiRequests:cpu:     100mmemory:  128Mi
监控节点资源使用
kubectl top nodes
kubectl top pods

三、HPA:水平自动扩缩容

3.1 HPA的工作原理

  • 监控指标:CPU利用率、内存使用率或自定义指标(如QPS)。
  • 扩缩逻辑:当指标超过阈值时,自动增加/减少Pod副本数。
    在这里插入图片描述
    (图:HPA根据指标变化调整Deployment的副本数)

3.2 配置HPA(CPU为例)

步骤1:部署Metrics Server

HPA依赖资源指标数据,需先安装Metrics Server:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 验证安装
kubectl get deployment metrics-server -n kube-system
步骤2:创建HPA策略
# 当CPU使用率超过50%时扩容,最少1个Pod,最多5个
kubectl autoscale deployment web-app --cpu-percent=50 --min=1 --max=5

或通过YAML定义:

# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: web-app-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: web-appminReplicas: 1maxReplicas: 5metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 50
步骤3:触发压力测试
# 进入Pod生成CPU负载
kubectl exec -it <pod-name> -- sh
dd if=/dev/zero of=/dev/null &  # 模拟CPU满载
exit# 观察HPA状态
kubectl get hpa -w

输出示例:

NAME          REFERENCE            TARGET   MINPODS MAXPODS REPLICAS
web-app-hpa   Deployment/web-app   150%/50% 1       5       3

3.3 高级配置:内存与自定义指标

基于内存的HPA
metrics:
- type: Resourceresource:name: memorytarget:type: UtilizationaverageUtilization: 80  # 内存使用率阈值80%
自定义指标(需Prometheus适配器)
metrics:
- type: Podspods:metric:name: http_requests_per_secondtarget:type: AverageValueaverageValue: 100  # 每秒请求数超过100时扩容

四、最佳实践与陷阱避坑

4.1 资源参数优化建议

  • CPU请求:根据应用基线负载设定(如Java应用初始值可设500m)。
  • 内存限制:留出至少20%缓冲,避免OOM。

4.2 常见陷阱

  • 未设置limits:导致“资源吸血鬼”耗尽节点资源。
  • HPA振荡:阈值过小或指标波动大,导致副本数频繁变化。
    • 解决:适当增大扩缩容冷却时间(--horizontal-pod-autoscaler-downscale-stabilization)。

五、常见问题与解决

  1. HPA不触发扩容

    • 检查Metrics Server是否正常运行:kubectl top pods
    • 确认Deployment的resources.requests已设置(HPA依赖requests计算利用率)。
  2. Pod因OOM被终止

    • 增大memory.limits或优化应用内存使用。
    • 检查是否有内存泄漏。
  3. 节点资源不足导致Pod无法调度

    • 清理闲置Pod或扩容集群节点。
    • 检查kubectl describe node的资源分配情况。

动手实验

  1. 模拟流量高峰
    使用压测工具(如heywrk)对服务发起请求,观察HPA如何扩容:

    hey -z 5m -c 100 http://<service-ip>:<port>
    
  2. 动态调整HPA阈值
    修改HPA的targetAverageUtilization,观察副本数变化:

    kubectl edit hpa web-app-hpa
    

资源推荐

  • Kubernetes HPA官方文档
  • Metrics Server GitHub仓库
  • Kubernetes资源配额管理

现在,我们的应用无论是突发流量还是资源挤占,Kubernetes的自动化机制都能让系统稳如磐石。

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

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

相关文章

Windows 下 MongoDB ZIP 版本安装指南

在开发和生产环境中&#xff0c;MongoDB 是一种非常流行的 NoSQL 数据库&#xff0c;以其灵活性和高性能而受到开发者的青睐。对于 Windows 用户来说&#xff0c;MongoDB 提供了多种安装方式&#xff0c;其中 ZIP 版本因其灵活性和轻量级的特点&#xff0c;成为很多开发者的首选…

【Linux网络与网络编程】11.数据链路层mac帧协议ARP协议

前面在介绍网络层时我们提出来过一个问题&#xff1a;主机是怎么把数据交给路由器的&#xff1f;那里我们说这是由数据链路层来做的。 网络上的报文在物理结构上是以mac帧的形式流动的&#xff0c;但在逻辑上是以IP流动的&#xff0c;IP的流动是需要mac帧支持的。 数据链路层解…

多模态思维链AI医疗编程:从计算可持续性到开放域推理的系统性解决方案

多模态思维链AI医疗编程:从计算可持续性到开放域推理的系统性解决方案 医疗AI领域的多模态思维链技术正在重塑临床决策支持、医学影像分析和医疗流程优化的范式。本指南从计算可持续性、错误传播控制、伦理安全防护和通用性扩展四大维度,系统解析医疗大模型落地落地的关键要…

代理模式深度解析

目录 一 静态代理 1.1 优点 1.2 缺点 1.3 适用场景 二 JDK动态代理 1 JDK动态代理的工作原理 1.1 创建代理类 1.2 加载代理类 1.3 实现方法调用 2. Proxy.newProxyInstance() 的核心工作流程 方法签名 工作步骤 3. 代理类的生成与加载 3.1 代理类生成的关键方法 …

Spring Cache与Redis集成原理

一、核心架构图解 #mermaid-svg-aiWGQLhmWx7kOfLz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-icon{fill:#552222;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-text{fill:#552222;stroke:#5…

编程技能:调试02,设置断点与删除断点

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;调试01&#xff0c;调试介绍 回到目录 下…

flink写doris时的优化

1.概念 doris并不擅长高频、小量数据的导入&#xff1b; 因为doris每一次数据导入都会在be节点上生成数据文件&#xff1b;如果高频导入小量数据&#xff0c;就会在存储层产生大量的小文件&#xff08;必然会影响到后续的查询效率&#xff0c;也会对系统产生更多的compaction…

ElementNotInteractableException原因及解决办法

在自动化测试中,ElementNotInteractableException是一个常见的异常,它通常发生在尝试与网页上的某个元素进行交互(例如点击、输入等操作)时,但由于该元素当前不可交互。这可能由多种原因引起,以下是一些常见的原因及其解决方法: 元素未完全加载 如果尝试与页面上的元素交…

如何从 GitHub 镜像仓库到极狐GitLab?

最近 GitHub 封禁中国用户的事情闹得沸沸扬扬,虽然官方发布的报道说中国用户被限制登录是因为配置错误导致,已经撤回了更新,中国用户已经可以正常使用。但是这就像横在国内开发者和企业头上的“达摩克利斯之剑”。为了避免 GitHub 不可用而带来的影响,国内开发者和企业可以…

服务器安装nacos

1.下载依赖 docker pull nacos/nacos-server:v2.4.3安装 docker run -d --name nacos-server -p 8848:8848 -e MODEstandalone nacos/nacos-server:v2.4.3把nacos中的data 文件和conf 文件copy到自己服务的文件夹 docker cp nacos-server:/home/nacos/data /home/admin1/…

Matter协议暗战:苹果、谷歌、亚马逊的智能家居霸权争夺

原文地址&#xff1a;Matter协议暗战&#xff1a;苹果、谷歌、亚马逊的智能家居霸权争夺 一、Matter 协议&#xff1a;巨头联手打造的 “智能家居联合国” 1.1 从 CHIP 到 Matter&#xff1a;标准统一的十年长跑 智能家居发展多年&#xff0c;却始终被 “孤岛效应” 困扰。各…

软件设计师2009-2022历年真题与答案解析(附pdf下载)

软考在即&#xff0c;现在给大家分享一下软件设计师2009-2022真题与答案解析 pdf全套&#xff0c;文末提供大家免费下载&#xff0c;大家都知道在软考备考过程中&#xff0c;拥有一套全面且实用的考试资料对于考生来说至关重要。目录如下&#xff1a; 历年真题及详解2004-2019 …

基于EasyX库开发的球球大作战游戏

目录 球球大作战 一、开发环境 二、流程图预览 三、代码逻辑 1、初始化时间 2、设置开始界面大小 3、设置开始界面 4、让玩家选择速度 5、设置玩家小球、人机小球、食物的属性 6、一次性把图绘制到界面里 7、进入死循环 8、移动玩家小球 9、移动人机 10、食物刷新…

aslist和list的区别

‌Arrays.asList和List的主要区别在于它们的固定长度和不可变性、与原始数组的关系、性能以及使用场景。 一、固定长度和不可变性 ‌Arrays.asList‌&#xff1a;通过Arrays.asList方法创建的List是一个固定长度的List&#xff0c;其长度与原始数组相同。这意味着你不能通过添…

大模型预标注和自动化标注在OCR标注场景的应用

OCR&#xff0c;即光学字符识别&#xff0c;简单来说就是利用光学设备去捕获图像并识别文字&#xff0c;最终将图片中的文字转换为可编辑和可搜索的文本。在数字化时代&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术作为处理图像中文字信息的关键手段&#xff0c;其…

stm32工程,拷贝到另一台电脑编译,错误提示头文件找不到cannot open source input file “core_cm4.h”

提示 cannot open source input file “core_cm4.h” ,找不到 [ core_cm4.h ] 这个头文件 . 于是我在原电脑工程文件里找也没有找到这个头文件 接下来查看原电脑keil的头文件引入配置,发现只引入了工程文件下的头文件, 那么core_cm4.h到底哪里来的? (到现在我也不清楚怎…

STM32 模块化开发指南 · 第 2 篇 如何编写高复用的外设驱动模块(以 UART 为例)

本文是《STM32 模块化开发实战指南》的第 2 篇,聚焦于“串口驱动模块的设计与封装”。我们将从一个最基础的裸机 UART 初始化开始,逐步实现:中断支持、环形缓冲收发、模块接口抽象与测试策略,构建一个可移植、可扩展、可复用的 UART 驱动模块。 一、模块化 UART 的设计目标…

【NLP 59、大模型应用 —— 字节对编码 bpe 算法】

目录 一、词表的构造问题 二、bpe(byte pair encoding) 压缩算法 算法步骤 示例&#xff1a; 步骤 1&#xff1a;初始化符号表和频率统计 步骤 2&#xff1a;统计相邻符号对的频率 步骤 3&#xff1a;合并最高频的符号对 步骤 4&#xff1a;重复合并直至终止条件 三、bpe在NLP中…

TMS320F28P550SJ9学习笔记15:Lin通信SCI模式结构体寄存器

今日初步认识与配置使用Lin通信SCI模式&#xff0c;用结构体寄存器的方式编程 文章提供完整工程下载、测试效果图 我的单片机平台是这个&#xff1a; LIN通信引脚&#xff1a; LIN通信PIE中断&#xff1a; 这个 PIE Vector Table 表在手册111页&#xff1a; 这是提到LINa的PI…

linux-设置每次ssh登录服务器的时候提醒多久需要修改密码

在 Linux 系统中,你可以通过设置 motd(Message of the Day)或 sshd 配置来在用户通过 SSH 登录时提醒他们密码即将过期。以下是具体步骤: 方法 1: 使用 motd 文件 motd 文件在用户登录时显示,你可以通过脚本动态生成内容,提醒用户密码过期时间。 编辑 /etc/motd 文件:…