Kubernetes 彈性伸縮:深入講解 HPA 和 VPA

1. 介紹

Kubernetes 提供了多種資源管理方式,其中 彈性伸縮(Auto-scaling)是最重要的特性之一。彈性伸縮可以根據應用的負載變化自動調整 Pod 的數量和資源,以確保在高負載下應用能夠正常運行,而在低負載時節省資源。在 Kubernetes 中,Horizontal Pod Autoscaler(HPA)和 Vertical Pod Autoscaler(VPA)是實現彈性伸縮的兩大核心組件。本文將重點講解這兩個組件的工作原理、配置和使用場景。


2. Horizontal Pod Autoscaler(HPA)

什么是 HPA?

Horizontal Pod Autoscaler(HPA)是 Kubernetes 中用于根據負載自動調整 Pod 數量的機制。HPA 會根據實際的資源使用情況(如 CPU、內存、或自定義指標),自動增加或減少 Pod 的副本數,從而實現彈性伸縮。

HPA 工作原理

HPA 通過監控 Pod 的資源使用情況(如 CPU 使用率、內存占用等)來決定是否擴容或縮容。當監控到的負載超過預設閾值時,HPA 會增加 Pod 的副本數;當負載降低時,HPA 會減少 Pod 的副本數。

HPA 使用 Metrics Server 收集 Pod 的實時資源使用數據,并通過比對當前資源使用情況與目標值,來決定是否調整 Pod 數量。

配置 HPA

HPA 可以為任何類型的 Kubernetes 工作負載(如 Deployment、ReplicaSet)創建。以下是一個基于 CPU 使用率的 HPA 配置示例:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: my-app-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: my-appminReplicas: 1  # 最少副本數maxReplicas: 10 # 最大副本數metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 80  # 目標 CPU 使用率為 80%

關鍵字段解析:

  • scaleTargetRef: 指定 HPA 作用的目標資源(如 Deployment、StatefulSet 等)。
  • minReplicas: Pod 副本的最小數量。在低負載時,Pod 不會縮容到小于此值。
  • maxReplicas: Pod 副本的最大數量。在高負載時,Pod 不會擴容到超過此值。
  • metrics: 指定用于伸縮的指標類型。type: Resource 表示基于資源(如 CPU 或內存)進行伸縮。averageUtilization 表示當 CPU 使用率超過 80% 時,Pod 副本會增加。

HPA 工作流程

  1. 指標采集:HPA 控制器通過 Metrics Server 獲取 Pod 的實時資源利用數據,如 CPU 或內存的使用率。
  2. 目標值判斷:HPA 控制器會將當前的資源使用情況與設定的目標值進行對比。例如,如果 CPU 使用率超過 80%,則表示負載較高,Pod 需要擴展。
  3. 調整副本數:如果資源使用超過目標值,HPA 會增加 Pod 的副本數。如果資源使用低于目標值,HPA 會減少 Pod 的副本數。
  4. 自動調節:HPA 控制器會根據負載的變化,定期進行伸縮操作,確保 Pod 數量適應負載變化。

注意事項

  • 延遲響應:由于 HPA 基于實際負載和資源使用情況來伸縮,因此如果負載劇烈波動,HPA 可能會出現延遲響應。
  • CPU 或內存使用率:HPA 通常基于 CPU 或內存的使用率來進行伸縮。如果應用的負載與這些資源指標不直接相關(例如,負載與網絡流量有關),可能需要使用 自定義指標 來調整伸縮策略。

3. Vertical Pod Autoscaler(VPA)

什么是 VPA?

Vertical Pod Autoscaler(VPA)是 Kubernetes 中另一種彈性伸縮機制,和 HPA 不同的是,VPA 主要用于 垂直擴展,即根據 Pod 的實際資源需求(如 CPU、內存)自動調整 Pod 的資源請求和限制,而不是改變 Pod 副本數。VPA 通過分析 Pod 的資源使用情況,自動調整容器的 CPU 和內存請求。

VPA 工作原理

VPA 會根據 Pod 的資源使用情況(CPU、內存)調整 Pod 的資源請求。如果 Pod 當前的資源請求過低,VPA 會增加資源請求;如果資源請求過高,VPA 會減少資源請求。VPA 不會增加或減少 Pod 的副本數,它只會調節現有 Pod 的資源配額。

