使用 HPA 和 TopologySpreadConstraints 實現可用區間等比擴容

1. 原理介紹

  • 設置 HPA 每次最小擴容 Pod 數為可用區數量,以期可用區間 Pod 同步擴容
  • 設置 TopologySpreadConstraints 可用區分散 maxSkew 為 1,以盡可能可用區間 Pod 均勻分布

2. 實驗驗證

2.1. 準備 Kind 集群

準備如下配置文件,命名為 kind-cluster.yaml

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-planeimage: kindest/node:v1.24.0@sha256:0866296e693efe1fed79d5e6c7af8df71fc73ae45e3679af05342239cdc5bc8e
- role: workerimage: kindest/node:v1.24.0@sha256:0866296e693efe1fed79d5e6c7af8df71fc73ae45e3679af05342239cdc5bc8elabels:topology.kubernetes.io/zone: "us-east-1a"
- role: workerimage: kindest/node:v1.24.0@sha256:0866296e693efe1fed79d5e6c7af8df71fc73ae45e3679af05342239cdc5bc8elabels:topology.kubernetes.io/zone: "us-east-1c"

上述配置為集群定義了 2 個工作節點,并分別打上了不同的可用區標簽。
執行如下命令創建該 Kubernetes 集群:

$ kind create cluster --config cluster-1.24.yaml
Creating cluster "kind" ...? Ensuring node image (kindest/node:v1.24.0) 🖼 ? Preparing nodes 📦 📦 📦  ? Writing configuration 📜 ? Starting control-plane 🕹? ? Installing CNI 🔌 ? Installing StorageClass 💾 ? Joining worker nodes 🚜 
Set kubectl context to "kind-kind"
You can now use your cluster with:kubectl cluster-info --context kind-kindHave a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂

檢查集群運行正常:

$ kubectl get node --show-labels
NAME                 STATUS   ROLES           AGE    VERSION   LABELS
kind-control-plane   Ready    control-plane   161m   v1.24.0   beta.kubernetes.io/arch=arm64,beta.kubernetes.io/os=linux,kubernetes.io/arch=arm64,kubernetes.io/hostname=kind-control-plane,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
kind-worker          Ready    <none>          160m   v1.24.0   beta.kubernetes.io/arch=arm64,beta.kubernetes.io/os=linux,kubernetes.io/arch=arm64,kubernetes.io/hostname=kind-worker,kubernetes.io/os=linux,topology.kubernetes.io/zone=us-east-1a
kind-worker2         Ready    <none>          160m   v1.24.0   beta.kubernetes.io/arch=arm64,beta.kubernetes.io/os=linux,kubernetes.io/arch=arm64,kubernetes.io/hostname=kind-worker2,kubernetes.io/os=linux,topology.kubernetes.io/zone=us-east-1c
2.2. 安裝 metrics-server 組件

HPA 依賴 metrics-server 提供監控指標,通過如下命令安裝:

$ kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

提示: 國內網絡不能直接下載到 registry.k8s.io/metrics-server/metrics-server:v0.6.4 鏡像,可以替換為等同的 shidaqiu/metrics-server:v0.6.4。同時,關閉 tls 安全校驗,如下圖:
在這里插入圖片描述

檢查部署后的 metrics-server 運行正常:

$ kubectl top node
NAME                 CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
kind-control-plane   238m         5%     667Mi           8%        
kind-worker          76m          1%     207Mi           2%        
kind-worker2         41m          1%     110Mi           1% 
2.3. 部署測試服務

準備如下 YAML,命名為 hpa-php-demo.yaml

注意:Deployment 的 topologySpreadConstraints 配置為可用區分散!

apiVersion: apps/v1
kind: Deployment
metadata:name: php-web-demo
spec:selector:matchLabels:run: php-web-demoreplicas: 1template:metadata:labels:run: php-web-demospec:topologySpreadConstraints:- maxSkew: 1topologyKey: kubernetes.io/zonewhenUnsatisfiable: ScheduleAnywaylabelSelector:matchLabels:run: php-web-democontainers:- name: php-web-demoimage: shidaqiu/hpademo:latestports:- containerPort: 80resources:limits:cpu: 500mrequests:cpu: 200m
---
apiVersion: v1
kind: Service
metadata:name: php-web-demolabels:run: php-web-demo
spec:ports:- port: 80selector:run: php-web-demo

部署上述服務:

kubectl apply -f hpa-php-demo.yaml
2.4. 部署 HPA 配置

準備 HPA 配置文件,命名為 hpa-demo.yaml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: php-web-demo
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: php-web-demominReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 50behavior:scaleDown:stabilizationWindowSeconds: 300policies:- type: Percentvalue: 50periodSeconds: 15- type: Podsvalue: 2periodSeconds: 15scaleUp:stabilizationWindowSeconds: 0policies:- type: Percentvalue: 100periodSeconds: 15- type: Podsvalue: 2periodSeconds: 15 selectPolicy: Max

