国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Kubernetes HPA和VPA使用實戰指南

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2026-02-26 16:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、概述

1.1 背景介紹

線上業務流量存在明顯的波峰波谷。白天高峰期Pod數量不夠導致請求排隊,凌晨低谷期大量Pod空跑浪費資源。手動擴縮容不現實——你不可能每天早上8點上線加Pod、晚上12點再縮回去。

Kubernetes提供了兩種自動伸縮機制:

HPA(Horizontal Pod Autoscaler):水平伸縮,根據指標自動調整Pod副本數

VPA(Vertical Pod Autoscaler):垂直伸縮,根據實際使用量自動調整Pod的CPU/內存Request和Limit

兩者解決的問題不同。HPA解決"需要多少個Pod",VPA解決"每個Pod需要多少資源"。生產環境中通常HPA用得更多,VPA更多用于輔助資源規劃。

1.2 技術特點

HPA:基于Metrics Server或自定義指標(Prometheus Adapter)實現水平擴縮,支持CPU、內存、自定義指標和外部指標四種類型,擴縮算法基于desiredReplicas = ceil(currentReplicas * (currentMetricValue / desiredMetricValue))

VPA:由三個組件構成(Recommender、Updater、Admission Controller),通過分析歷史資源使用數據推薦合理的Request值,支持Auto、Recreate、Initial、Off四種更新模式

擴縮容穩定窗口:HPA v2支持配置stabilizationWindowSeconds,避免指標抖動導致頻繁擴縮。默認縮容穩定窗口300秒,擴容0秒

1.3 適用場景

HPA適用場景:Web服務、API網關等無狀態服務的流量波動應對;消息隊列消費者根據隊列積壓深度自動擴縮;批處理任務根據待處理任務數動態調整Worker數量

VPA適用場景:新上線服務不確定資源需求,用VPA的Off模式獲取推薦值后手動調整;Java應用JVM內存使用模式固定,用VPA自動調整避免OOMKill;長期運行的有狀態服務不適合水平擴展,通過垂直擴展提升單Pod處理能力

HPA+VPA混合場景:VPA設為Off模式只提供推薦值,HPA負責實際擴縮。兩者同時以Auto模式運行在CPU/內存指標上會沖突,生產環境不要這么干

1.4 環境要求

組件 版本要求 說明
Kubernetes 1.23+ HPA v2 API在1.23 GA,低版本只能用v2beta2
Metrics Server 0.6.0+ HPA依賴它獲取CPU/內存指標,必裝
VPA 0.14.0+ 需要單獨部署,不包含在K8s默認組件中
Prometheus + Adapter Prometheus 2.40+, Adapter 0.11+ 自定義指標擴縮必須,純CPU/內存擴縮不需要
集群節點 建議至少3個Worker節點 節點數太少HPA擴出來的Pod沒地方調度

二、詳細步驟

2.1 準備工作

2.1.1 確認集群狀態

# 確認K8s版本,HPA v2需要1.23+
kubectl version --short

# 檢查是否已安裝Metrics Server
kubectl get deployment metrics-server -n kube-system

# 如果沒有安裝Metrics Server,檢查節點指標是否可用
kubectl top nodes
# 如果報錯 "Metrics API not available",說明需要安裝Metrics Server

2.1.2 安裝Metrics Server

Metrics Server是HPA的基礎依賴,沒有它HPA拿不到CPU和內存指標。

# 下載Metrics Server部署文件
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.1/components.yaml

# 如果是自簽證書的集群(比如kubeadm搭建的),需要加啟動參數跳過證書校驗
# 編輯Metrics Server的Deployment
kubectl edit deployment metrics-server -n kube-system

在containers.args中添加:

args:
---cert-dir=/tmp
---secure-port=10250
---kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
---kubelet-use-node-status-port
---metric-resolution=15s
# 自簽證書集群必須加這行,否則Metrics Server連不上kubelet
---kubelet-insecure-tls
# 等待Metrics Server就緒
kubectl rollout status deployment metrics-server -n kube-system

# 驗證指標可用
kubectl top nodes
kubectl top pods -A

注意:--kubelet-insecure-tls只在測試環境或自簽證書環境使用。正式環境應該配置正確的CA證書。

2.1.3 部署測試應用

創建一個用于測試HPA的Deployment,必須設置resources.requests,否則HPA無法計算CPU利用率百分比。

# test-app.yaml
apiVersion:apps/v1
kind:Deployment
metadata:
name:php-apache
namespace:default
spec:
replicas:1
selector:
 matchLabels:
  app:php-apache
template:
 metadata:
  labels:
   app:php-apache
 spec:
  containers:
  -name:php-apache
   image:registry.k8s.io/hpa-example
   ports:
   -containerPort:80
   resources:
    requests:
     cpu:200m
     memory:128Mi
    limits:
     cpu:500m
     memory:256Mi
---
apiVersion:v1
kind:Service
metadata:
name:php-apache
namespace:default
spec:
selector:
 app:php-apache
ports:
-port:80
 targetPort:80
kubectl apply -ftest-app.yaml
kubectlwait--for=condition=available deployment/php-apache --timeout=60s

2.2 核心配置

2.2.1 HPA基礎配置——基于CPU指標

# hpa-cpu.yaml
apiVersion:autoscaling/v2
kind:HorizontalPodAutoscaler
metadata:
name:php-apache-hpa
namespace:default
spec:
scaleTargetRef:
 apiVersion:apps/v1
 kind:Deployment
 name:php-apache
minReplicas:2
maxReplicas:20
metrics:
-type:Resource
 resource:
  name:cpu
  target:
   type:Utilization
   # 目標CPU利用率50%,基于requests計算
   # Pod requests 200m,實際用到100m時就是50%
   averageUtilization:50
behavior:
 scaleUp:
  stabilizationWindowSeconds:0
  policies:
  -type:Percent
   value:100
   periodSeconds:15
  -type:Pods
   value:4
   periodSeconds:15
  selectPolicy:Max
 scaleDown:
  stabilizationWindowSeconds:300
  policies:
  -type:Percent
   value:10
   periodSeconds:60
  selectPolicy:Min
kubectl apply -f hpa-cpu.yaml
kubectl get hpa php-apache-hpa

參數說明

minReplicas: 2:最小副本數。生產環境至少設為2,設為1意味著縮容到底只剩一個Pod,掛了就全掛

maxReplicas: 20:最大副本數。根據集群資源容量設置上限,防止失控擴容把節點資源吃光

averageUtilization: 50:目標利用率。設太低(如20%)會導致Pod數量過多浪費資源,設太高(如90%)留不出余量應對突發流量。50%是比較穩妥的起點

scaleUp.stabilizationWindowSeconds: 0:擴容不等待,流量來了立刻擴

