K8s HPA(自动伸缩)解读

 更新时间:2025年08月14日 15:40:00   作者:大新屋  
HPA(HorizontalPodAutoscaler)根据CPU/内存使用率自动调整Pod数量,实现水平扩展,与垂直扩展不同,需安装MetricsServer,支持Deployment、StatefulSet等资源,但不适用于DaemonSet

HPA简介

提示:Kubernetes官方HPA说明文档 https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale

在 Kubernetes 中,HPA(Horizontal Pod Autoscaler)自动伸缩工作负载资源 (例如Deployment、StatefulSet等), 目的是自动伸缩工作负载以满足需求。水平扩展意味着对增加的负载的响应是部署更多的pod。这与垂直扩展不同,垂直扩展对于Kubernetes来说意味着将更多的资源(例如:内存或CPU)分配给已经为工作负载运行的pod。如果负载减少,并且pod的数量高于配置的最小值,则HPA会指示工作负载资源(Deployment、StatefulSet或其他类似资源)缩减。

在新版的Kubernetes中系统资源的采集均使用Metrics Server,可以通过Metrics采集节点和Pod的内存、磁盘、CPU和网络的使用率。HPA通过Metrics采集Pod资源的内存、CPU等使用情况,如果发现某个Pod资源硬件资源负载过高或过低,会自动伸缩Pod资源,以达到Pod硬件资源的负载均衡。

一、HPA接口类型

  • v1 # 稳定版自动水平伸缩,只支持CPU指标
  • v2beta1 # 支持CPU、内存和自定义指标
  • v2beta2 # 支持CPU、内存、自定义指标Custom和额外指标ExternalMetrics
### 查看K8s集群是否已安装部署Metrics Server
root@k8s-master01:~# kubectl get pods -n kube-system -o wide| grep metrics-server
metrics-server-5f9cfc9f9-7kkf4             1/1     Running   2 (4d5h ago)   4d23h   172.30.122.133   k8s-master02   <none>           <none>

### 查看K8s集群所支持的HPA接口类型
root@k8s-master01:~# kubectl api-resources | grep HorizontalPodAutoscaler
horizontalpodautoscalers            hpa          autoscaling/v2                    true         HorizontalPodAutoscaler

二、基于CPU使用率创建HPA

  • 注意:水平pod自动缩放无法缩放的对象,例如:守护进程类的工作负载DaemonSet
  • 注意:K8s集群必须安装部署Metrics Server才可以使用HPA功能
  • 注意:HPA是根据Delpoyment工作负载.spec.resources.requests参数实现自动伸缩

1、Deployment resources参数说明

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy
  name: nginx-deploy
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-pod
  template:
    metadata:
      name: nginx
      labels:
        run: nginx-pod
    spec:
      containers:
      - name: nginx01
        image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:              # 配置Pod资源请求和资源限制
          requests:             # 配置Pod资源请求
            cpu: 10m            # 配置CPU资源请求10m(毫核),1颗物理CPU等于1000m
            memory: 64Mi        # 配置内存资源请求64M
          limits:               # 配置Pod资源限制
            cpu: 100m           # 配置CPU资源限制100m(毫核) ,1颗物理CPU等于1000m
            memory: 128Mi       # 配置内存资源限制128M

2、创建Deployment

cat > /data/yaml/hpa/deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy
  name: nginx-deploy
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-pod
  template:
    metadata:
      name: nginx
      labels:
        run: nginx-pod
    spec:
      containers:
      - name: nginx01
        image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 10m
            memory: 64Mi
          limits:
            cpu: 100m
            memory: 128Mi
EOF

kubectl create -f /data/yaml/hpa/deployment.yaml
kubectl get pods -n default -owide
kubectl get deploy -n default

3、创建Service暴露 Nginx服务80端口

### 创建Service
kubectl get deploy -n default
kubectl expose deploy nginx-deploy --port=80
kubectl get service -n default –owide

### 访问Nginx 80端口
curl 10.96.249.147

4、查看当前Pod资源使用率

kubectl top pods -n default

5、HPA参数说明

apiVersion: autoscaling/v2           # 填写API资源版本号,通过kubectl api-resources | grep HorizontalPodAutoscaler命令查询API资源版本号
kind: HorizontalPodAutoscaler       # 指定资源类型,HorizontalPodAutoscaler资源类型是HorizontalPodAutoscaler
metadata:                           # 包含HorizontalPodAutoscaler的元数据
  name: nginx-deploy-hpa            # 自定义HorizontalPodAutoscaler的名称
  namespace: default                # 指定HPA运行的命名空间,与Deployment命名空间相同,默认default
