欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)

程序员文章站 2022-04-14 13:41:19
...

HPA是什么

Kubernetes有一个HPA(Horizontal Pod Autoscaler)的资源,可以实现基于CPU使用率的Pod自动伸缩的功能

1.HPA基于Master Node上的kube-controller-manager服务启动参数–horizontal-pod-autoscaler-sync-period定义的时长(默认为30秒),周期性的检测Pod的CPU使用率(需要事先安装heapster)。

如果需要设置–horizontal-pod-autoscaler-sync-period可以在Master Node上的/etc/default/kube-controller-manager中修改。

2.HPA 与之前的 RC、Deployment 一样,也属于一种 Kubernetes 资源对象通过追踪分析 RC 控制的所有目标 Pod 的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理

当前,HPA可以有以下两种方式作为 Pod 负载的调度指标:

CPUUtilizationPercentage。
应用程序自定义的度量指标,比如服务在每秒内的相应的请求数(TPS 或 QPS)。

kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)
官网:

https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
 运行deployment 服务:
$ kubectl run hpa-example --image=hpa-example --requests=cpu=200m --expose --port=80
service/hpa-example created
deployment.apps/hpa-example created

$ kubectl get deployments.apps 
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
hpa-example   1/1     1            1           19s

$ kubectl autoscale deployment hpa-example --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/hpa-example autoscaled

$ kubectl get hpa
NAME          REFERENCE                TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-example   Deployment/hpa-example   0%/50%    1         10        1          39s
$ kubectl  get svc hpa-example 
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
hpa-example   ClusterIP   10.110.93.191   <none>        80/TCP    63m

$ kubectl run test -it --rm --image=busybox --restart=Never
/ # while true; do wget -q -O- http://10.110.93.191; done

$ kubectl get hpa
NAME          REFERENCE                TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
hpa-example   Deployment/hpa-example   494%/50%   1         10        8          7m39s

Hpa会根据Pod的CPU使用率动态调节Pod的数量

部署步骤

运行php-apache服务器并暴露服务

kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)1.kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)

创建HPA

kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)1.kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)

增加负载,进行测试

kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)
kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)

停止负载

kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)
kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)

HPA伸缩过程详解

收集HPA控制下所有Pod最近的cpu使用情况(CPU utilization)
对比在扩容条件里记录的cpu限额(CPUUtilization)
调整实例数(必须要满足不超过最大/最小实例数)
每隔30s做一次自动扩容的判断
CPU utilization的计算方法是用cpu usage(最近一分钟的平均值,通过metrics可以直接获取到)除以cpu request(这里cpu request就是我们在创建容器时制定的cpu使用核心数)得到一个平均值,这个平均值可以理解为:平均每个Pod CPU核心的使用占比。

HPA进行伸缩算法:

计算公式:TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)

ceil()表示取大于或等于某数的最近一个整数
每次扩容后冷却3分钟才能再次进行扩容,而缩容则要等5分钟后。
当前Pod Cpu使用率与目标使用率接近时,不会触发扩容或缩容:
触发条件:avg(CurrentPodsConsumption) / Target >1.1<0.9

1.kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)2.缩容完毕后
kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)3.测试计算
kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)

基于多项度量指标进行伸缩

kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-example
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hpa-example
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        averageUtilization: 60
        type: Utilization
  - type: Resource
    resource:
      name: memory
      target:
        averageValue: 50Mi
        type: AverageValue

kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)
kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)kubernetes(k8s) 学习 (十七) 横向自动扩容HPA(pod的弹性伸缩)

相关标签: 容器技术