scaleDown.stabilizationWindowSeconds: 300:縮容等5分鐘,避免流量短暫下降就縮容,結果流量又上來了又要擴

behavior策略解讀

擴容策略用Max:取"當前副本數翻倍"和"加4個Pod"中的較大值,保證突發流量時擴得夠快

縮容策略用Min:取"縮10%"中的較小值,每分鐘最多縮10%,保證縮容足夠平滑

2.2.2 HPA多指標配置——CPU+內存+自定義指標

# hpa-multi-metrics.yaml
apiVersion:autoscaling/v2
kind:HorizontalPodAutoscaler
metadata:
name:web-app-hpa
namespace:production
spec:
scaleTargetRef:
 apiVersion:apps/v1
 kind:Deployment
 name:web-app
minReplicas:3
maxReplicas:50
metrics:
# CPU指標
-type:Resource
 resource:
  name:cpu
  target:
   type:Utilization
   averageUtilization:60
# 內存指標
-type:Resource
 resource:
  name:memory
  target:
   type:Utilization
   averageUtilization:70
# 自定義指標:每個Pod的QPS(需要Prometheus Adapter)
-type:Pods
 pods:
  metric:
   name:http_requests_per_second
  target:
   type:AverageValue
   averageValue:"1000"
# 外部指標:消息隊列積壓數(需要Prometheus Adapter)
-type:External
 external:
  metric:
   name:rabbitmq_queue_messages
   selector:
    matchLabels:
     queue:"task-queue"
  target:
   type:AverageValue
   averageValue:"50"

注意:多指標HPA的計算邏輯是取所有指標計算出的期望副本數的最大值。比如CPU算出需要5個Pod,QPS算出需要8個Pod,最終擴到8個。

2.2.3 安裝Prometheus Adapter(自定義指標擴縮必須)

# 使用Helm安裝Prometheus Adapter
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prometheus-adapter prometheus-community/prometheus-adapter 
 --namespace monitoring 
 --setprometheus.url=http://prometheus-server.monitoring.svc 
 --setprometheus.port=9090

Prometheus Adapter配置文件,將Prometheus指標映射為K8s Custom Metrics API:

# prometheus-adapter-config.yaml
apiVersion:v1
kind:ConfigMap
metadata:
name:prometheus-adapter
namespace:monitoring
data:
config.yaml:|
  rules:
  # 將Prometheus的http_requests_total映射為每秒請求數
  - seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
   resources:
    overrides:
     namespace: {resource: "namespace"}
     pod: {resource: "pod"}
   name:
    matches: "^(.*)_total$"
    as: "${1}_per_second"
   metricsQuery: 'rate(<<.Series>>{<<.LabelMatchers>>}[2m])'
  # RabbitMQ隊列深度
  - seriesQuery: 'rabbitmq_queue_messages{queue!=""}'
   resources:
    template: "<<.Resource>>"
   name:
    matches: "^(.*)"
    as: "$1"
   metricsQuery: '<<.Series>>{<<.LabelMatchers>>}'
# 驗證自定義指標API是否可用
kubectl get --raw"/apis/custom.metrics.k8s.io/v1beta1"| jq .
kubectl get --raw"/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/http_requests_per_second"| jq .

2.2.4 VPA安裝與配置

# 克隆VPA項目
gitclonehttps://github.com/kubernetes/autoscaler.git
cdautoscaler/vertical-pod-autoscaler

# 安裝VPA(會部署Recommender、Updater、Admission Controller三個組件)
./hack/vpa-up.sh

# 驗證VPA組件運行狀態
kubectl get pods -n kube-system | grep vpa
# 應該看到三個Pod:
# vpa-admission-controller-xxx  Running
# vpa-recommender-xxx      Running
# vpa-updater-xxx        Running

VPA配置示例:

# vpa-auto.yaml - 自動模式,VPA會自動調整Pod資源
apiVersion:autoscaling.k8s.io/v1
kind:VerticalPodAutoscaler
metadata:
name:php-apache-vpa
namespace:default
spec:
targetRef:
 apiVersion:apps/v1
 kind:Deployment
 name:php-apache
updatePolicy:
 # Auto: 自動重建Pod并應用推薦值
 # Recreate: 同Auto,只在Pod重建時應用
 # Initial: 只在Pod首次創建時應用
 # Off: 只推薦不執行,最安全
 updateMode:"Off"
resourcePolicy:
 containerPolicies:
 -containerName:php-apache
  minAllowed:
   cpu:100m
   memory:64Mi
  maxAllowed:
   cpu:2
   memory:2Gi
  controlledResources:["cpu","memory"]
  controlledValues:RequestsOnly
kubectl apply -f vpa-auto.yaml

# 等待幾分鐘后查看VPA推薦值
kubectl get vpa php-apache-vpa -o yaml

生產環境建議:VPA的updateMode先用Off,觀察推薦值是否合理,確認沒問題后再切到Auto。直接上Auto模式,VPA會重建Pod來應用新的資源配置,業務高峰期Pod被重建可能導致短暫不可用。

2.2.5 HPA與VPA混合使用

HPA和VPA不能同時基于CPU/內存指標工作,會互相打架。正確的混合方式:

# 方案一:VPA用Off模式,只看推薦值,HPA正常工作
# vpa-off-mode.yaml
apiVersion:autoscaling.k8s.io/v1
kind:VerticalPodAutoscaler
metadata:
name:web-app-vpa
namespace:production
spec:
targetRef:
 apiVersion:apps/v1
 kind:Deployment
 name:web-app
updatePolicy:
 updateMode:"Off"
---
# HPA正常配置
apiVersion:autoscaling/v2
kind:HorizontalPodAutoscaler
metadata:
name:web-app-hpa
namespace:production
spec:
scaleTargetRef:
 apiVersion:apps/v1
 kind:Deployment
 name:web-app
minReplicas:3
maxReplicas:30
metrics:
-type:Resource
 resource:
  name:cpu
  target:
   type:Utilization
   averageUtilization:60
# 方案二:VPA管內存,HPA基于自定義指標(不用CPU/內存)
# 這種方式VPA可以用Auto模式
apiVersion:autoscaling.k8s.io/v1
kind:VerticalPodAutoscaler
metadata:
name:web-app-vpa
namespace:production
spec:
targetRef:
 apiVersion:apps/v1
 kind:Deployment
 name:web-app
updatePolicy:
 updateMode:"Auto"
resourcePolicy:
 containerPolicies:
 -containerName:web-app
  controlledResources:["memory"]
  controlledValues:RequestsOnly
---
apiVersion:autoscaling/v2
kind:HorizontalPodAutoscaler
metadata:
name:web-app-hpa
namespace:production
spec:
scaleTargetRef:
 apiVersion:apps/v1
 kind:Deployment
 name:web-app
