平均数的分母不计入该pod
HPA(Horizontal Pod Autoscaler)是kubernetes(以下简称k8s)的一种资源东西,能够按照某些指标对在statefulSet、replicaController、replicaSet等调集中的pod数量进步履态伸缩,使运行在上面的处事对指标的变革有必然的自适应能力。
HPA目前撑持四种类型的指标,分袂是Resource、Object、External、Pods。此中在不变版本autoscaling/v1中只撑持对CPU指标的动态伸缩,在测试版本autoscaling/v2beta2中撑持memory和自界说指标的动态伸缩,并以annotation的方法事情在autoscaling/v1版本中。
HPA在k8s中的布局首先可以看一下HPA在k8s中的布局,这里找了一个k8s官方给出的HPA例子,我在关键字段上给出一些注释便利理解。
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: php-apache namespace: default spec: # HPA的伸缩东西描述,HPA会动态改削该东西的pod数量 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-apache # HPA的最小pod数量和最大pod数量 minReplicas: 1 maxReplicas: 10 # 监控的指标数组,撑持多种类型的指标共存 metrics: # Object类型的指标 - type: Object object: metric: # 指标名称 name: requests-per-second # 监控指标的东西描述,指标数据来源于该东西 describedObject: apiVersion: networking.k8s.io/v1beta1 kind: Ingress name: main-route # Value类型的方针值,Object类型的指标只撑持Value和AverageValue类型的方针值 target: type: Value value: 10k # Resource类型的指标 - type: Resource resource: name: cpu # Utilization类型的方针值,Resource类型的指标只撑持Utilization和AverageValue类型的方针值 target: type: Utilization averageUtilization: 50 # Pods类型的指标 - type: Pods pods: metric: name: packets-per-second # AverageValue类型的方针值,Pods指标类型下只撑持AverageValue类型的方针值 target: type: AverageValue averageValue: 1k # External类型的指标 - type: External external: metric: name: queue_messages_ready # 该字段与第三方的指标标签相关联,(此处官方文档有问题,正确的写法如下) selector: matchLabels: env: "stage" app: "myapp" # External指标类型下只撑持Value和AverageValue类型的方针值 target: type: AverageValue averageValue: 30autoscaling/v1版本将metrics字段放在了annotation中进行措置惩罚惩罚。
target共有3种类型:Utilization、Value、AverageValue。Utilization暗示平均使用率;Value暗示裸值;AverageValue暗示平均值。
metrics中的type字段有四种类型的值:Object、Pods、Resource、External。
Resource指的是当前伸缩东西下的pod的cpu和memory指标,只撑持Utilization和AverageValue类型的方针值。
Object指的是指定k8s内部东西的指标,数据需要第三方adapter供给,只撑持Value和AverageValue类型的方针值。
Pods指的是伸缩东西(statefulSet、replicaController、replicaSet)底下的Pods的指标,数据需要第三方的adapter供给,并且只允许AverageValue类型的方针值。
External指的是k8s外部的指标,数据同样需要第三方的adapter供给,只撑持Value和AverageValue类型的方针值。
HPA动态伸缩的道理HPA在k8s中也由一个controller控制,controller会间隔循环HPA,查抄每个HPA中监控的指标是否触发伸缩条件,默认的间隔时间为15s。一旦触发伸缩条件,controller会向k8s发送请求,改削伸缩东西(statefulSet、replicaController、replicaSet)子东西scale中控制pod数量的字段。k8s响应请求,改削scale布局体,然后会刷新一次伸缩东西的pod数量。伸缩东西被改削后,自然会通过list/watch机制增加或减少pod数量,到达动态伸缩的目的。
HPA伸缩过程叙述HPA的伸缩主要流程如下:
判断当前pod数量是否在HPA设定的pod数量区间中,如果不在,过小返回最小值,过大返回最大值,结束伸缩。
判断指标的类型,并向api server发送对应的请求,拿到设定的监控指标。一般来说指标会按照预先设定的指标从以下三个aggregated APIs中获取:metrics.k8s.io、custom.metrics.k8s.io、 external.metrics.k8s.io。此中metrics.k8s.io一般由k8s自带的metrics-server来供给,主要是cpu,memory使用率指标,此外两种需要第三方的adapter来供给。custom.metrics.k8s.io供给自界说指标数据,一般跟k8s集群有关,好比跟特定的pod相关。external.metrics.k8s.io同样供给自界说指标数据,但一般跟k8s集群无关。许多知名的第三方监控平台供给了adapter实现了上述api(如prometheus),可以将监控和adapter一同部署在k8s集群中供给处事,甚至能够替换本来的metrics-server来供给上述三类api指标,到达深度定制监控数据的目的。
按照获得的指标,应用相应的算法算出一个伸缩系数,并乘以目前pod数量获得期望pod数量。系数是指标的期望值与目前值的比值,如果大于1暗示扩容,小于1暗示缩容。指标数值有平均值(AverageValue)、平均使用率(Utilization)、裸值(Value)三种类型,每种类型的数值都有对应的算法。以下几点值得注意:如果系数有小数点,统一进一;系数如果未到达某个容忍值,HPA认为变革太小,会忽略此次变革,容忍值默认为0.1。
HPA扩容算法是一个非常守旧的算法。如果呈现获取不到指标的情况,扩容时算最小值,缩容时算最大值;如果需要计算平均值,呈现pod没筹备好的情况,平均数的分母不计入该pod。
一个HPA撑持多个指标的监控,HPA会循环获取所有的指标,并计算期望的pod数量,并从期望功效中获得最大的pod数量作为最终的伸缩的pod数量。一个伸缩东西在k8s中允许对应多个HPA,但是只是k8s不会报错而已,事实上HPA相互不知道本身监控的是同一个伸缩东西,在这个伸缩东西中的pod会被多个HPA无意义地来回改削pod数量,给系统增加消耗,如果想要指定多个监控指标,可以如上述所说,在一个HPA中添加多个监控指标。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31545.html
- 上一篇: 1月13日php课后随笔
- 下一篇:你所不知道的良心网站第二弹