侧边栏壁纸
博主头像
J&S Blog

顺着一路星光,去往有你的嘉处

  • 累计撰写 14 篇文章
  • 累计创建 5 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

HPA与VPA

Administrator
2026-05-24 / 0 评论 / 0 点赞 / 4 阅读 / 0 字

水平自动扩缩容(HPA)

image-20251227205730500.png

HPA是Kubernetes中的水平自动扩缩器,通过增减Pod副本数来应对工作负载变化。

HPA的工作原理

HPA通过监控目标Pod的某些指标(如CPU使用率、内存使用率或自定义指标)来决定是否需要增加或减少Pod的数量。其基本工作流程如下:

  1. 监控指标收集:依赖 Kubernetes Metrics Server(或 Prometheus 等后端)收集Pod的指标数据。

  2. 指标分析:HPA控制器定期查询这些指标,并根据预设的目标利用率(如CPU利用率目标设为50%)计算所需的Pod数量。

  3. Pod数量调整:如果当前Pod的平均指标利用率高于或低于目标值,HPA将触发Pod的扩展或缩减操作,通过调整ReplicaSet或Deployment的副本数来实现。

示例

#deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-test
  name: nginx-test
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 100m
            memory: 50Mi
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-svc
  name: nginx-svc
spec:
  ports:
  - name: 80-80
    nodePort: 30020
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-test
  type: NodePort
  
#HPA
apiVersion: autoscaling/v2         
kind: HorizontalPodAutoscaler     
metadata:
  name: nginx-hpa                 
  namespace: default              
spec:
  scaleTargetRef:                 #控制的目标资源
    apiVersion: apps/v1           #目标资源的API版本
    kind: Deployment              #目标资源的类型
    name: nginx                   #目标资源的名称(必须与Deployment名称一致)
  minReplicas: 3                  #最少保留的Pod数量
  maxReplicas: 100                #最多允许的Pod数量
  metrics:                        #依据哪些指标进行扩缩容决策
  - type: Resource                #资源指标
    resource:
      name: cpu                   #监控CPU
      target:
        type: Utilization         #平均利用率
        averageUtilization: 50    #当平均CPU利用率超过50%时触发扩容
  - type: Resource                
    resource:
      name: memory                #监控内存
      target:
        type: AverageValue        #平均使用值
        averageValue: 200Mi       #当平均内存利用值超过200Mi时触发扩容
满足任意一个指标,就会触发hpa自动扩容
               
#压测前的状态
[root@master01 yaml]# kubectl get hpa,pod
NAME                                            REFERENCE               TARGETS                              MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/nginx-hpa   Deployment/nginx-test   cpu: 0%/50%, memory: 4814848/200Mi   3         100       3          6s
​
NAME                              READY   STATUS    RESTARTS   AGE
pod/nginx-test-5496f4c54d-d6j5s   1/1     Running   0          2m45s
pod/nginx-test-5496f4c54d-g69zr   1/1     Running   0          20s
pod/nginx-test-5496f4c54d-jqln4   1/1     Running   0          2m45s
​
#进行压测
[root@master01 yaml]# ab -c 1000 -n 1000000 http://192.168.135.150:30020/
-c  并发数
-n  请求总数
​
#从3个直接扩容到了11个
[root@master01 yaml]# kubectl get pod,hpa
NAME                              READY   STATUS    RESTARTS   AGE
pod/nginx-test-5496f4c54d-8pc92   1/1     Running   0          3m40s
pod/nginx-test-5496f4c54d-d6j5s   1/1     Running   0          7m20s
pod/nginx-test-5496f4c54d-g69zr   1/1     Running   0          4m55s
pod/nginx-test-5496f4c54d-jqln4   1/1     Running   0          7m20s
pod/nginx-test-5496f4c54d-kxpnj   1/1     Running   0          3m40s
pod/nginx-test-5496f4c54d-n8k8m   1/1     Running   0          3m25s
pod/nginx-test-5496f4c54d-ndsk2   1/1     Running   0          3m40s
pod/nginx-test-5496f4c54d-sb4zj   1/1     Running   0          3m40s
pod/nginx-test-5496f4c54d-sq7sb   1/1     Running   0          3m25s
pod/nginx-test-5496f4c54d-tq989   1/1     Running   0          3m25s
pod/nginx-test-5496f4c54d-wqsp4   1/1     Running   0          3m25s
​
NAME                                            REFERENCE               TARGETS                                   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/nginx-hpa   Deployment/nginx-test   cpu: 23%/50%, memory: 5290542545m/200Mi   3         100       11         4m41s
​
#停止压测后缩容到3个
​