部署上述 HPA 配置:

$ kubectl apply -f hpa-demo.yaml

上述 HPA 通過 scaleUp 和 scaleDown 定義了擴容和縮容的行為,每次擴容一倍或 2 個 Pod(取較大者),每次縮容一半或 2 個 Pod(取較大者)。

2.5. 驗證擴容

擴容前,觀察 Pod 分別運行在兩個區:

$ kubectl get pod -owide
NAME                           READY   STATUS    RESTARTS   AGE     IP           NODE           NOMINATED NODE   READINESS GATES
php-web-demo-d6d66c8d5-22tn6   1/1     Running   0          6m57s   10.244.2.3   kind-worker2   <none>           <none>
php-web-demo-d6d66c8d5-tz8m9   1/1     Running   0          76s     10.244.1.3   kind-worker    <none>           <none>

給服務施加壓力:

$ kubectl run -it --rm load-generator --image=busybox /bin/sh
進入容器后,執行如下腳本:
while true; do wget -q -O- http://php-web-demo; done

可以觀察到 Pod 擴容時,同時在兩個可用區進行,實現了可用區同步擴容的效果
在這里插入圖片描述
停止施加壓力,可以觀察到 Pod 縮容保持了可用區分散的狀態

如何保證縮容后,Pod 仍在多可用區均勻分散?

可以考慮借助 descheduler 的 rebalance 能力,參考 https://github.com/kubernetes-sigs/descheduler?tab=readme-ov-file#removepodsviolatingtopologyspreadconstraint

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

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

相關文章

軟件測試面試題及答案解析

在軟件測試領域&#xff0c;面試是求職者進入這個行業的重要途徑。為了幫助大家更好地應對軟件測試面試&#xff0c;本文將為大家提供一些常見的軟件測試面試題及答案解析。 請簡要介紹一下軟件測試的目的和重要性。 答&#xff1a;軟件測試的目的是確保軟件產品的質量&#…

千問模型測試環境配置

配置千問環境比較順利&#xff0c;有些由于速度問題較慢&#xff0c;添加源之后提速很多&#xff0c;記錄如下&#xff1a; 1.創建虛擬環境 conda create -p /datanas3/chenjing/envs/qwen python3.8 2.激活虛擬環境 conda activate /datanas3/chenjing/envs/qwen 3.添加源 co…

“身份證信息批量核驗:高效解決管理難題,輕松提升工作效率“

尊敬的讀者們&#xff0c;您是否曾經因為身份證信息的核驗而感到煩惱&#xff1f;是否曾經因為手動核驗而感到繁瑣和耗時&#xff1f;現在&#xff0c;我們向您介紹一款全新的工具——身份證信息批量核驗器&#xff0c;它將幫助您一鍵解決管理難題&#xff0c;讓工作事半功倍&a…

嘗試通過AI模型進行簡單的編碼

一、前言 最近嘗試通過AI來編程&#xff0c;總體感覺還是能處理寫簡單的問題&#xff0c;復雜的問題目前還是無法解決。主要的痛點還是數據噪音&#xff0c;就是AI永遠不會承認它不會&#xff0c;它會給你的一個錯誤的信息&#xff0c;它也不會告訴你你的問題它暫時無法完整正…

Python基礎語法詳解,零基礎入門必須掌握的知識點

文章目錄 一、Python輸出1、repr() 或 str() 轉成字符串2、字符串填充空格進行格式化3、!a (使用 **ascii()**), !s (使用 **str()**) 和 !r (使用 **repr()**) 可以用于在格式化某個值之前對其進行轉化 二、Python標識符三、Python保留字符&#xff08;關鍵字&#xff09;四、…

代碼隨想錄算法訓練營第四十五天| 70 爬樓梯 322 零錢兌換 279 完全平方數