VPA 可以根據以下兩種模式來調整 Pod 的資源:

  • Auto: 自動更新資源請求。
  • Initial: 只在 Pod 初始化時調整資源請求。
  • Off: 禁用自動調整。

配置 VPA

以下是一個 VPA 的配置示例,它會自動調整 Pod 的 CPU 和內存請求:

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:name: my-app-vpa
spec:targetRef:apiVersion: apps/v1kind: Deploymentname: my-appupdatePolicy:updateMode: "Auto"  # 自動調整資源請求

關鍵字段解析:

  • targetRef: 指定 VPA 適用的目標資源(如 Deployment)。

  • updatePolicy: 設置資源更新策略。

    • Auto: VPA 會根據實時數據自動更新資源請求。
    • Initial: 僅在 Pod 初始化時進行資源調整。
    • Off: 禁用資源自動調整。

VPA 工作流程

  1. 指標采集:VPA 會監控 Pod 的 CPU 和內存使用情況,分析當前資源的使用是否符合預期。
  2. 資源請求調整:根據 Pod 實際的資源使用情況,VPA 會增加或減少容器的資源請求。如果 Pod 使用的 CPU 或內存接近請求的最大限制,VPA 會建議增加資源請求。
  3. 更新資源請求:VPA 會根據計算出的推薦值,自動更新 Pod 的資源請求。如果 Pod 在啟動后需要更多的資源,VPA 會進行調整。
  4. 自動化調整:VPA 會自動進行這些調整,幫助 Pod 避免資源瓶頸或資源浪費。

注意事項

  • 重啟 Pod:VPA 調整資源請求時,通常會導致 Pod 被重啟。這是因為 Kubernetes 需要重新分配資源,尤其是在調整 CPU 或內存請求時。
  • VPA 與 HPA 的結合使用:VPA 和 HPA 可以一起使用。VPA 調整 Pod 的資源請求,HPA 根據這些資源請求和負載情況調整 Pod 副本數。這樣,既能優化每個 Pod 的資源利用,又能在負載增加時動態擴展 Pod 數量。

4. HPA 與 VPA 的結合使用

在實際生產環境中,HPAVPA 可以結合使用,從而實現更加靈活的資源伸縮。具體來說:

  • HPA 可以根據負載(如 CPU、內存等)動態擴展或縮小 Pod 的副本數。
  • VPA 可以根據 Pod 的資源使用情況動態調整每個 Pod 的 CPU 和內存請求。

通過同時使用這兩種自動伸縮機制,Kubernetes 可以靈活地應對應用負載的變化,確保應用在高負載時能夠自動擴容,而在低負載時又能節省資源。

HPA + VPA 的應用場景

  • 負載波動較大的應用:例如 Web 應用,負載可能在高峰時突然增加,使用 HPA 擴容 Pods,使用 VPA 調整 Pods 的資源請求,確保應用能夠處理大流量。
  • 資源請求不明確的應用:對于那些未明確配置資源請求的應用,VPA 可以根據實際運行時的資源消耗,自動調整請求,避免因資源不足而導致 Pod 被殺死。

配置實例:HPA + VPA 聯動

假設我們有一個應用,既希望根據負載自動擴容 Pods,又希望根據實際的資源使用情況自動調整資源請求。我們可以同時配置 HPA 和 VPA。

HPA 配置:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: my-app-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: my-appminReplicas: 1maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 80

VPA 配置:

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:name: my-app-vpa
spec:targetRef:apiVersion: apps/v1kind: Deploymentname: my-appupdatePolicy:updateMode: "Auto"

5. 總結

Kubernetes 的 Horizontal Pod Autoscaler (HPA)Vertical Pod Autoscaler (VPA) 是實現彈性伸縮的關鍵組件。HPA 通過自動調整 Pod 的副本數來應對負載的波動,而 VPA 則通過動態調整每個 Pod 的資源請求,確保它們獲得適當的資源配置。兩者結合使用,可以讓應用根據實際需求靈活地擴展和調整,從而提高資源利用率和系統的彈性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96745.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96745.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96745.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大數據畢業設計選題推薦-基于大數據的家庭能源消耗數據分析與可視化系統-Hadoop-Spark-數據可視化-BigData

