zoukankan      html  css  js  c++  java
  • [置顶] kubernetes资源对象--Horizontal Pod Autoscaling(HPA)

    概念

    HPA全称Horizontal Pod Autoscaling,即pod的水平自动扩展。自动扩展主要分为两种,其一为水平扩展,针对于实例数目的增减;其二为垂直扩展,即单个实例可以使用的资源的增减。HPA属于前者。

    HPA的操作对象是RC、RS或Deployment对应的Pod,根据观察到的CPU实际使用量与用户的期望值进行比对,做出是否需要增减实例数量的决策。

    原理

    它根据Pod当前系统的负载来自动水平扩容,如果系统负载超过预定值,就开始增加Pod的个数,如果低于某个值,就自动减少Pod的个数。目前K8S的HPA只能根据CPU和内存去度量系统的负载,而且目前还依赖heapster去收集CPU的使用情况。

    条件

    HPA通过定期(定期轮询的时间通过–horizontal-pod-autoscaler-sync-period选项来设置,默认的时间为30秒)通过Status.PodSelector来查询pods的状态,获得pod的CPU使用率。然后,通过现有pods的CPU使用率的平均值(计算方式是最近的pod使用量(最近一分钟的平均值,从heapster中获得)除以设定的每个Pod的CPU使用率限额)跟目标使用率进行比较,并且在扩容时,还要遵循预先设定的副本数限制:MinReplicas <= Replicas <= MaxReplicas。

    计算扩容后Pod的个数:sum(最近一分钟内某个Pod的CPU使用率/量的平均值)/CPU使用上限的整数+1

    流程

    1、创建HPA资源,设定目标CPU使用率限额,以及最大、最小实例数
    2、收集一组中(PodSelector)每个Pod最近一分钟内的CUP使用率,并计算平均值
    3、读取HPA中设定的CPU使用限额
    4、计算:平均值之和/限额,求出目标调整的实例个数
    5、目标调整的实例数不能超过1中设定的最大、最小实例数,如果没有超过,则扩容;超过,则扩容至最大的实例个数
    6、回到2,不断循环
    

    例外

    考虑到自动扩展的决策可能需要一段时间才会生效,甚至在短时间内会引入一些噪声。例如当pod所需要的CPU负荷过大,从而运行一个新的pod进行分流,在创建过程中,系统的CPU使用量可能会有一个攀升的过程。所以,在每一次作出决策后的一段时间内,将不再进行扩展决策。对于ScaleUp而言,这个时间段为3分钟,Scaledown为5分钟。

    HPA允许一定范围内的CPU使用量的不稳定,只有avg(CurrentPodsConsumption) / Target小于90%或者大于110%时才会触发扩容或缩容,避免频繁扩容、缩容造成颠簸。

    为什么选择相对比率

    为了简便,选用了相对比率(90%的CPU资源)而不是0.6个CPU core来描述扩容、缩容条件。如果选择使用绝对度量,用户需要保证目标(限额)要比请求使用的低,否则,过载的Pod未必能够消耗那么多,从而自动扩容永远不会被触发:假设设置CPU为1个核,那么这个pod只能使用1个核,可能Pod在过载的情况下也不能完全利用这个核,所以扩容不会发生。在修改申请资源时,还有同时调整扩容的条件,比如将1个core变为1.2core,那么扩容条件应该同步改为1.2core,真是太麻烦了,与自动扩容的目标相悖。

    实例

    创建Deployment

    kubectl delete -f lykops-hpa-deploy.yaml
    cat << EOF > lykops-hpa-deploy.yaml
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: lykops-hpa-deploy
      labels:
        software: apache
        project: lykops
        app: hpa
        version: v1      
    spec:
      replicas: 1 
      selector:
        matchLabels:
          name: lykops-hpa-deploy
          software: apache
          project: lykops
          app: hpa
          version: v1
      template:
        metadata:
          labels:
            name: lykops-hpa-deploy
            software: apache
            project: lykops
            app: hpa
            version: v1
        spec:
          containers:
          - name: lykops-hpa-deploy
            image: web:apache
            command: [ "sh", "/etc/run.sh" ]
            ports:
            - containerPort: 80
              name: http
              protocol: TCP
            resources:
              requests:
                cpu: 0.001
                memory: 4Mi
              limits:
                cpu: 0.01
                memory: 16Mi
    EOF
    kubectl create -f lykops-hpa-deploy.yaml --record
    

    创建service

    cat << EOF > lykops-hpa-deploy-svc.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: lykops-hpa-svc
      labels:
        software: apache
        project: lykops
        app: hpa
        version: v1
    spec:
      selector:
        software: apache
        project: lykops
        app: hpa
        version: v1
        name: lykops-hpa-deploy
      ports:
      - name: http
        port: 80
        protocol: TCP
    EOF
    kubectl create -f lykops-hpa-deploy-svc.yaml
    

    创建HPA

    kubectl delete -f lykops-hpa.yaml
    cat << EOF > lykops-hpa.yaml
    apiVersion: autoscaling/v1
    kind: HorizontalPodAutoscaler
    metadata:
      name: lykops-hpa
      labels:
        software: apache
        project: lykops
        app: hpa
        version: v1
    spec:
      scaleTargetRef:
        apiVersion: v1
        kind: Deployment
        name: lykops-hpa-deploy
        #这里只能为这三项
      minReplicas: 1
      maxReplicas: 10
      targetCPUUtilizationPercentage: 5
    EOF
    kubectl create -f lykops-hpa.yaml
    

    测试

    多台机器不断访问service的clusterIP地址,然后可以看出是否增加pod数了
  • 相关阅读:
    实用机器学习 跟李沐学AI
    Explicitly drop temp table or let SQL Server handle it
    dotnettransformxdt and FatAntelope
    QQ拼音输入法 禁用模糊音
    (技术八卦)Java VS RoR
    Ruby on rails开发从头来(windows)(七)创建在线购物页面
    Ruby on rails开发从头来(windows)(十三)订单(Order)
    Ruby on rails开发从头来(windows)(十一)订单(Order)
    新员工自缢身亡,华为又站到了风口浪尖
    死亡汽油弹(Napalm Death)乐队的视频和来中国演出的消息
  • 原文地址:https://www.cnblogs.com/lykops/p/7419933.html
Copyright © 2011-2022 走看看