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

总结

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

相关文章

  • Kubernetes中使用PersistentVolume挂载云盘方式

    Kubernetes中使用PersistentVolume挂载云盘方式

    这篇文章主要介绍了Kubernetes中使用PersistentVolume挂载云盘方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • k8s容器状态Terminating无法删除的问题及解决

    k8s容器状态Terminating无法删除的问题及解决

    这篇文章主要介绍了k8s容器状态Terminating无法删除的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • k8s部署并测试ingress-nginx的详细过程

    k8s部署并测试ingress-nginx的详细过程

    这篇文章主要介绍了k8s部署并测试ingress-nginx的详细过程,本文通过一个demo示例给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-04-04
  • K8s中Pod处于Pending状态的八种原因分析

    K8s中Pod处于Pending状态的八种原因分析

    文章详细介绍了Pod处于Pending状态的八种常见原因,并提供了相应的排查和解决方法,这些原因包括资源不足、调度约束、存储依赖、镜像问题、配额限制、网络暗礁、系统级异常以及冷门陷阱,每种原因都附带了具体的诊断方法和解决建议,感兴趣的朋友一起看看吧
    2025-02-02
  • Kubernetes教程之Windows HostProcess 运行容器化负载

    Kubernetes教程之Windows HostProcess 运行容器化负载

    这篇文章主要介绍了Kubernetes Windows HostProcess 运行容器化负载,本篇内容还是比较多的,总共包含了 Windows HostProcess的创建、为 Windows Pod 和容器配置 GMSA 和 Windows 的 Pod 和容器配置 RunAsUserName三大功能模块,需要的朋友可以参考下
    2022-07-07
  • CentOS 8.2 k8s 基础环境配置

    CentOS 8.2 k8s 基础环境配置

    这篇文章主要介绍了CentOS 8.2 k8s 基础环境配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • K8s ConfigMaps与Secret实现配置分离过程

    K8s ConfigMaps与Secret实现配置分离过程

    本文介绍Kubernetes中ConfigMaps和Secret的创建方式及应用,涵盖文件、literal、YAML方法,强调命名空间匹配与键名大小写一致性,Secret类型如Opaque、dockerconfigjson用于加密配置,热更新需注意envFrom等参数限制
    2025-08-08
  • 一文详解基于k8s部署Session模式Flink集群

    一文详解基于k8s部署Session模式Flink集群

    这篇文章主要为大家介绍了基于k8s部署Session模式Flink集群详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • k8s:pod has unbound PersistentVolumeClaims问题及解决方案

    k8s:pod has unbound PersistentVolumeClaims问题及

    部署redis-ha时,Pod因PVC未绑定报错,原因在于value.yaml中storageClassName为空,且未启用DefaultDefaultStorageClass,解决方法是手动指定PVC的StorageClassName为现有存储类,确保PV分配成功
    2025-07-07
  • Kubernetes中创建命名空间实现方法

    Kubernetes中创建命名空间实现方法

    这篇文章主要为大家介绍了Kubernetes中创建命名空间实现方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11

最新评论