?作者主頁:IT畢設夢工廠? 個人簡介:曾從事計算機專業培訓教學,擅長Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等項目實戰。接項目定制開發、代碼講解、答辯教學、文檔編寫、降重等。 ?文末獲取源碼? 精彩專欄推薦?…

【Spring】原理解析:Spring Boot 自動配置的核心機制與實戰剖析

一、引言在當今的 Java 開發領域,Spring Boot 憑借其快速搭建項目、簡化配置等優勢,成為了眾多開發者的首選框架。而 Spring Boot 自動配置作為其核心特性之一,極大地提升了開發效率,讓開發者能夠更專注于業務邏輯的實現。本文將深…

Java forEach中不能用i++的原因以及代替方案

因為在 Lambda 表達式內部訪問的外部局部變量必須是 final 或 effectively final(事實最終變量),而 i 操作試圖改變這個變量的值,違反了這一規定。下面我們來詳細拆解這個問題,讓你徹底明白。1. 一個具體的例子我們先看…

第十四屆藍橋杯青少組C++選拔賽[2023.1.15]第二部分編程題(2 、尋寶石)

參考程序&#xff1a;#include <bits/stdc.h> using namespace std;int main() {int N;cin >> N; // 讀入盒子數vector<int> a(N);for (int i 0; i < N; i) cin >> a[i]; // 讀入每個盒子的寶石數// N > 3&#xff08;題目保證&#x…

9120 部 TMDb 高分電影數據集 | 7 列全維度指標 (評分 / 熱度 / 劇情)+API 權威源 | 電影趨勢分析 / 推薦系統 / NLP 建模用

一、引言在影視行業分析與數據科學實踐中&#xff0c;高分電影數據的深度挖掘已成為平臺優化內容推薦、制片方研判市場趨勢、影迷發現優質作品的核心支撐 —— 通過上映年份與評分的關聯可捕捉電影質量演變、依托熱度與投票數能定位爆款潛質、結合劇情概述可開展情感與主題分析…

Tomcat PUT方法任意寫文件漏洞學習

1 PUT請求 PUT請求是一種在HTTP協議中常見的請求方法 1.1 基本原理 PUT請求是一種用于向指定資源位置上傳新的實體數據的請求方法&#xff0c;與其他請求方法的區別在于&#xff0c;PUT請求用于創建或者更新只當資源位置的實體數據。它與GET請求不同&#xff0c;PUT請求會替換掉…

【C++基礎】初識模板——一起步入泛型編程的大門

引言在 C 世界里&#xff0c;模板&#xff08;Template&#xff09;就像一把萬能鑰匙。它允許你編寫通用的代碼&#xff0c;讓編譯器在需要的時候為具體類型生成對應的函數或類。換句話說&#xff0c;模板是 C 泛型編程&#xff08;Generic Programming&#xff09; 的基石。 如…

項目管理框架如何影響團隊協作

在項目執行過程中&#xff0c;項目管理框架不僅是一套工具和流程&#xff0c;更是團隊協作方式的基礎。不同的項目管理框架會深刻影響團隊溝通效率、任務分配、決策方式和整體協同效果。 傳統框架通常強調層級與計劃&#xff0c;帶來高度規范化的協作&#xff1b;敏捷框架則強調…

正向代理,反向代理,負載均衡還有nginx

這是一個非常核心且重要的后端/運維知識領域。我會用盡可能清晰易懂的方式&#xff0c;結合生動的比喻&#xff0c;為你詳細梳理這些概念。核心概念一覽我們先從一個宏觀的角度來理解它們之間的關系&#xff1a;代理&#xff08;Proxy&#xff09;&#xff1a; 一個中間人的角色…

WebSocket壓縮傳輸優化:機器視覺高清流在DCS中的低延遲方案

引言在現代工業自動化領域&#xff0c;分布式控制系統&#xff08;DCS&#xff09;正面臨著前所未有的數據挑戰。隨著機器視覺技術的廣泛應用&#xff0c;高清視頻流已成為監控產品質量、檢測設備異常和保障生產安全的重要手段。然而&#xff0c;將720P、1080P甚至4K分辨率的高…