Behavior行为策略

在Kubernetes中,HPA(Horizontal Pod Autoscaler)是一个用于根据资源使用情况自动调整Pod副本数量的工具。HPA的Behavior字段允许我们对扩缩容行为进行更精细的控制,尤其是在scaleUp(扩容)和scaleDown(缩容)策略的配置上。

Behavior字段是在Kubernetes 1.18版本中引入的,它可以定义HPA在执行扩缩容时的行为策略。Behavior字段包含两个主要部分:scaleUp和scaleDown,分别用于控制扩容和缩容的行为。通过配置这些策略,可以调整HPA的反应速度、稳定性以及对资源变化的敏感性。

scaleUp策略配置

scaleUp部分定义了HPA在需要扩容时的行为。以下是scaleUp策略的核心配置项:

  1. policies(策略) 这是用来定义扩容行为的规则列表。每个策略包含两个参数:

    type: 策略类型,可以是Pods或Percent。Pods表示每次扩容固定的Pod数量,而Percent表示每次扩容当前Pod数量的百分比。

    value: 策略的值,即每次扩容的Pod数量或百分比。

  2. selectPolicy(选择策略) 它决定了如何从多个策略中选择执行。可选值为:

    Max: 选择扩容量最大的策略。

    Min: 选择扩容量最小的策略。

    Disabled: 完全禁用扩容。

  3. stabilizationWindowSeconds(稳定时间窗口) 这段时间内,HPA会观察资源使用情况,避免频繁扩容。默认情况下,Kubernetes会基于历史数据自动调整这个值。

scaleDown策略配置

scaleDown部分用于定义HPA在需要缩容时的行为。与scaleUp类似,scaleDown也有以下几个核心配置项:

  1. policies(策略) 定义缩容行为的规则列表。每个策略同样包含type和value参数。

  2. selectPolicy(选择策略) 决定如何从多个策略中选择执行。可选值与scaleUp相同。

  3. stabilizationWindowSeconds(稳定时间窗口) 这段时间内,HPA会观察资源使用情况,避免频繁缩容。缩容的默认稳定时间窗口为5分钟。

示例

apiVersion: autoscaling/v2         
kind: HorizontalPodAutoscaler     
metadata:
  name: nginx-hpa                 
  namespace: default              
spec:
  scaleTargetRef:                 #控制的目标资源
    apiVersion: apps/v1           #目标资源的API版本
    kind: Deployment              #目标资源的类型
    name: nginx                   #目标资源的名称(必须与Deployment名称一致)
  minReplicas: 3                  #最少保留的Pod数量
  maxReplicas: 100                #最多允许的Pod数量
  metrics:                        #依据哪些指标进行扩缩容决策
  - type: Resource                #资源指标
    resource:
      name: cpu                   #监控CPU
      target:
        type: Utilization         #平均利用率
        averageUtilization: 50    #当平均CPU利用率超过50%时触发扩容
  - type: Resource                
    resource:
      name: memory                #监控内存
      target:
        type: AverageValue        #平均使用值
        averageValue: 200Mi       #当平均内存利用值超过200Mi时触发扩容
  behavior:                       #扩缩容行为策略(定义 HPA 如何调整副本数)
    scaleUp:                      #扩容策略配置
      policies:                   #扩容规则列表
      - type: Pods                #规则类型(按Pod数量)
        value: 4                  #每次最多增加 4 个 Pod
        periodSeconds: 15         #每 15 秒执行一次该策略(执行周期)
      - type: Percent             #规则类型(按百分比)
        value: 10                 #规则值(每次最多增加当前副本数的 10%)
        periodSeconds: 60         #执行周期(每 60 秒执行一次该策略)
      selectPolicy: Max           #选择策略
      stabilizationWindowSeconds: 0  #稳定窗口期(扩容时为 0 秒,即立即执行)默认为0秒