minReplicas:3
maxReplicas:30
metrics:
# 只用自定義指標,不用CPU/內存,避免和VPA沖突
-type:Pods
 pods:
  metric:
   name:http_requests_per_second
  target:
   type:AverageValue
   averageValue:"800"

2.3 啟動和驗證

2.3.1 HPA擴容壓測驗證

# 開一個終端持續觀察HPA狀態
kubectl get hpa php-apache-hpa -w

# 另開一個終端,用busybox發壓力
kubectl run -i --tty load-generator --rm --image=busybox:1.36 --restart=Never -- /bin/sh -c 
"while sleep 0.01; do wget -q -O- http://php-apache; done"

# 觀察HPA輸出,大約1-2分鐘后會看到:
# NAME       REFERENCE        TARGETS  MINPODS  MAXPODS  REPLICAS  AGE
# php-apache-hpa  Deployment/php-apache  248%/50%  2     20    2     5m
# php-apache-hpa  Deployment/php-apache  248%/50%  2     20    10     6m

# 停止壓力后,等待5分鐘(縮容穩定窗口),Pod數量會逐步縮回minReplicas

2.3.2 VPA推薦值驗證

# 查看VPA推薦值
kubectl get vpa php-apache-vpa -o jsonpath='{.status.recommendation}'| jq .

# 輸出示例:
# {
#  "containerRecommendations": [
#   {
#    "containerName": "php-apache",
#    "lowerBound": { "cpu": "100m", "memory": "64Mi" },
#    "target": { "cpu": "250m", "memory": "180Mi" },
#    "uncappedTarget": { "cpu": "250m", "memory": "180Mi" },
#    "upperBound": { "cpu": "500m", "memory": "300Mi" }
#   }
#  ]
# }
# target就是VPA推薦的資源配置值

2.3.3 驗證擴縮容事件

# 查看HPA相關事件
kubectl describe hpa php-apache-hpa

# 關注Events部分:
# Events:
#  Type  Reason       Age  From            Message
#  ----  ------       ---- ----            -------
#  Normal SuccessfulRescale 2m  horizontal-pod-autoscaler New size: 10; reason: cpu resource utilization above target

# 查看Pod擴縮容歷史
kubectl get events --field-selector reason=SuccessfulRescale --sort-by='.lastTimestamp'

三、示例代碼和配置

3.1 完整配置示例

3.1.1 生產級HPA完整配置

# 文件路徑:/opt/k8s/hpa/production-hpa.yaml
# 適用于生產環境的電商API服務HPA配置
apiVersion:autoscaling/v2
kind:HorizontalPodAutoscaler
metadata:
name:ecommerce-api-hpa
namespace:production
labels:
 app:ecommerce-api
 managed-by:hpa
annotations:
 # 記錄配置變更原因,方便審計
 kubernetes.io/change-cause:"初始HPA配置,目標CPU 60%,QPS 1200/pod"
spec:
scaleTargetRef:
 apiVersion:apps/v1
 kind:Deployment
 name:ecommerce-api
minReplicas:5
maxReplicas:100
metrics:
# 主指標:CPU利用率
-type:Resource
 resource:
  name:cpu
  target:
   type:Utilization
   averageUtilization:60
# 輔助指標:內存利用率(防止內存泄漏場景)
-type:Resource
 resource:
  name:memory
  target:
   type:Utilization
   averageUtilization:75
# 業務指標:每Pod每秒請求數
-type:Pods
 pods:
  metric:
   name:http_requests_per_second
  target:
   type:AverageValue
   averageValue:"1200"
# 業務指標:P99延遲(毫秒)
-type:Pods
 pods:
  metric:
   name:http_request_duration_p99_milliseconds
  target:
   type:AverageValue
   averageValue:"200"
behavior:
 scaleUp:
  stabilizationWindowSeconds:0
  policies:
  # 快速擴容:每15秒最多擴當前數量的100%
  -type:Percent
   value:100
   periodSeconds:15
  # 兜底:每15秒至少能擴5個Pod
  -type:Pods
   value:5
   periodSeconds:15
  selectPolicy:Max
 scaleDown:
  # 縮容穩定窗口10分鐘,比默認5分鐘更保守
  stabilizationWindowSeconds:600
  policies:
  # 慢速縮容:每60秒最多縮5%
  -type:Percent
   value:5
   periodSeconds:60
  selectPolicy:Min

3.1.2 VPA完整配置(Off模式+資源推薦腳本)

# 文件路徑:/opt/k8s/vpa/production-vpa.yaml
apiVersion:autoscaling.k8s.io/v1
kind:VerticalPodAutoscaler
metadata:
name:ecommerce-api-vpa
namespace:production
spec:
targetRef:
 apiVersion:apps/v1
 kind:Deployment
 name:ecommerce-api
updatePolicy:
 updateMode:"Off"
resourcePolicy:
 containerPolicies:
 -containerName:ecommerce-api
  minAllowed:
   cpu:200m
   memory:256Mi
  maxAllowed:
   cpu:4
   memory:8Gi
  controlledResources:["cpu","memory"]
  controlledValues:RequestsAndLimits
 # sidecar容器單獨設置策略
 -containerName:istio-proxy
  mode:"Off"
 -containerName:filebeat
  minAllowed:
   cpu:50m
   memory:64Mi
  maxAllowed:
   cpu:500m
   memory:512Mi

3.1.3 Prometheus Adapter完整配置

# 文件路徑:/opt/k8s/prometheus-adapter/values.yaml
# Helm values文件
prometheus:
url:http://prometheus-server.monitoring.svc
port:9090

replicas:2

resources:
requests:
 cpu:100m
 memory:128Mi
limits:
 cpu:500m
 memory:512Mi

rules:
default:false
custom:
# HTTP請求速率
-seriesQuery:'http_requests_total{namespace!="",pod!=""}'
 resources:
  overrides:
   namespace:{resource:"namespace"}
   pod:{resource:"pod"}
 name:
  matches:"^(.*)_total$"
  as:"${1}_per_second"
 metricsQuery:'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'
# HTTP P99延遲
-seriesQuery:'http_request_duration_seconds_bucket{namespace!="",pod!=""}'
 resources:
  overrides:
   namespace:{resource:"namespace"}
   pod:{resource:"pod"}
 name:
  as:"http_request_duration_p99_milliseconds"
 metricsQuery:'histogram_quantile(0.99, sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (le, <<.GroupBy>>)) * 1000'
# gRPC請求速率
-seriesQuery:'grpc_server_handled_total{namespace!="",pod!=""}'
 resources:
  overrides:
   namespace:{resource:"namespace"}
   pod:{resource:"pod"}
 name:
  matches:"^(.*)_total$"
  as:"${1}_per_second"
 metricsQuery:'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'
