k8s横向自动伸缩pod的过程如下:
- 采集pod的度量数据。不同的版本有不同的方式。在旧版本,Horizontal Pod Autoscaler直接从Heapster中获取pod的度量数据。Heapster则会收集各节点上cAdvisor中的度量数据,cAdvisor则会收集当前节点上各pod的度量。1.9版本后,则会从资源度量API中获取数据。
- 计算使度量数值到达所指定目标数值所需的pod数量。当只考虑单个度量时,计算方式大致是将所有pod的度量求和后除以配置的目标值,再向上取整。如果是多个度量,则会先单独计算每个度量的副本数,然后取最大值。
- 更新被伸缩资源(如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的伸缩有速率限制:
- 单次扩容操作中若副本数大于2,则至多使副本数翻倍;若副本数只有1或2,最多扩容4个副本
- 两次扩缩容操作之间有时间间隔的限制
其他类型度量的自动伸缩
基于内存的自动伸缩
和基于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