在这个示例中,HPA会在前15秒内尝试一次扩容4个Pod,而在60秒内尝试扩容当前Pod数量的10%。最终,HPA会选择扩容量更大的策略。
也就是说,HPA 每 15 秒最多允许增加 4 个 Pod;每 60 秒最多允许增加当前副本数的 10%。HPA会选择扩容数量最大的策略来执行。
    scaleDown:                       #缩容策略配置
      policies:                      #缩容规则列表
      - type: Percent                #规则类型(按百分比)
        value: 10                    #规则值(每次最多减少当前副本数的 10%)
        periodSeconds: 60            #执行周期(每 60 秒执行一次该策略)
      - type: Pods                   #规则类型(按 Pod 数量)
        value: 2                     #规则值(每次最多减少 2 个Pod)
        periodSeconds: 120           #执行周期(每 120 秒执行一次该策略)
      selectPolicy: Min              #选择策略
      stabilizationWindowSeconds: 300  #稳定窗口期(缩容时为 300 秒,防止在流量波动时频繁缩容)默认为300秒
在这个示例中,HPA会在60秒内尝试缩容当前Pod数量的10%,或在120秒内尝试缩容2个Pod。最终,HPA会选择缩容量更小的策略。
      
#压测前的状态
[root@master01 yaml]# kubectl get hpa,pod
NAME                                            REFERENCE               TARGETS                                  MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/nginx-hpa   Deployment/nginx-test   cpu: 0%/50%, memory: 5278378666m/200Mi   3         100       3          31s
​
NAME                              READY   STATUS    RESTARTS   AGE
pod/nginx-test-5496f4c54d-d6j5s   1/1     Running   0          38m
pod/nginx-test-5496f4c54d-ndsk2   1/1     Running   0          34m
pod/nginx-test-5496f4c54d-sq7sb   1/1     Running   0          34m
​
​
#进行压测
[root@master01 yaml]# ab -c 1000 -n 1000000 http://192.168.135.150:30020/
​
#由3个扩到了7个
[root@master01 yaml]# kubectl get hpa,pod
NAME                                            REFERENCE               TARGETS                                    MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/nginx-hpa   Deployment/nginx-test   cpu: 130%/50%, memory: 6703786666m/200Mi   3         100       7          105s
​
NAME                              READY   STATUS    RESTARTS   AGE
pod/nginx-test-5496f4c54d-d6j5s   1/1     Running   0          39m
pod/nginx-test-5496f4c54d-l2ffh   1/1     Running   0          14s
pod/nginx-test-5496f4c54d-ndsk2   1/1     Running   0          36m
pod/nginx-test-5496f4c54d-rv4xr   1/1     Running   0          15s
pod/nginx-test-5496f4c54d-sq7sb   1/1     Running   0          35m
pod/nginx-test-5496f4c54d-v9d6h   1/1     Running   0          14s
pod/nginx-test-5496f4c54d-zf82m   1/1     Running   0          15s
​
​
#再由7个扩到了12个
[root@master01 yaml]# kubectl get hpa,pod
NAME                                            REFERENCE               TARGETS                               MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/nginx-hpa   Deployment/nginx-test   cpu: 14%/50%, memory: 5154816/200Mi   3         100       12         4m3s
​
NAME                              READY   STATUS    RESTARTS   AGE
pod/nginx-test-5496f4c54d-7ztfm   1/1     Running   0          2m17s
pod/nginx-test-5496f4c54d-clvtq   1/1     Running   0          92s
pod/nginx-test-5496f4c54d-d6j5s   1/1     Running   0          42m
pod/nginx-test-5496f4c54d-f72v9   1/1     Running   0          92s
pod/nginx-test-5496f4c54d-l2ffh   1/1     Running   0          2m32s
pod/nginx-test-5496f4c54d-ndsk2   1/1     Running   0          38m
pod/nginx-test-5496f4c54d-q88jp   1/1     Running   0          2m17s
pod/nginx-test-5496f4c54d-rv4xr   1/1     Running   0          2m33s
pod/nginx-test-5496f4c54d-sq7sb   1/1     Running   0          38m
pod/nginx-test-5496f4c54d-v9d6h   1/1     Running   0          2m32s
pod/nginx-test-5496f4c54d-w5qdh   1/1     Running   0          2m17s
pod/nginx-test-5496f4c54d-zf82m   1/1     Running   0          2m33s
​
​
​
#停止压测后缩容到3个
​

加入behavior 行为策略后,HPA是如何工作的:

假设你的应用当前有 10 个 Pod,突然流量暴增,HPA 计算出理论上需要扩容到 20 个 Pod(即需要增加 10 个 Pod)。

此时,behavior 策略会介入,限制这个“一步到位”的冲动:

1. 检查策略一:Pods策略