# 消息隊列積壓
-seriesQuery:'rabbitmq_queue_messages{namespace!="",queue!=""}'
 resources:
  template:"<<.Resource>>"
 name:
  matches:"^(.*)"
  as:"$1"
 metricsQuery:'<<.Series>>{<<.LabelMatchers>>}'
resource:
 cpu:
  containerQuery:'sum(rate(container_cpu_usage_seconds_total{<<.LabelMatchers>>}[3m])) by (<<.GroupBy>>)'
  nodeQuery:'sum(rate(container_cpu_usage_seconds_total{<<.LabelMatchers>>}[3m])) by (<<.GroupBy>>)'
  resources:
   overrides:
    namespace:{resource:"namespace"}
    node:{resource:"node"}
    pod:{resource:"pod"}
  containerLabel:container
 memory:
  containerQuery:'sum(container_memory_working_set_bytes{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
  nodeQuery:'sum(container_memory_working_set_bytes{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
  resources:
   overrides:
    namespace:{resource:"namespace"}
    node:{resource:"node"}
    pod:{resource:"pod"}
  containerLabel:container

3.2 輔助腳本

3.2.1 VPA推薦值采集腳本

#!/bin/bash
# 文件名:vpa-report.sh
# 功能:采集所有VPA推薦值并生成CSV報告,用于資源規劃
# 用法:./vpa-report.sh [namespace]

NAMESPACE=${1:-"--all-namespaces"}
OUTPUT_FILE="/tmp/vpa-report-$(date +%Y%m%d-%H%M%S).csv"

if["$NAMESPACE"="--all-namespaces"];then
  NS_FLAG="-A"
else
  NS_FLAG="-n$NAMESPACE"
fi

echo"Namespace,VPA Name,Container,Target CPU,Target Memory,Lower CPU,Lower Memory,Upper CPU,Upper Memory">"$OUTPUT_FILE"

