周顺的技术博客

  • 1.HPA简介
  • 2.弹性伸缩自动化实践
  • 3.创建hpa规则
  • 4.kubernetes yaml导入导出
  • 首页
  • 榜上有名
  • 文章归档
  • 读者排行
  • 豆瓣书影
  • 友情链接
  • DevOps (4)
  • Docker (4)
  • k8s (9)
  • linux (11)
  • Mysql (9)
  • Python (2)
  • Redis (1)
  • Shell (6)
  • 主题 (0)
  • 未分类 (0)

K8s HPA:Horizontal Pod Autoscaling

  • xiaoteng
  • 2026-01-11
  • 0

1.HPA简介

ai '讲一下hpa'

Horizontal Pod Autoscaling,简称HPA 自动水平伸缩,还有一个vpa纵向扩容。

自动水平伸缩,是指运行在k8s上的应用负载(POD),可以根据资源使用率进行自动扩容、缩容,它依赖metrics-server服务pod使用资源指标收集;我们知道应用的资源使用率通常都有高峰和低谷,所以k8s的HPA特性应运而生;它也是最能体现区别于传统运维的优势之一,不仅能够弹性伸缩,而且完全自动化!

2.弹性伸缩自动化实践

注意事项

使用HPA前我们要确保K8s集群的dns服务和metrics服务是正常运行的,并且我们所创建的服务需要配置指标分配

创建一个带有小资源分配的request参数yaml实例:

cat > web.yaml <<-'EOF'
# cat web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
  app: web
name: web
namespace: default
spec:
replicas: 1
selector:
  matchLabels:
    app: web
template:
  metadata:
    labels:
      app: web
  spec:
    containers:
    - image: nginx:1.21.6
      name: nginx
      resources:
        limits:   # 因为我这里是测试环境,所以这里CPU只分配50毫核(0.05核CPU)和20M的内存
          cpu: "50m"
          memory: 20Mi
        requests: # 保证这个pod初始就能分配这么多资源
          cpu: "50m"
          memory: 20Mi
EOF

执行并创建服务:

kubectl apply -f web.yaml 
kubectl expose deployment web --port 80 --target-port 80
​
#查看标签匹配结果
kubectl get svc -o wide
kubectl get pod -l app=web

3.创建hpa规则

ai 快速掌握hpa

ai '创建一个hpa规则'
kubectl autoscale deployment web --max=5 --min=2 --cpu-percent=30
#等待一会,可以看到相关的hpa信息(K8s上metrics服务收集所有pod资源的时间间隔大概在60s的时间)
kubectl get hpa -w
#删除命令如下:
kubectl delete horizontalpodautoscalers.autoscaling web
​
#删除pod熟练测试 最小pod数两
kubectl scale --replicas=1 deployment web

模拟业务流量增长,看看hpa自动伸缩的效果。开启另外一个终端运营工具容器测试

ai 'kubectl运行一个工具pod测试专用'
kubectl run -it --rm busybox --image=registry.cn-shanghai.aliyuncs.com/acs/busybox:v1.29.2 -- sh
while :;do wget -q -O- http://web;done
​
#等待2 ~ 3分钟,注意k8s为了避免频繁增删pod,对副本的增加速度有限制
kubectl get hpa web -w
#看下hpa的描述信息下面的事件记录
kubectl describe hpa web
​
#停掉压测,观察下HPA的自动收缩功能5分钟左会有收缩

4.kubernetes yaml导入导出

Kubernetes集群资源通过yaml导入导出的方法

1.导出某个Deployment的YAML文件
<deployment-name>是您想要导出的Deployment的名称,此命令将导出Deployment的完整YAML文件,包括所有注释和注释行
kubectl get deployment <deployment-name> -n <namespace> -o yaml > <deployment-name>.yaml
​
2.只想导出Deployment的规范部分
kubectl get deployment <deployment-name> -n <namespace> -o yaml | grep -v '^\s*#' > <deployment-name>.yaml
​
3.集群configMap,deployment,service,secret等导出和导入的方法,以service为例,其他同理:
单个service:
    导出: kubectl get service serviceName -o yaml > backup.yaml
    导入: kubectl create -f backup.yaml
所有service:
    导出: kubectl get service -o yaml > backup.yaml
    导入: kubectl create -f backup.yaml

https://github.com/kubernetes/autoscaler vpa

© 2026 周顺的技术博客
Theme by Wing
  • {{ item.name }}
  • {{ item.name }}