Pod 水平自动伸缩(HPA)

688 阅读2分钟

什么是HPA

Pod 水平自动伸缩(Horizontal Pod Autoscaler)特性,可以基于CPU利用率自动伸缩 replication controller、deployment和 replica set 中的 pod 数量。(除了 CPU 利用率)也可以基于其他应程序提供的度量指标custom metrics。 pod 自动缩放不适用于无法缩放的对象,比如 DaemonSets。

原理

Pod 水平自动伸缩的实现是一个控制循环,由 controller manager 的 --horizontal-pod-autoscaler-sync-period 参数 指定周期(默认值为15秒)。 每个周期内,controller manager 根据每个 HorizontalPodAutoscaler 定义中指定的指标查询资源利用率。 controller manager 可以从 resource metrics API(每个pod 资源指标)和 custom metrics API(其他指标)获取指标。

HorizontalPodAutoscaler 是 Kubernetes autoscaling API 组的资源。 在当前稳定版本(autoscaling/v1)中只支持基于CPU指标的缩放。 在 beta 版本(autoscaling/v2beta2),引入了基于内存和自定义指标的缩放。 在autoscaling/v2beta2版本中新引入的字段在autoscaling/v1版本中基于 annotation 实现。

更多介绍及算法细节请参见官方文档

使用

部署metrics-server

metrics-server部署到集群中,用来监控集群资源的使用情况。

编写一个CPU密集型计算方法

public String compute() {
    double d = 0.0001;
    for (int i = 0; i < 100000000; i++) {
        d += Math.sqrt(d);
    }
    return "OK:" + d;
}

创建Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-demo
  labels:
    app: jenkins-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins-demo
  template:
    metadata:
      labels:
        app: jenkins-demo
    spec:
      containers:
      - name: jenkins-demo
        image: {imagePath}
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: "200m"

一定要指定resources.requests,否则HPA不会生效。

创建HPA

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-jenkinsdemo
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: jenkins-demo
  minReplicas: 1
  maxReplicas: 3
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

scaleTargetRef指定需要自动伸缩的对象,minReplicasmaxReplicas分别指定伸缩的最大最小值,metrics指定伸缩参考值,这里定义的是CPU使用率超过设定值(Deployment中的设定值)的50%即进行伸缩。

当前无负载,所以CPU占用显示为0%,当前副本数为1。

注意,如果显示为<unknowm>,首先检查是否成功安装了metrics-server,如果已安装成功,尝试在metrics-server启动参数中增加以下参数:

- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname

增加负载

while true; do wget -q -O- http://{HOST}/hpa/compute; done

一段时间后可以看到负载增加:

当前副本数为3,查看pod:

逐渐启动了三个pod。

停止请求,负载降低,一段时间(默认五分钟)后pod逐渐被回收。