目錄 70 爬樓梯 322 零錢兌換 279 完全平方數 70 爬樓梯 本題可以轉化為完全背包問題進行解答。 class Solution { public:int climbStairs(int n) {vector<int>f(n 2);f[0] 1;int m 2;for(int i 1;i < n;i){for(int j 1;j < m;j){if(i > j)f[i] f[i - j]…

[Python系列] 文字轉語音

什么是TTS TTS 是 Text-to-Speech 的縮寫&#xff0c;中文稱為“文本到語音”。它是一種將書面文本轉換為自然聽起來的語音的技術。TTS 技術廣泛應用于各種場景&#xff0c;如智能助手、語音合成、電子閱讀器等。 TTS 技術通過機械的、電子的方法產生人造語音。它隸屬于…

對Spring源碼的學習:一

目錄 BeanFactory開發流程 ApplicationContext BeanFactory與ApplicationContext對比 基于XML方式的Bean的配置 自動裝配 BeanFactory開發流程 這里的第三方指的是Spring提供的BeanFactory&#xff0c;Spring啟動時會初始化BeanFactory&#xff0c;然后讀取配置清單&#…

外匯天眼:什么時段做外匯交易最好,有所謂的“最佳時間點”嗎?

在外匯交易的時候&#xff0c;很多手動交易的投資者不知道到底什么時間段操作交易最適合自己。 我們在進行選擇最佳交易時間的時候&#xff0c;一定要明白各時間段的全球各個市場的交易狀況&#xff0c;這樣你才能分配好自己的時間。 當然在通過技術分析與基本分析選擇好幣種后…

PostgreSQL 索引介紹和使用事項

索引內容 關鍵點 索引是一種數據結構&#xff0c;用于加快數據庫查詢的速度。它類似于書籍的目錄&#xff0c;可以快速定位到特定的數據頁。 PG數據庫支持多種類型的索引&#xff0c;包括B樹索引、哈希索引、GiST索引、SP-GiST索引和GIN索引等。 B樹索引是PG數據庫中最常用的…

Google剛發布AlphaCode 2,讓我們碼農多了個小伙伴一起干活

除了其Gemini生成式人工智能模型之外&#xff0c;谷歌今天早上發布了AlphaCode 2&#xff0c;這是谷歌DeepMind實驗室大約一年前推出的代碼生成AlphaCode的改進版本。 事實上&#xff0c;AlphaCode 2實際上由Gemini提供支持&#xff0c;或者至少是由Gemini的某個變體&#xff…

Linux學習教程(第十五章 Linux系統日志管理)

第十五章 Linux系統日志管理 系統日志詳細地記錄了在什么時間&#xff0c;哪臺服務器、哪個程序或服務出現了什么情況。不管是哪種操作系統&#xff0c;都詳細地記錄了重要程序和服務的日志&#xff0c;只是我們很少養成查看日志的習慣。 日志是系統信息最詳細、最準確的記錄者…

煤炭物流行業分析:中國各個分布地區生產占比調研

煤炭物流是指從煤炭生產所需物料進入企業開始&#xff0c;直至把商品煤運達客戶為止的全過程的物流活動。廣義的講&#xff0c;煤炭物流包括煤炭企業原材料的采購、原煤開采、洗選加工、儲存、運輸、銷售以及礦巖等廢棄物的綜合利用諸多環節。狹義的講&#xff0c;煤炭物流是指…

基于個微機器人的開發

簡要描述&#xff1a; 下載消息中的動圖 請求URL&#xff1a; http://域名/getMsgEmoji 請求方式&#xff1a; POST 請求頭Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 參數&#xff1a; 參數名必選類型說明…

spring boot 事件機制

目錄 概述實踐監聽spring boot ready事件代碼 源碼初始化流程調用流程 結束 概述 spring boot 版本為 2.7.17 。 整體看一下spring及spring boot 相關事件。 根據下文所給的源碼關鍵處&#xff0c;打上斷點&#xff0c;可以進行快速調試。降低源碼閱讀難度。 實踐 spring…

TCP聊天

一、項目創建 二、代碼 Client類 package tcp;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner;public class Client {public static void m…

電子學會C/C++編程等級考試2022年06月(四級)真題解析

C/C++等級考試(1~8級)全部真題?點這里 第1題:公共子序列 我們稱序列Z = < z1, z2, ..., zk >是序列X = < x1, x2, ..., xm >的子序列當且僅當存在 嚴格上升 的序列< i1, i2, ..., ik >,使得對j = 1, 2, ... ,k, 有xij = zj。比如Z = < a, b, f, c &…

QT Windos平臺下打包應用程序

一、windeployqt.exe windeployqt&#xff1a;是 Qt 框架自帶的一個工具&#xff0c;用于將一個 Qt 應用程序在 Windows 操作系統下進行打包。它可以通過掃描應用程序的依賴項獲取所需的 Qt 庫文件、插件和翻譯文件&#xff0c;以及復制應用程序可執行文件和所需的依賴項到指定…

電商價格數據監測接口/品牌商品控價接口/商品數據分析接口/比價搜索API接口,超詳細的接口說明

電商價格數據監測API接口是一種用于監測電商平臺上商品價格的API接口&#xff0c;可以幫助品牌和商家及時獲取商品價格信息&#xff0c;掌握價格動態&#xff0c;進行價格對比和分析&#xff0c;以更好地制定價格策略和進行價格調整。 該接口可以監測多個電商平臺的商品價格信…

VM:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize256m; support was removed in 8.0 “JDK 8兼容性指南” 指出&#xff0c;在Java 8中&#xff0c;命令行標志 MaxPermSize 已被刪除。原因是永久代從熱點堆中被移除并被轉移到本地內存。所以為了刪除…