计算机系统应用教程网站

网站首页 > 技术文章 正文

自动伸缩你的应用 能自动伸缩功能的东西

btikc 2024-10-10 04:49:53 技术文章 6 ℃ 0 评论

k8s横向自动伸缩pod的过程如下:

  1. 采集pod的度量数据。不同的版本有不同的方式。在旧版本,Horizontal Pod Autoscaler直接从Heapster中获取pod的度量数据。Heapster则会收集各节点上cAdvisor中的度量数据,cAdvisor则会收集当前节点上各pod的度量。1.9版本后,则会从资源度量API中获取数据。
  2. 计算使度量数值到达所指定目标数值所需的pod数量。当只考虑单个度量时,计算方式大致是将所有pod的度量求和后除以配置的目标值,再向上取整。如果是多个度量,则会先单独计算每个度量的副本数,然后取最大值。
  3. 更新被伸缩资源(如replicaset,deployment等)的replicas字段。这是通过被伸缩资源的Scale子资源进行修改,从而Autoscaler不必了解具体的细节。

基于CPU使用率自动伸缩

一般情况下,我们会希望当CPU使用量达到一个阈值后,触发自动扩容,比如使用率达到60%。这个比例是指pod的CPU实际使用和配置的requests的比值。因此需要给被伸缩的pod设置CPU请求(requests参数)。

可以通过执行下面命令创建HPA(HorizontalpodAutoscaler)对象

kubectl autoscales deployment kubia --cpu-percent=30 --min=1 --max=5

这会帮你创建HPA对象,并将叫做kubia的Deployment设置为申诉目标,pod的目标CPU使用率为30%,并制定了伸缩的最小最大值。

HPA的伸缩有速率限制:

  1. 单次扩容操作中若副本数大于2,则至多使副本数翻倍;若副本数只有1或2,最多扩容4个副本
  2. 两次扩缩容操作之间有时间间隔的限制

其他类型度量的自动伸缩

基于内存的自动伸缩

和基于cpu的自动伸缩类似,但是若想基于内存的自动扩容有效,应用必须能在扩容后释放自己申请的内存,否则会一直要扩容

Resource度量类型

刚才提到的基于CPU和基于内存的自动伸缩都属于Resource度量类型

pods度量类型

Pods类型用来引用任何其他种类的与pod直接相关的度量,包括qps和消息队列中的消息数等。HPA yaml示例如下

...
spec:
  metrics:
  - type: Pods
    resource:
      metricName: qps
      targetAverageValue: 100
  scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: kubia
 minReplicas: 1
 maxReplicas: 5

Object度量类型

Object度量类型被用来让Autoscaler基于并非直接与pod关联的度量来进行伸缩。比如,基于Ingress对象,度量是平均请求延时进行收缩。Autoscaler只会从这单个对象中获取单个度量数据。示例如下

...
spec:
  metrics:
  - type: Object
    resource:
      metricName: latencyMillis
      target:
        apiVersion: extensions/v1beta1
        kind: Ingress
        name: frontend
      targetValue: 20

其他

PodDisruptionBudget(PDB)资源用于指定最少需要维持运行的pod数量,从1.7开始也支持最多有多少不可用的pod,命令示例如下

kubectl create pdb kubia-pdb --selector=app=kubia --min-available=3 --max-unavailable=2

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表