spec:
  scaleTargetRef:                  # 指定HPA要监控的目标,包括API版本、类型(如Deployment)、名称
    apiVersion: apps/v1            # 指定要监控目标的Deployment API资源版本号
    kind: Deployment               # 指定要监控目标的Deployment资源类型
    name: nginx-deploy             # 指定要监控目标Deployment的名称
  minReplicas: 1                   #  Pod副本的最小数量
  maxReplicas: 10                  #  Pod副本的最大数量
  metrics:                         # 定义触发Pod数量调整的指标
  - type: Resource                 # 指标类型,如Resource(资源使用率)或Pods(基于Pods的数量)
    resource:
      name: cpu                    # 资源名称,如cpu或memory
      target:
        type: Utilization          # 目标类型,如Unilization(利用率)或AverageValue(平均值)
        averageUtilization: 50     # 目标利用率百分比(例如 50表示50%)
      # averageValue: 100Mi        # 目标平均值(例如100Mi表示100MB)

6、创建HPA(根据CPU使用率)

cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF'
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-deploy-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deploy
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
EOF

kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml
kubectl get hpa -n default

7、创建HPA(根据CPU平均值)

cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF'
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-deploy-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deploy
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: AverageValue
        averageValue: 50m
EOF

kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml
kubectl get hpa -n default

8、创建HPA(根据Memory使用率)

cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF'
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-deploy-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deploy
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 50
EOF

kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml
kubectl get hpa -n default

9、创建HPA(根据Memory平均值)

cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF'
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-deploy-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deploy
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 6Mi
EOF

kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml
kubectl get hpa -n default

10、模拟压力测试Nginx容器

### 当前只运行了一个Pod
root@k8s-master01:~# kubectl get pod -n default
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-6998946c5b-g2h8c   1/1     Running   0          64m

### 查看Deployment Service
root@k8s-master01:~# kubectl get service -n default | grep nginx-deploy
nginx-deploy   ClusterIP   10.96.249.147   <none>        80/TCP    37m

### 模拟压力测试Nginx容器
while true; do wget -q -O- http://10.96.249.147 > /dev/null; done

### 打开另一个窗口查看Pod CPU资源使用率和自动伸缩
for i in `seq 100`;do  sleep 2;kubectl top pods;kubectl get pods -n default;echo;done

11、使用kubectl autoscale命令创建HPA

--cpu-percent=50   # 指定 Deployment 目标 CPU 使用率百分比
--min=1            # 指定 Deployment 应具有的最小副本数。即使 CPU 利用率很低,水平 Pod 自动缩放器也不会将 Deployment 缩小到此数值以下
--max=5           # 指定 Deployment 应具有的最大副本数。如果 CPU 利用率非常高,水平 Pod 自动缩放器也不会将 Deployment 扩展到此数值以上

kubectl autoscale deploy nginx-deploy --cpu-percent=50 --min=1 --max=5
kubectl get hpa -n default

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • K8S节点本地存储被撑爆问题彻底解决方法

    K8S节点本地存储被撑爆问题彻底解决方法

    这篇文章主要为大家介绍了K8S节点本地存储被撑爆问题彻底解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • k8s整合istio配置gateway入口、配置集群内部服务调用管理(最新推荐)

    k8s整合istio配置gateway入口、配置集群内部服务调用管理(最新推荐)

    这篇文章主要介绍了k8s整合istio配置gateway入口、配置集群内部服务调用管理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Kubernetes调度机制与策略实验详解

    Kubernetes调度机制与策略实验详解

    本文通过实际操作,详细介绍了Kubernetes调度机制的核心原理和常用调度策略的配置方法,包括节点选择、亲和性与反亲和性、污点与容忍等,实验环境为Kubernetes集群,并通过一系列步骤验证了这些调度策略的实际应用
    2025-12-12
  • RFO SIG之openEuler AWS AMI 制作详解

    RFO SIG之openEuler AWS AMI 制作详解

    这篇文章主要为大家介绍了RFO SIG之openEuler AWS AMI 制作详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • k8s编排之Deployment知识点详解

    k8s编排之Deployment知识点详解

    这篇文章主要为大家介绍了k8s编排之Deployment知识点详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Kubernetes如何限制不同团队只能访问各自namespace实现

    Kubernetes如何限制不同团队只能访问各自namespace实现

    这篇文章主要为大家介绍了Kubernetes如何限制不同团队只能访问各自namespace实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • k8s的包管理工具helm使用简介

    k8s的包管理工具helm使用简介

    这篇文章主要为大家介绍了k8s的包管理工具helm使用简介,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • k8s容器放开锁内存限制问题

    k8s容器放开锁内存限制问题

    nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并重启docker,以解除内存锁定限制
    2025-09-09
  • Kubernetes访问控制之鉴权方法详解

    Kubernetes访问控制之鉴权方法详解

    这篇文章主要为大家介绍了Kubernetes访问控制之鉴权方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • k8s的架构组成操作代码

    k8s的架构组成操作代码

    k8s是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务,通过k8s能够进行应用的自动化部署和扩缩容,这篇文章主要介绍了k8s的架构组成,需要的朋友可以参考下
    2024-05-05

最新评论