Skip to content

解决痛点

当流量突然增大,会导致CPU使用率或内存突然增高,为保证业务不中断,可以通过设置自动调整的Horizontal Pod Autoscaler 来解决这个问题。

HPA (Horizontal Pod Autoscaler) 可以根据 CPU 利用率自动扩缩 ReplicationController、 Deployment、ReplicaSet 或 StatefulSet 中的 Pod 数量

原理

使用HPA,必须先安装metrics-server服务 工作原理: 使用metrics-server持续采集所有Pod副本的指标数据,HPA Controller 通过metrics-server提供的API获取这些数据,基于用户自定义的扩缩容规则进行计算,得到目标副本数量。

如果得出结果与当前副本数不符,HPA Controller向副本控制器发起scale操作,调转

然后通过HPA来调整副本数量

创建测试用的 deployment 和 service

其中 hpa-example 镜像只包含了一个index.php,模拟 CPU 密集型计算,内容如下:

php
<?php
  $x = 0.0001;
  for ($i = 0; $i <= 1000000; $i++) {
    $x += sqrt($x);
  }
  echo "OK!";
?>
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  replicas: 1
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: mirrorgooglecontainers/hpa-example
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m

---

apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php-apache

创建水平自动伸缩器 Horizontal Pod Autoscaler

bash
# 大致来说,HPA 将(通过 Deployment)增加或者减少 Pod 副本的数量以保持所有 Pod 的平均 CPU 利用率在 50% 左右。
# 由于每个 Pod 请求 200 毫核的 CPU,这意味着平均 CPU 用量为 100 毫核。
$ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=3

$ kubectl get hpa -w

NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         3         1          17s

# 打开另一个终端发起更多请求,模拟压力测试,提高CPU负载
$ kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

# 这时,由于请求增多,CPU 利用率已经升至请求值的 305%。 可以看到,Deployment 的副本数量已经增长到了3:
k get deployment -w
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
php-apache   2/3     3            2           10m

# 停掉模拟请求,deployment副本数会在数分钟内自动将至为1

多项度量维度

上面的例子,只有一个度量维度,即CPU利用率。 如果需要更多的度量维度,可以使用平均值

参考

https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/