資源管理與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.pswp.cn/bicheng/77105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77105.shtml
英文地址,請注明出處:http://en.pswp.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 文件:…