kubectl get vpa$NS_FLAG-o json | jq -r'
 .items[] |
 .metadata.namespace as $ns |
 .metadata.name as $vpa |
 (.status.recommendation.containerRecommendations // [])[] |
 [$ns, $vpa, .containerName,
 (.target.cpu // "N/A"), (.target.memory // "N/A"),
 (.lowerBound.cpu // "N/A"), (.lowerBound.memory // "N/A"),
 (.upperBound.cpu // "N/A"), (.upperBound.memory // "N/A")]
 | @csv
'>>"$OUTPUT_FILE"

echo"VPA報告已生成:$OUTPUT_FILE"
echo"---"
column -t -s','"$OUTPUT_FILE"

3.2.2 HPA狀態巡檢腳本

#!/bin/bash
# 文件名:hpa-check.sh
# 功能:檢查所有HPA的健康狀態,發現異常HPA
# 用法:./hpa-check.sh

echo"========== HPA健康檢查 =========="
echo"檢查時間:$(date '+%Y-%m-%d %H:%M:%S')"
echo""

# 檢查指標獲取失敗的HPA
echo"--- 指標獲取失敗的HPA ---"
kubectl get hpa -A -o json | jq -r'
 .items[] |
 select(.status.conditions[]? | select(.type=="ScalingActive" and .status=="False")) |
 [.metadata.namespace, .metadata.name,
 (.status.conditions[] | select(.type=="ScalingActive") | .message)]
 | @tsv
'|whileIFS=$'	'read-r ns name msg;do
 echo"[異常]$ns/$name:$msg"
done

echo""

# 檢查已達到最大副本數的HPA(可能需要調大maxReplicas)
echo"--- 已達最大副本數的HPA ---"
kubectl get hpa -A -o json | jq -r'
 .items[] |
 select(.status.currentReplicas >= .spec.maxReplicas) |
 [.metadata.namespace, .metadata.name,
 (.status.currentReplicas | tostring), (.spec.maxReplicas | tostring)]
 | @tsv
'|whileIFS=$'	'read-r ns name current max;do
 echo"[警告]$ns/$name: 當前副本數$current已達上限$max,考慮調大maxReplicas"
done

echo""

# 檢查目標利用率遠低于閾值的HPA(可能資源浪費)
echo"--- 資源可能浪費的HPA(CPU利用率<20%且副本數>minReplicas)---"
kubectl get hpa -A -o json | jq -r'
 .items[] |
 select(.status.currentReplicas > .spec.minReplicas) |
 select(.status.currentMetrics[]? |
  select(.type=="Resource" and .resource.name=="cpu" and
     .resource.current.averageUtilization < 20)) |
? [.metadata.namespace, .metadata.name,
? ?(.status.currentMetrics[] | select(.type=="Resource" and .resource.name=="cpu") |
? ? .resource.current.averageUtilization | tostring),
? ?(.status.currentReplicas | tostring)]
? | @tsv
'?|?while?IFS=$'	'read?-r ns name cpu replicas;?do
? ??echo"[提示]?$ns/$name: CPU利用率僅?${cpu}%,當前?$replicas?副本,可能存在資源浪費"
done

echo""
echo"========== 檢查完成 =========="

3.3 實際應用案例

案例一:電商大促場景——基于QPS的預測性擴容

場景描述:電商平臺雙11大促,預計流量是平時的10倍。平時API服務5個Pod,每個Pod處理1200 QPS,總計6000 QPS。大促預計峰值60000 QPS。

實現方案

大促前1小時,手動將minReplicas調高到預估值,避免HPA擴容速度跟不上瞬時流量

# 大促前:提前擴容到預估值
kubectl patch hpa ecommerce-api-hpa -n production 
 --typemerge -p'{"spec":{"minReplicas":50}}'

# 確認Pod已擴到50
kubectl get deployment ecommerce-api -n production -w

大促期間HPA繼續工作,如果實際流量超過預估,HPA會繼續擴容到maxReplicas

# 實時監控HPA狀態
watch -n 5'kubectl get hpa ecommerce-api-hpa -n production'

大促結束后,逐步恢復minReplicas,不要一次性縮回去

# 大促結束2小時后,先縮到20
kubectl patch hpa ecommerce-api-hpa -n production 
 --typemerge -p'{"spec":{"minReplicas":20}}'

# 觀察1小時確認流量穩定后,縮回5
kubectl patch hpa ecommerce-api-hpa -n production 
 --typemerge -p'{"spec":{"minReplicas":5}}'

踩坑經驗:大促當天直接靠HPA自動擴容是不夠的。HPA從檢測到指標超標到Pod Ready,整個鏈路需要:指標采集間隔(15s)+ HPA計算間隔(15s)+ Pod調度(幾秒)+ 鏡像拉?。寸R像大小,可能30s-2min)+ 應用啟動(Java應用可能30s-1min)。加起來可能要2-3分鐘,大促開始瞬間的流量洪峰扛不住。所以必須提前手動擴容。

案例二:消息隊列消費者——基于隊列積壓深度自動擴縮

場景描述:訂單處理服務從RabbitMQ消費消息,正常情況下隊列深度保持在100以內。當上游突發大量訂單時,隊列積壓到幾萬條,需要自動擴消費者加速處理。

實現代碼

# order-consumer-hpa.yaml
apiVersion:autoscaling/v2
kind:HorizontalPodAutoscaler
metadata:
name:order-consumer-hpa
namespace:production
spec:
scaleTargetRef:
 apiVersion:apps/v1
 kind:Deployment
 name:order-consumer
minReplicas:2
maxReplicas:30
metrics:
# 基于隊列積壓深度:每個Pod分攤50條消息
-type:External
 external:
  metric:
   name:rabbitmq_queue_messages
   selector:
    matchLabels:
     queue:"order-processing"
  target:
   type:AverageValue
   averageValue:"50"
behavior:
 scaleUp:
  stabilizationWindowSeconds:0
  policies:
  -type:Pods
   value:5
   periodSeconds:30
  selectPolicy:Max
 scaleDown:
  # 隊列消費完后等10分鐘再縮,防止上游又來一波
  stabilizationWindowSeconds:600
  policies:
  -type:Pods
   value:2
   periodSeconds:60
  selectPolicy:Min

運行效果

# 正常狀態:隊列深度80,2個消費者,每個分攤40 < 50,不擴容
# 積壓狀態:隊列深度5000,2個消費者,每個分攤2500 > 50
# HPA計算:ceil(2 * 2500/50) = 100,但maxReplicas=30,所以擴到30
# 30個消費者處理,隊列深度快速下降
# 隊列清空后,等10分鐘穩定窗口,開始縮容,每分鐘縮2個

注意:消費者擴容時要確認下游數據庫能扛住。30個消費者同時寫庫,數據庫連接數和寫入壓力會暴增。建議消費者內部做限流或者用批量寫入。

案例三:Java應用VPA資源優化

場景描述:一個Spring Boot微服務,開發給的資源配置是requests: cpu 1, memory 2Gi,limits: cpu 2, memory 4Gi。實際運行后發現CPU平均使用率只有15%,內存穩定在800Mi左右。用VPA分析真實資源需求。

實現步驟

部署VPA(Off模式)

apiVersion:autoscaling.k8s.io/v1
kind:VerticalPodAutoscaler
metadata:
name:user-service-vpa
namespace:production
spec:
targetRef:
 apiVersion:apps/v1
 kind:Deployment
 name:user-service
updatePolicy:
 updateMode:"Off"
resourcePolicy:
 containerPolicies:
 -containerName:user-service
  minAllowed:
   cpu:100m
   memory:256Mi
  maxAllowed:
   cpu:4
   memory:8Gi

運行一周后查看推薦值

kubectl get vpa user-service-vpa -n production -o json | jq'.status.recommendation'
# 輸出:
# {
#  "containerRecommendations": [{
#   "containerName": "user-service",
#   "target": { "cpu": "350m", "memory": "900Mi" },
#   "lowerBound": { "cpu": "200m", "memory": "700Mi" },
#   "upperBound": { "cpu": "800m", "memory": "1200Mi" }
#  }]
# }

根據推薦值調整Deployment資源配置

# requests用target值,limits用upperBound的1.5倍留余量
kubectl patch deployment user-service -n production --type=json -p='[
 {"op":"replace","path":"/spec/template/spec/containers/0/resources","value":{
  "requests":{"cpu":"350m","memory":"900Mi"},
  "limits":{"cpu":"1200m","memory":"1800Mi"}
 }}
]'

優化效果

CPU requests從1000m降到350m,節省65%

內存requests從2Gi降到900Mi,節省56%

一個20副本的服務,每年節省的云資源費用約¥15000(按阿里云ECS計算)

四、最佳實踐和注意事項

4.1 最佳實踐

4.1.1 性能優化

合理設置HPA指標采集間隔:默認HPA每15秒計算一次,Metrics Server每15秒采集一次。如果業務流量變化極快(秒殺場景),可以調小Metrics Server的--metric-resolution到10s,但不要低于10s,否則kubelet壓力太大。

# 修改Metrics Server采集間隔
kubectl edit deployment metrics-server -n kube-system
# 將 --metric-resolution=15s 改為 --metric-resolution=10s

Pod啟動速度優化:HPA擴出來的Pod越快Ready越好。幾個關鍵優化點:

# 鏡像預拉取DaemonSet
apiVersion:apps/v1
kind:DaemonSet
metadata:
name:image-prepull
namespace:kube-system
spec:
selector:
 matchLabels:
  app:image-prepull
template:
 metadata:
  labels:
   app:image-prepull
 spec:
  initContainers:
  -name:prepull
   image:your-registry/ecommerce-api:latest
   command:["sh","-c","echo Image pulled"]
  containers:
  -name:pause
   image:registry.k8s.io/pause:3.9

使用小鏡像:Alpine基礎鏡像比Ubuntu小10倍,拉取時間從30s降到3s

預拉取鏡像:用DaemonSet在每個節點預拉取業務鏡像

配置合理的readinessProbe:initialDelaySeconds不要設太大,Java應用建議10-15s,Go應用3-5s

開啟Pod Topology Spread:避免新Pod全調度到同一個節點

縮容策略要保守:生產環境縮容穩定窗口建議設為600秒(10分鐘),縮容速率每分鐘不超過10%。見過太多次流量短暫下降觸發縮容,結果2分鐘后流量又上來了,Pod又要重新擴,來回折騰影響服務質量。

4.1.2 安全加固

設置合理的maxReplicas上限:maxReplicas一定要根據集群實際資源容量設置。一個3節點集群每節點32核128G,總共96核384G,如果每個Pod requests 1核2G,maxReplicas最多設到80左右(留一些給系統組件)。設成1000,HPA真擴到那個數,節點資源耗盡,所有Pod都會被驅逐。

# 檢查集群可分配資源
kubectl describe nodes | grep -A 5"Allocated resources"

RBAC權限控制:限制誰能修改HPA配置。生產環境HPA的minReplicas和maxReplicas修改應該走變更審批流程,不能隨便改。

# 限制HPA修改權限的Role
apiVersion:rbac.authorization.k8s.io/v1
kind:Role
metadata:
name:hpa-viewer
namespace:production
rules:
-apiGroups:["autoscaling"]
resources:["horizontalpodautoscalers"]
verbs:["get","list","watch"]
# 只有SRE團隊有修改權限
---
apiVersion:rbac.authorization.k8s.io/v1
kind:Role
metadata:
name:hpa-admin
namespace:production
rules:
-apiGroups:["autoscaling"]
resources:["horizontalpodautoscalers"]
verbs:["get","list","watch","create","update","patch","delete"]

PodDisruptionBudget配合HPA:HPA縮容時會刪Pod,配合PDB確保縮容過程中始終有足夠的Pod在運行。

apiVersion:policy/v1
kind:PodDisruptionBudget
metadata:
name:ecommerce-api-pdb
namespace:production
spec:
minAvailable:"60%"
selector:
 matchLabels:
  app:ecommerce-api

4.1.3 高可用配置

HPA本身的高可用:HPA Controller運行在kube-controller-manager中,跟隨控制平面高可用。多Master集群中只有Leader節點的controller-manager在工作,其他節點待命。不需要額外配置。

Metrics Server高可用:生產環境Metrics Server建議部署2個副本,配合PDB。

kubectl scale deployment metrics-server -n kube-system --replicas=2

備份策略:HPA和VPA配置都是K8s資源對象,跟隨etcd備份。建議同時在Git倉庫中維護一份YAML,用GitOps方式管理。

4.2 注意事項

4.2.1 配置注意事項

警告:以下幾個配置錯誤會導致嚴重生產事故,改之前務必確認。

Deployment必須設置resources.requests:沒有requests,HPA無法計算CPU/內存利用率百分比,會報FailedGetResourceMetric錯誤。這是最常見的HPA不工作原因。

HPA和VPA不要同時基于CPU/內存指標運行Auto模式:HPA說"CPU高了加Pod",VPA說"CPU高了加資源",兩個控制器互相打架,副本數和資源配置會反復震蕩。

minReplicas不要設為1:縮容到1個Pod,這個Pod掛了或者所在節點故障,服務直接中斷。生產環境最少設為2,核心服務設為3。

4.2.2 常見錯誤

錯誤現象 原因分析 解決方案
HPA顯示/50% Metrics Server未安裝或Pod沒設requests 安裝Metrics Server,給Pod加resources.requests
HPA TARGETS顯示正常但不擴容 當前指標值未超過目標值,或tolerance范圍內(默認10%) 確認指標值確實超過目標值的110%
HPA擴容后Pod一直Pending 集群資源不足,新Pod無法調度 擴容集群節點或配置Cluster Autoscaler
VPA推薦值一直為空 VPA Recommender未運行或數據采集時間不夠 檢查vpa-recommender Pod日志,等待至少8小時
VPA Auto模式Pod頻繁重啟 VPA每次調整資源都要重建Pod 設置PDB限制同時重建的Pod數量,或改用Off模式
自定義指標HPA報no matches for kind "ExternalMetric" Prometheus Adapter配置錯誤或未注冊API 檢查kubectl get apiservices中custom.metrics相關API狀態

4.2.3 兼容性問題

版本兼容:HPA v2 API在K8s 1.23 GA。1.18-1.22用autoscaling/v2beta2,1.18以下用autoscaling/v2beta1。升級集群后記得把HPA的apiVersion也改過來。

平臺兼容:各云廠商的托管K8s(EKS、AKS、GKE、ACK)都內置了Metrics Server,不需要手動安裝。但自定義指標擴縮需要自己部署Prometheus Adapter。

組件依賴:VPA和Cluster Autoscaler(CA)可以配合使用。VPA調大Pod資源后如果節點放不下,CA會自動擴節點。但要注意CA的擴節點速度(通常2-5分鐘),這段時間Pod會處于Pending狀態。

五、故障排查和監控

5.1 故障排查

5.1.1 日志查看

# 查看HPA Controller日志(在kube-controller-manager中)
kubectl logs -n kube-system $(kubectl get pods -n kube-system -l component=kube-controller-manager -o name | head -1) | grep -i"horizontal"

# 查看Metrics Server日志
kubectl logs -n kube-system -l k8s-app=metrics-server -f

# 查看VPA Recommender日志
kubectl logs -n kube-system -l app=vpa-recommender -f

# 查看VPA Updater日志
kubectl logs -n kube-system -l app=vpa-updater -f

# 查看Prometheus Adapter日志
kubectl logs -n monitoring -l app=prometheus-adapter -f

5.1.2 常見問題排查

問題一:HPA TARGETS顯示

# 第一步:確認Metrics Server是否正常
kubectl get apiservices | grep metrics
# 應該看到:v1beta1.metrics.k8s.io  kube-system/metrics-server  True

# 第二步:確認能獲取到Pod指標
kubectl top pods -n default
# 如果報錯,查看Metrics Server日志
kubectl logs -n kube-system -l k8s-app=metrics-server --tail=50

# 第三步:確認Pod有設置resources.requests
kubectl get deployment php-apache -o jsonpath='{.spec.template.spec.containers[0].resources}'

解決方案

Metrics Server未安裝 → 按2.1.2節安裝

Metrics Server連不上kubelet → 加--kubelet-insecure-tls參數

Pod沒設requests → 給Deployment加resources.requests

問題二:HPA擴容速度太慢,流量已經上來了Pod還沒擴夠

# 檢查HPA當前狀態和事件
kubectl describe hpa ecommerce-api-hpa -n production

# 檢查擴容策略配置
kubectl get hpa ecommerce-api-hpa -n production -o jsonpath='{.spec.behavior.scaleUp}'| jq .

解決方案

調整擴容策略,增大每次擴容的比例:

behavior:
scaleUp:
 stabilizationWindowSeconds:0
 policies:
 -type:Percent
  value:200# 每次最多擴到當前的3倍
  periodSeconds:15
 -type:Pods
  value:10 # 每次至少擴10個
  periodSeconds:15
 selectPolicy:Max

對于可預測的流量高峰,提前手動調高minReplicas

問題三:VPA Auto模式導致服務抖動

癥狀:VPA頻繁重建Pod,服務出現間歇性不可用

排查

# 查看VPA更新歷史
kubectl get events -n production --field-selector reason=EvictedByVPA --sort-by='.lastTimestamp'

# 查看VPA推薦值變化
kubectl get vpa -n production -o json | jq'.items[].status.recommendation'

解決

將updateMode改為Off,手動應用推薦值

如果必須用Auto,配置PDB限制同時驅逐的Pod數量

調大VPA的minAllowed和maxAllowed范圍,減少推薦值波動

5.1.3 調試模式

# 提高kube-controller-manager的HPA日志級別
# 編輯kube-controller-manager的啟動參數,加上:
# --v=4 (會輸出HPA的詳細計算過程)

# 查看HPA詳細計算過程
kubectl logs -n kube-system kube-controller-manager-master01 | grep -A 10"autoscaler"

# 手動觸發Metrics API查看原始指標數據
kubectl get --raw"/apis/metrics.k8s.io/v1beta1/namespaces/default/pods"| jq .

# 查看自定義指標原始數據
kubectl get --raw"/apis/custom.metrics.k8s.io/v1beta1/namespaces/production/pods/*/http_requests_per_second"| jq .

5.2 性能監控

5.2.1 關鍵指標監控

# 查看所有HPA狀態概覽
kubectl get hpa -A -o wide

# 查看特定HPA的詳細指標
kubectl get hpa ecommerce-api-hpa -n production -o yaml | grep -A 20"currentMetrics"

# 監控Pod資源使用率
kubectl top pods -n production --sort-by=cpu
kubectl top pods -n production --sort-by=memory

# 監控節點資源使用率(判斷是否需要擴節點)
kubectl top nodes

5.2.2 監控指標說明

指標名稱 正常范圍 告警閾值 說明
HPA當前副本數/最大副本數 < 80% >= 90% 接近上限說明可能需要調大maxReplicas
HPA目標指標達成率 90%-110% > 150% 持續5分鐘 指標持續超標說明擴容速度跟不上
Pod CPU利用率 40%-70% > 85% 持續3分鐘 利用率過高說明HPA目標值設太高
Pod內存利用率 50%-80% > 90% 接近limits會被OOMKill
Metrics Server延遲 < 1s > 5s 延遲過高會導致HPA決策滯后
VPA推薦值與實際值偏差 < 20% > 50% 偏差過大說明資源配置不合理

5.2.3 監控告警配置

# Prometheus告警規則:hpa-alerts.yaml
apiVersion:monitoring.coreos.com/v1
kind:PrometheusRule
metadata:
name:hpa-alerts
namespace:monitoring
spec:
groups:
-name:hpa.rules
 rules:
 # HPA已達最大副本數
 -alert:HPAMaxedOut
  expr:|
    kube_horizontalpodautoscaler_status_current_replicas
    ==
    kube_horizontalpodautoscaler_spec_max_replicas
  for:10m
  labels:
   severity:warning
  annotations:
   summary:"HPA{{ $labels.namespace }}/{{ $labels.horizontalpodautoscaler }}已達最大副本數"
   description:"當前副本數已達maxReplicas上限,持續10分鐘??紤]調大maxReplicas或優化服務性能。"

 # HPA無法獲取指標
 -alert:HPAScalingInactive
  expr:|
    kube_horizontalpodautoscaler_status_condition{condition="ScalingActive",status="false"} == 1
  for:5m
  labels:
   severity:critical
  annotations:
   summary:"HPA{{ $labels.namespace }}/{{ $labels.horizontalpodautoscaler }}無法獲取指標"
   description:"HPA ScalingActive條件為False,自動伸縮功能失效。檢查Metrics Server或Prometheus Adapter。"

 # HPA副本數為0(服務完全不可用)
 -alert:HPAReplicasZero
  expr:|
    kube_horizontalpodautoscaler_status_current_replicas == 0
  for:1m
  labels:
   severity:critical
  annotations:
   summary:"HPA{{ $labels.namespace }}/{{ $labels.horizontalpodautoscaler }}副本數為0"
   description:"服務副本數為0,服務完全不可用。立即檢查。"

 # CPU利用率持續過高
 -alert:HighCPUUtilization
  expr:|
    avg(rate(container_cpu_usage_seconds_total{container!="",pod!=""}[5m])) by (namespace, pod)
    /
    avg(kube_pod_container_resource_requests{resource="cpu"}) by (namespace, pod)
    > 0.9
  for:5m
  labels:
   severity:warning
  annotations:
   summary:"Pod{{ $labels.namespace }}/{{ $labels.pod }}CPU利用率超過90%"

 # Metrics Server不可用
 -alert:MetricsServerDown
  expr:|
    up{job="metrics-server"} == 0
  for:2m
  labels:
   severity:critical
  annotations:
   summary:"Metrics Server不可用,所有HPA將無法工作"

5.3 備份與恢復

5.3.1 備份策略

#!/bin/bash
# 文件名:backup-hpa-vpa.sh
# 功能:備份所有HPA和VPA配置到文件

BACKUP_DIR="/opt/k8s/backup/autoscaling/$(date +%Y%m%d)"
mkdir -p"$BACKUP_DIR"

# 備份所有HPA配置
echo"備份HPA配置..."
fornsin$(kubectl get hpa -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"
"}{end}'| sort -u);do
  mkdir -p"$BACKUP_DIR/hpa/$ns"
  kubectl get hpa -n"$ns"-o yaml >"$BACKUP_DIR/hpa/$ns/all-hpa.yaml"
done

# 備份所有VPA配置
echo"備份VPA配置..."
fornsin$(kubectl get vpa -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"
"}{end}'| sort -u);do
  mkdir -p"$BACKUP_DIR/vpa/$ns"
  kubectl get vpa -n"$ns"-o yaml >"$BACKUP_DIR/vpa/$ns/all-vpa.yaml"
done

# 備份Prometheus Adapter配置
echo"備份Prometheus Adapter配置..."
kubectl get configmap prometheus-adapter -n monitoring -o yaml >"$BACKUP_DIR/prometheus-adapter-config.yaml"2>/dev/null

echo"備份完成:$BACKUP_DIR"
ls -lR"$BACKUP_DIR"

5.3.2 恢復流程

確認當前狀態:kubectl get hpa,vpa -A

恢復HPA配置:kubectl apply -f /opt/k8s/backup/autoscaling/20260208/hpa/

恢復VPA配置:kubectl apply -f /opt/k8s/backup/autoscaling/20260208/vpa/

驗證恢復結果:kubectl get hpa,vpa -A確認所有資源已恢復

六、總結

6.1 技術要點回顧

HPA核心公式:desiredReplicas = ceil(currentReplicas * currentMetricValue / desiredMetricValue),理解這個公式就理解了HPA的所有行為

VPA生產用法:Off模式獲取推薦值 → 人工審核 → 手動調整資源配置,這是最穩妥的路徑

behavior策略:擴容用Max策略快速響應,縮容用Min策略平滑收縮,stabilizationWindowSeconds是防抖的關鍵參數

HPA+VPA混合:VPA設Off模式做資源顧問,HPA負責實際擴縮,兩者不要同時基于CPU/內存做Auto

6.2 進階學習方向

KEDA(Kubernetes Event-Driven Autoscaling):比原生HPA更靈活的事件驅動擴縮方案,支持從0縮放,內置50+觸發器(Kafka、RabbitMQ、Redis、Cron等)

項目地址:https://keda.sh

實踐建議:如果你的HPA主要基于消息隊列或外部指標擴縮,KEDA比Prometheus Adapter方案簡單很多

Cluster Autoscaler與HPA聯動:HPA擴Pod,CA擴節點,兩者配合實現完整的彈性伸縮鏈路

文檔:https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler

實踐建議:配置CA的擴容冷卻時間和縮容延遲,避免節點頻繁增減

Multidimensional Pod Autoscaler(MPA):Google內部使用的方案,同時做水平和垂直伸縮,社區有類似的開源實現

實踐建議:關注K8s社區SIG-Autoscaling的進展

6.3 參考資料

Kubernetes HPA官方文檔- HPA配置和算法詳解

VPA GitHub倉庫- VPA安裝和配置指南

Prometheus Adapter文檔- 自定義指標配置

KEDA官方文檔- 事件驅動自動伸縮

附錄

A. 命令速查表

# HPA操作
kubectl get hpa -A                  # 查看所有HPA
kubectl get hpa  -o wide            # 查看HPA詳情
kubectl describe hpa              # 查看HPA事件和狀態
kubectl autoscale deployment  --min=2 --max=10 --cpu-percent=50 # 快速創建HPA
kubectl patch hpa  --typemerge -p'{"spec":{"minReplicas":10}}'# 修改minReplicas
kubectl delete hpa               # 刪除HPA

# VPA操作
kubectl get vpa -A                  # 查看所有VPA
kubectl get vpa  -o jsonpath='{.status.recommendation}'| jq . # 查看推薦值
kubectl delete vpa               # 刪除VPA

# Metrics查看
kubectl top nodes                  # 節點資源使用
kubectl top pods -n  --sort-by=cpu       # Pod CPU排序
kubectl top pods -n  --sort-by=memory      # Pod內存排序
kubectl get --raw"/apis/metrics.k8s.io/v1beta1/pods"| jq . # 原始指標數據
kubectl get --raw"/apis/custom.metrics.k8s.io/v1beta1"| jq .# 自定義指標列表

B. 配置參數詳解

HPA behavior參數

參數 默認值 說明
scaleUp.stabilizationWindowSeconds 0 擴容穩定窗口,0表示立即擴容
scaleDown.stabilizationWindowSeconds 300 縮容穩定窗口,默認5分鐘
policies[].type - Pods(固定數量)或Percent(百分比)
policies[].value - 每次擴縮的數量或百分比
policies[].periodSeconds - 策略執行間隔,最小1秒,最大1800秒
selectPolicy Max Max取最大變更量,Min取最小變更量,Disabled禁止擴縮

VPA resourcePolicy參數

參數 說明
containerName 容器名,"*"表示所有容器
mode Auto(自動調整)或Off(不調整該容器)
minAllowed 最小資源限制,VPA推薦值不會低于此值
maxAllowed 最大資源限制,VPA推薦值不會高于此值
controlledResources 控制哪些資源,可選cpu、memory
controlledValues RequestsOnly(只調requests)或RequestsAndLimits(同時調)

C. 術語表

術語 英文 解釋
水平伸縮 Horizontal Scaling 通過增減Pod副本數來調整服務容量
垂直伸縮 Vertical Scaling 通過調整單個Pod的CPU/內存配額來調整服務容量
穩定窗口 Stabilization Window HPA在做擴縮決策前等待的時間窗口,用于防止指標抖動導致頻繁擴縮
指標服務器 Metrics Server K8s集群級資源指標聚合器,提供CPU和內存使用數據
推薦器 Recommender VPA組件,分析歷史資源使用數據并生成資源推薦值
更新器 Updater VPA組件,負責驅逐需要更新資源配置的Pod
準入控制器 Admission Controller VPA組件,在Pod創建時注入推薦的資源配置
自定義指標 Custom Metrics 用戶自定義的業務指標,如QPS、隊列深度等,通過Prometheus Adapter暴露給K8s

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11277

    瀏覽量

    224956
  • 內存
    +關注

    關注

    9

    文章

    3209

    瀏覽量

    76358
  • kubernetes
    +關注

    關注

    0

    文章

    263

    瀏覽量

    9494

原文標題:從流量突增到資源優化:Kubernetes HPA+VPA 實戰指南

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Kubernetes Helm入門指南

    Helm 是 Kubernetes 的包管理工具,它允許開發者和系統管理員通過定義、打包和部署應用程序來簡化 Kubernetes 應用的管理工作。Helm 的出現是為了解決在 Kubernetes
    的頭像 發表于 04-30 13:42 ?3084次閱讀
    <b class='flag-5'>Kubernetes</b> Helm入門<b class='flag-5'>指南</b>

    ARDUINO開發實戰指南

    ARDUINO開發實戰指南
    發表于 09-21 05:40

    阿里云容器Kubernetes監控(二) - 使用Grafana展現Pod監控數據

    kubernetes中承擔的責任遠不止監控數據的采集,還包括控制臺的監控接口、HPA的POD彈性伸縮等都依賴于Heapster的功能。簡介在kubernetes的監控方案中
    發表于 05-10 15:28

    物聯網實戰指南

    物聯網實戰指南
    發表于 02-23 10:50

    如何部署基于Mesos的Kubernetes集群

    的內核。把Kubernetes運行在Mesos集群之上,可以和其他的框架共享集群資源,提高集群資源的利用率。 本文是Kubernetes和Mesos集成指南系列文章第一篇:實戰部署。
    發表于 10-09 18:04 ?0次下載
    如何部署基于Mesos的<b class='flag-5'>Kubernetes</b>集群

    樹莓派(Raspberry Pi)實戰指南.pdf

    樹莓派實戰指南
    發表于 05-07 15:17 ?130次下載

    Kubernetes云平臺的彈性伸縮實現方案

    解決該問題,設計一種基于 Kubernetes云平臺的彈性伸縮方案。該方案通過集成 Prometheus監控系統來自定義指標與采集業務指標,并結合HPA、VPA等組件,實現包括自定義指標和不同維度伸縮方法相結合的最佳彈性伸縮方法
    發表于 03-11 16:32 ?11次下載
    <b class='flag-5'>Kubernetes</b>云平臺的彈性伸縮實現方案

    Kubernetes入門指南電子版下載

    Kubernetes入門指南電子版下載
    發表于 07-12 10:05 ?0次下載

    arduino開發實戰指南

    arduino開發實戰指南
    發表于 02-22 14:56 ?0次下載

    K8S(kubernetes)學習指南

    K8S(kubernetes)學習指南
    發表于 06-29 14:14 ?0次下載

    VPA2000 數據表

    VPA2000 數據表
    發表于 04-18 19:31 ?0次下載
    <b class='flag-5'>VPA</b>2000 數據表

    VPA1000 數據表

    VPA1000 數據表
    發表于 04-19 19:47 ?0次下載
    <b class='flag-5'>VPA</b>1000 數據表

    STM32庫開發實戰指南

    STM32庫開發實戰指南-劉火良,電子 epub格式,清晰非掃描
    發表于 10-27 16:25 ?26次下載

    emWin 實戰指南

    電子發燒友網站提供《emWin 實戰指南.pdf》資料免費下載
    發表于 12-22 11:03 ?6次下載

    LwIP應用開發實戰指南—基于野火STM32

    LwIP應用開發實戰指南—基于野火STM32—20210122
    發表于 01-17 14:34 ?9次下載