规则:- type: Pods, value: 4, periodSeconds: 15

含义:在任意连续的 15 秒内,最多只能扩容 4 个 Pod。

计算:理论上要加 10 个,但该策略限制最多只能加 4 个。所以这条策略建议扩容 4 个。

2. 检查策略二:Percent策略

规则:- type: Percent, value: 10, periodSeconds: 60

含义:在任意连续的 60 秒内,最多只能扩容当前副本数(10个)的 10%,也就是 1 个 Pod。

计算:理论上要加 10 个,但该策略限制最多只能加 1 个。所以这条策略建议扩容 1 个。

3. 决策:selectPolicy: Max

逻辑:既然有两个限制,那么需要选择哪一个?Max 表示选择限制最宽松(即允许扩容数量更多)的那个。

结果:策略一允许加 4 个,策略二允许加 1 个。HPA 选择 4 个。

注意事项

Metrics Server 必须正常运行,HPA需要实时监控 Pod 的资源使用情况来决定是否扩容或缩容。这个数据是通过 Kubernetes 的 Metrics API 提供的。

HPA 的核心定位是 “自动扩缩容控制器”,作用是根据监控指标(如 CPU、内存、自定义指标)动态调整“工作负载控制器”的 Pod 副本数,它本身不直接管理 Pod,而是“控制工作负载控制器的 replicas 字段”。

不可以在DaemonSet使用,因为HPA根据指标(CPU、内存或自定义指标)动态调整 Pod 副本数,DaemonSet需要 确保每个符合条件的节点上运行且只运行一个 Pod副本,它的副本数是由集群中的节点数量决定的,而不是由负载决定的。

垂直自动扩缩容(VPA)

c789bf5ab509220c729dac5f41f019e3.png

VPA(Vertical Pod Autoscaler)是 Kubernetes 中一个垂直自动扩缩容工具,用于自动调整Pod的资源请求和限制,可以根据容器的CPU和内存使用率自动调整其资源请求。如果某个容器当前的CPU或内存使用率较低,VPA可以减小其资源请求,从而释放不必要的资源;反之,如果某个容器当前的CPU或内存使用率较高,VPA可以增加其资源请求,以满足应用的性能需求。这种自动调整机制能够在满足应用需求的同时,最大限度地提高资源利用率。

可以调整所有能通过控制器(如 Deployment、StatefulSet、DaemonSet、Job 等)生成 Pod 的工作负载资源。

VPA 的工作原理

VPA 通过监控目标 Pod 的资源使用情况(如 CPU 和内存的实际占用),自动调整 Pod 的 resources.requests配置,从而让 Pod 获得更合适的计算资源。

1. 监控指标收集

与 HPA 类似,VPA 同样依赖 Kubernetes Metrics Server(或 Prometheus 等后端)来收集 Pod 的实时资源使用指标。它重点关注 Pod 的 CPU 和内存实际使用量,并结合历史数据(包括 OOM 事件)进行分析。

2. 资源推荐计算

VPA Recommender(推荐引擎)组件会定期分析收集到的指标数据。它会计算出一个“理想”的资源请求值(Requests):

如果当前 Pod 经常跑满 CPU 或内存,Recommender 会建议增加资源请求。

如果当前 Pod 资源申请了很多(Requests很高)但实际用得很少,Recommender 会建议减少资源请求。

3. Pod 资源调整

这是 VPA 与 HPA 最大的区别所在。Kubernetes 不允许直接修改正在运行的 Pod 的资源限制,因此 VPA 的调整策略通常涉及 Pod 的重建:

  • 驱逐(Eviction)VPA Updater(更新器) 组件发现推荐值与当前 Pod 的资源配置差异较大时,会向 API Server 发出请求,驱逐(删除) 该 Pod。

  • 重建(Recreation):Pod 的控制器(如 Deployment)检测到 Pod 被删除后,会立即创建一个新的 Pod。

  • 注入(Injection):在新 Pod 创建的瞬间,VPA Admission Controller(准入控制器) 会拦截创建请求,并将 Recommender 计算出的最新资源推荐值“注入”到新 Pod 的定义中。

主要组件

  1. Recommender

分析Pod历史资源使用情况

计算资源推荐值

基于历史数据和配置策略(如安全边界)提供建议

  1. Updater

检查Pod是否需要调整资源

驱逐需要更新的Pod(触发重启)

仅在Auto工作模式下活跃

  1. Admission Controller

