Kubernetes 源码 (19) 自动伸缩

Submitted by Lizhe on Sun, 07/19/2020 - 04:22

Kubernetes三种弹性伸缩:

  • HPA(Horizontal Pod Autoscaler):Pod个数自动扩/缩容
  • CA(Cluster Autoscaler):Node级别自动扩/缩容 cluster-autoscaler组件
  • VPA(Vertical Pod Autoscaler):Pod配置自动扩/缩容,主要是CPU、内存 addon-resizer组件

 

我们先来看一下HPA

这里不会演示如何创建HPA,我关注的是一些具体细节

Kubernetes 的自动伸缩特性在1.6和1.7本本之间重写过一次,有一些特性发生了变化

自动伸缩分为3个步骤

1. 获取被伸缩资源对象所管理的所有pod度量
2. 计算使度量数值达到(或接近)所指定的目标数值所需的pod数量
3. 更新被伸缩资源的 replicas 字段

 

如何获取度量数据

度量数据的流向

Pod -> cAdvisor -> Heapster -> Horizontal Pod AutoScaler

但是发起连接的却是 HPA控制器,HPA控制会向Heapster 发起 restful 请求,所以连接的调用方向和上面正好相反

Pod <- cAdvisor <- Heapster <- Horizontal Pod AutoScaler

 

如何计算所需的pod数量

之前我们提到过

Horizontal Pod AutoScaler被实现为一个控制循环,周期由控制器管理器的–Horizontal Pod AutoScaler sync period标志(默认值为15秒)控制

目前主要分两个版本
1.autoscaling/v1
v1版本只支持 cpu
2.autoscaling/v2beta2
v2beta2版本支持 自定义 ,内存 ,但是目前也仅仅是处于beta阶段

 

一般性指标利用率,基于所有容器的当前指标和参与缩扩容计算的pod数量计算
usageRatio = (sum(metrics) / podCount) / target
cpu、memory等资源利用率,基于所有容器的当前指标和requests计算
usageRatio = (sum(metrics) / sum(requests)) / target

例1 基于cpu使用率

如果 pod1 60% pod2 90% pod3 50%

目标cpu使用率50% 则

(60 + 90 + 50) / 50 = 4 

例2 基于 QPS

如果 pod1 15 pod2 30 pod3 12

目标 QPS 20 则

(15 + 30 + 12)/ 20 = 57 / 20 = 3

 


 

CPU 度量指标

autoscaling/v1 中的 CPUUtilizationPercentage:

基于cpu使用率,这个值是基于 cpu request来进行计算的,例如  如果设置为 50%, request 是 200m,则 系统将尝试维持cpu实际使用 100m

apiVersion: autoscaling/v2beta2 中等价的是
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: java-demo
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - resource:
    type: Resource
      name: cpu
      target:
        averageUtilization: 60
        type: Utilization

 

以上基于cpu的伸缩模式是比较常见的,还有基于memory,复杂一点的要基于Prometheus

工作流程:hpa -> apiserver -> kube aggregation -> prometheus-adapter -> prometheus -> pods

wget https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gz
tar zxvf helm-v3.0.0-linux-amd64.tar.gz 
mv linux-amd64/helm /usr/bin/helm3
helm3 repo add stable http://mirror.azure.cn/kubernetes/charts
helm3 repo update
helm3 repo list

 

MacOS的话直接用 brew install helm , 如果你之前装过 helm2 可能会报错,仔细看提示 brew link 可以解决你的问题

 

# helm install prometheus-adapter stable/prometheus-adapter --namespace kube-system --set prometheus.url=http://prometheus.kube-system,prometheus.port=9090
# helm list -n kube-system

 

20200719055631