《Linux常見命令》

ls 功能&#xff1a;列出目錄下的子目錄與文件&#xff0c;對于文件&#xff0c;還會列出文件名及其他信息。 語法&#xff1a;ls [選項] [目錄或文件] 1.常用選項及說明選項說明-a列出目錄下的所有文件&#xff0c;包括以 . 開頭的隱含文件-d將目錄象文件一樣顯示&#xff0c;…

Python數據分析:函數定義時的位置參數。

目錄1 代碼示例2 歡迎糾錯3 免費爬蟲4 論文寫作/Python 學習智能體1 代碼示例 直接上代碼。 def pargs1(a, b):"""先看確定數量的位置參數。最簡單的位置參數。a和b都叫而且只能叫“位置參數”。所謂確定數量&#xff0c;很明顯&#xff0c;是兩個就是兩個&…

《沒有架構圖?用 netstat、ss、tcpdump 還原服務連接與數據流向》

&#x1f4e2; 你是否遇到過這些問題&#xff1f; 接手一個老項目&#xff0c;只有服務器賬號&#xff0c;沒有架構圖&#xff1f;服務突然異常&#xff0c;但不知道它依賴哪些外部系統&#xff1f;想畫數據流向圖&#xff0c;卻找不到文檔&#xff1f; 別擔心&#xff01;只要…

Redis列表(List):實現隊列/棧的利器,底層原理與實戰

Redis列表&#xff08;List&#xff09;&#xff1a;實現隊列/棧的利器&#xff0c;底層原理與實戰 1. Redis列表概述 1.1 什么是Redis列表 Redis列表&#xff08;List&#xff09;是一個有序的字符串元素集合&#xff0c;支持在頭部和尾部進行高效的插入和刪除操作。它可以…

OpenCV 圖像雙三次插值

文章目錄 一、簡介 二、實現代碼 三、實現效果 參考資料 一、簡介 在數學中,雙三次插值是三次樣條插值(一種將三次插值應用于數據集的方法)的擴展,用于在二維規則網格上插值數據點。插值曲面(指核形狀,而非圖像)比通過雙線性插值或最近鄰插值獲得的相應曲面更平滑。雙三…

【Java實戰?】Spring Security:為Spring Boot應用筑牢安全防線

目錄 一、Spring Security 概述 1.1 Spring Security 核心功能 1.2 Spring Security 與 Shiro 對比 二、Spring Boot 整合 Spring Security 基礎 2.1 整合依賴導入 2.2 默認安全配置 2.3 自定義用戶認證 2.4 自定義登錄與注銷 三、Spring Security 授權控制 3.1 基于角色的授權…

linux命令—stat

命令簡介 stat是Linux中用于查看文件或文件系統的詳細狀態信息的強大命令。它比ls -l更全面&#xff0c;其輸出信息包括但不限于&#xff1a;文件大小、權限、所有者、最后訪問/修改/狀態變更時間、inode號、所在設備信息等。 用法 stat命令的語法格式如下 stat [選項] 文件…

解決串口數據亂序問題

環境&#xff1a;jetson nano ubuntu 20.04python 3.12終于是找到解決串口亂序的最佳解決辦法了&#xff0c;先來看看什么是串口亂序&#xff1a;這就是一個典型的串口亂序&#xff0c;我的發送端發送 的協議為0x55 0x51 ...0x55 0x52 ...0x55 0x53 ...0x55 0x54 ...在這四條協…

Spring的注解

聲明Bean的注解 ?Component ?Controller ?Service ?Repository 后三種為Component的別名&#xff0c;之所以不同是因為可讀性的考慮 Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Component public interface Controller {AliasFor(//別名an…

UVM寄存器模型與通道機制

接續UVM基礎入門文章。前言重點講述UVM常用的接口連接方式。寄存器模型&#xff1a;UVM寄存器模型&#xff08;Register Model&#xff09;是一組高級抽象的類&#xff0c;用于對DUT&#xff08;Design Under Test&#xff09;中具有地址映射的寄存器和存儲器進行建模&#xff…