• 搜索
  • 夜间模式
    ©2026  依刻学习 Theme by OneBlog

    依刻学习博客

    搜索
    标签
  • 首页>
  • 学习的一天>
  • 正文
  • k8s的HPA实现

    2025年03月05日 11 阅读 0 评论 3397 字

    前言

    复习k8s,通过metric-server实现HPA水平伸缩

    metric-server是一个用于收集资源信息的组件,它功能于sadvier功能相近,所以使用metric-server的意义是什么?
    metric-server使用起来有2个特殊的功能:

    • 提供的更好的pod资源查询kubectl top
      kubectl top vs kubectl get" title="kubectl top vs kubectl get">
    • 提供功能强大的HPA,水平伸缩功能kubectl autoscale,通过创建hpa类型可以使用控制pod在一定条件(cpu或memory)下自动扩容/缩容

    metric-server官方架构图

    实现

    1.安装metric-server

    1. 下载metric-server清单

      wget  https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml
    2. 修改清单(2025.3最新版本为v0.7.2)

       #args添加--kubelet-insecure-tls
       #image修改dockerhub的镜像为aliyun镜像
       - args:
      - --kubelet-insecure-tls
      .....
      image: registry.aliyuncs.com/google_containers/metrics-server:v0.7.2
    3. 部署

      kubectl apply -f high-availability-1.21+.yaml 
      kubectl -n kube-system get pods  | grep metrics-server
      #每个node节点都会有一个metrics-server的pod

    2.测试kubectl top命令

    kubectl top node
    kubectl top pods

    kubectl top结果" title="kubectl top结果">
    3.实现HPA

    • 创建一个pod

      apiVersion: apps/v1
      kind: Deployment
      metadata:
      name: wym-k8s-stress
      spec:
      replicas: 1
      selector:
        matchExpressions:
        - key: apps
          operator: Exists
      template:
        metadata:
          labels:
            apps: stress
        spec:
          imagePullSecrets:
          - name: harbor-secret
          containers:
          - name: web
            image: harbor.A.com/k8s/tools:latest
            stdin: true
            resources:
              requests:
                 cpu: 500m
                 memory: 200M
              limits:
                 cpu: 1
                 memory: 500M

      此容器是一个特殊的容器,本身没有任何服务,所以需要使用stdin阻塞防止停止,它可以进行压力测试,占用大量cpu和memory

      必须配置pod的resources.requests字段,因为hpa会使用request指定的内容作为基准

      以下两种方法相同,都可以创建hpa规则,应用到该pod

    • 声明式(清单)创建hpa

      apiVersion: autoscaling/v2 
      # 指定资源类型为HPA
      kind: HorizontalPodAutoscaler 
      metadata:    
      name: wym-k8s-stress
      spec:
      #指定最大的Pod副本数量
      maxReplicas: 6
      # 指定监控指标  
      metrics: 
       # 指定资源限制
      - resource:
          # 指定资源限制的名称
          name: cpu    
          # 指定限制的阈值
          target:      
            #用到request的50%就会触发扩容,小于就会触发缩容
            averageUtilization: 50
            type: Utilization
        type: Resource
       #指定最小的Pod副本数量
      minReplicas: 2
      # 当前的hpa规则应用在哪个资源
      scaleTargetRef:
        apiVersion: apps/v1        
        kind: Deployment
        name: wym-k8s-stress
    • 响应式(命令)创建hpa

      kubectl autoscale deployment wym-k8s-stress --min=2 --max=6 --cpu-percent=50

    发现,原本只启动1个的pod(replicas: 1),现在启动了2个,这是因为hpa规定的最小数量为2(minReplicas: 2),所以hpa又控制启动了个pod,

    4.测试hpa
    对pod进行压力测试

    kubectl exec wym-k8s-stress-7dd9c54b76-5dj7v -- stress -c 1 --verbose --timeout 10m

    发现该容器占满1core,等待5m,hpa会扩容,如图已经扩容到了4个,但是等待了5min都没有继续创建pod,删除压力测试容器后等待5min同样没有删除pod

    hpa有扩容冷却机制,默认扩容立即执行,冷却3min,缩容需观察5min,冷却5min,另外创建pod的时间(约30s)不算入冷却时间

    扩容条件为最大指标值>目标指标值,立刻扩容
    缩容条件为最大指标值<目标指标值,等待5m缩容
    期望pod数量策略为 期望副本数 = 当前副本数 × (当前指标值 / 目标指标值),结果向上取整

    注意,这是有延迟的,具体看情况

    本文著作权归作者 [ wymm ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    Copyright©2026  All Rights Reserved.  Load:0.017 s
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。