拦截Pod创建请求

应用Initial模式的推荐值

修改Pod的资源规格

VPA的更新策略

VPA会根据Pod的实际使用情况,动态调整其CPU和内存的requests和limits避免资源过度分配或不足

四种工作模式:

  1. Inittial

仅在Pod创建时修改资源请求,以后都不修改

  1. Auto

默认策略,在Pod创建和更新时都会修改资源请求,并且在Pod更新时也会修改

  1. Recreate

    不仅会在Pod创建时应用推荐值,也会在运行时自动驱逐并重建Pod以应用新推荐,与Auto类似,但它比Auto模式更加直接

  2. Off

    不改变Pod的资源请求,不过会在VPA中设置资源的推荐值

Auto与Recreate的区别:

Auto:优先原地改,改不了再重建,Pod的IP地址可能会保留

Recreate:只要推荐值变了就重建,Pod的IP地址一定发生变化

安装VPA组件

#克隆代码
[root@master01 ~]# git clone https://github.com/kubernetes/autoscaler.git
​
#切换目录
[root@master01 ~]# cd autoscaler/vertical-pod-autoscaler/deploy/
​
#修改镜像的拉取策略和拉取地址
[root@master01 deploy]# sed -i 's/imagePullPolicy: Always/imagePullPolicy: IfNotPresent/g' ./*
[root@master01 deploy]# sed -i "s/registry.k8s.io\/autoscaling/uhub.service.ucloud.cn\/zgs_k8s/g" ./*
​
#切换目录
[root@master01 deploy]# cd ../hack/
​
#运行脚本启动容器
[root@master01 hack]# ./vpa-up.sh

示例

#部署一个deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-test
  name: nginx-test
spec:
  replicas: 2       #副本数建议大于1
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
        resources:          #VPA主要调整requests,limits可以独立设置
          requests:
            cpu: 100m
            memory: 50Mi
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-svc
  name: nginx-svc
spec:
  ports:
  - name: 80-80
    nodePort: 30020
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-test
  type: NodePort
​
​
#部署VPA
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: nginx-vpa-off
  namespace: default
spec:
  targetRef:                #指定VPA要管理的目标工作负载
    apiVersion: "apps/v1"   #负载的API版本
    kind: Deployment        #负载的类型
    name: nginx-test        #目标Deployment的名称
  updatePolicy:             #定义VPA的工作模式
    updateMode: "Off"       #工作模式为Off,仅监控不会自动调整,但是会给出推荐值
    #minReplicas: 2          #保持至少2个副本可用
  resourcePolicy:           #定义资源调整的策略和限制
    containerPolicies:      #策略配置
    - containerName: "nginx"    #指定要应用策略的容器名称,必须与Pod中容器名匹配
      #controlledResources: ["cpu", "memory"]   #同时调整CPU和内存(也就是控制调整哪些资源)
      #controlledValues: "RequestsAndLimits"    #控制调整什么值,指的是Pod中的resources
                                                    #RequestsOnly   只调整requests,不改变limits
                                                    #RequestsAndLimits  requests和limits同时调整
                                                    #LimitsOnly 只调整limits
      minAllowed:               #允许的最小资源限制,VPA不会推荐低于此值的资源
        cpu: "250m"             #最小CPU限制
        memory: "100Mi"         #最小内存限制
      maxAllowed:               #允许的最大资源限制
        cpu: "2000m"            #最大CPU限制
        memory: "2048Mi"        #最大内存限制
​
注意:
在Kubernetes中,当容器使用的内存超过其limits限制时,会被杀死,所以不建议使用“LimitsOnly”,但是容器使用的CPU超过limits限制时是不会被杀死的,而是响应速度会变慢
       
#查看VPA状态
[root@master01 yaml]# kubectl get vpa
NAME            MODE   CPU    MEM     PROVIDED   AGE
nginx-vpa-off   Off    250m   250Mi   True       15s
​
NAME:       nginx-vpa-off       VPA资源的名称
MODE:       Off                 工作模式为"仅监控",不会自动调整
CPU:        250m                当前推荐的CPU值(250毫核,0.25个核心)
MEM:        250Mi               当前推荐的内存值(250兆字节)
PROVIDED:   True                VPA已为Pod提供了资源推荐
AGE:        15s                 VPA创建了15秒
​
#进行压测
[root@master01 ~]# ab -c 1000 -n 1000000 http://192.168.135.150:30020/
​
#查看VPA和POD的状态
[root@master01 ~]# kubectl top pod 
NAME                          CPU(cores)   MEMORY(bytes)   
nginx-test-5496f4c54d-wsmt2   362m         12Mi
​
#VPA的CPU推荐值发生变化,但是Pod没有重启
[root@master01 yaml]# kubectl get vpa
NAME            MODE   CPU    MEM     PROVIDED   AGE
nginx-vpa-off   Off    442m   250Mi   True       19m
​
#pod资源状况
[root@master01 yaml]# kubectl describe pod nginx-test-5496f4c54d-wsmt2 | grep -A 2 -i requests
    Requests:
      cpu:        100m
      memory:     50Mi
​
#Auto模式
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: nginx-vpa-auto
  namespace: default
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: nginx-test
  updatePolicy:
    updateMode: "Auto"      #改为Auto
  resourcePolicy:
    containerPolicies:
    - containerName: "nginx"
      minAllowed:
        cpu: "250m"
        memory: "100Mi"
      maxAllowed:
        cpu: "2000m"
        memory: "2048Mi"
​
#压测之前Pod的IP为173.28.243.202和173.28.243.201,CPU为100m,内存为50Mi
[root@master01 yaml]# kubectl get pod -owide
NAME                          READY   STATUS    RESTARTS   AGE   IP               NODE                 NOMINATED NODE   READINESS GATES
nginx-test-5496f4c54d-dx2jh   1/1     Running   0          3s    173.16.0.202     node02.example.com   <none>           <none>
nginx-test-5496f4c54d-n6bcr   1/1     Running   0          3s    173.28.243.201   node01.example.com   <none>           <none>
​
​
[root@master01 yaml]# kubectl describe pod nginx-test-5496f4c54d-dx2jh nginx-test-5496f4c54d-n6bcr | grep -A 2 -i requests
    Requests:
      cpu:        100m
      memory:     50Mi
--
    Requests:
      cpu:        100m
      memory:     50Mi
​
#进行压测
[root@master01 ~]# ab -c 1000 -n 1000000 http://192.168.135.150:30020/
​
#IP和名称发生改变,说明Pod被驱逐重建
[root@master01 yaml]# kubectl get pod -owide
NAME                          READY   STATUS    RESTARTS   AGE   IP               NODE                 NOMINATED NODE   READINESS GATES
nginx-test-5496f4c54d-d85m6   1/1     Running   0          95s   173.16.0.203     node02.example.com   <none>           <none>
nginx-test-5496f4c54d-ljj45   1/1     Running   0          34s   173.28.243.202   node01.example.com   <none>           <none>
​
​
#查看资源,CPU从100m扩容到了476m,内存扩容到了250Mi
[root@master01 yaml]# kubectl describe pod nginx-test-5496f4c54d-d85m6 nginx-test-5496f4c54d-ljj45 | grep -A 2 -i requests
    Requests:
      cpu:        476m
      memory:     250Mi
--
    Requests:
      cpu:        476m
      memory:     250Mi

注意事项

VPA 在 Auto 模式下工作时,需要驱逐旧的 Pod 来强制应用新的资源配置,为了防止集群服务中断,VPA 组件内部有一个默认的安全检查机制。

如果工作负载的副本数 小于 2(也就是只有 1 个副本),VPA 默认会拒绝执行驱逐操作,或者仅仅停留在推荐阶段而不实际修改 Pod。这是因为 VPA 遵循“滚动更新”的原则:比如你有两个副本,杀掉一个 Pod 进行垂直扩容/缩容时,另一个 Pod 还能继续提供服务。

VPA 的推荐值可能会超出可用资源(例如CPU\内存可用大小、可用配额)并导致Pod 处于挂起状态。

总结

维度

HPA (Horizontal Pod Autoscaler)

VPA (Vertical Pod Autoscaler)

中文名称

水平 Pod 自动扩缩器

垂直 Pod 自动扩缩器

核心动作

增减 Pod 数量

调整 Pod 规格

适用场景

应对流量洪峰,分担负载

优化资源配置,节省资源/防止 OOM

调整方式

修改 Deployment 的 副本数量

主要修改 Pod 的 requests预留资源

副作用

副本数变多,整体资源消耗增加

Pod 会重启 (因为需要重建生效)

底层逻辑

一个不够,就开十个

一个不够,就给它升级配置

0
博主关闭了所有页面的评论