AWS-EKS-17--Horizontal Pod Autoscaler(HPA)

摘要

Horizontal Pod Autoscaler 简介

  • Horizontal Pod Autoscaler(HPA)基于资源 CPU 利用率自动调整 deployment、replication controller 或者 replica 中 pod 的数量,这有助于您的应用程序进行扩展以满足增长的需求,或在不需要资源时进行缩减,从而释放出节点用于其他应用程序。当您设置目标 CPU 利用率百分比时,HPA 扩展或缩减应用程序来尝试满足该目标。

  • Kubernetes 本身已经包含了 HPA 的 controller,所以不需要额外的安装或部署。

  • HPA 需要获取 metrics 信息,metrics 信息需要从 Metrics Server 中获取或者从第三方软件获取,关于如何在EKS中安装Metrics Server可以查看 AWS-EKS-11--安装 Kubernetes Metrics Server

  • HPA 会周期性(默认15秒)查询目标资源的使用情况,然后和 HPA 中定义的值做比较,并根据比较结果相应的调整 pod 数量。

  • 创建pod时,必须为其设定cpu资源,用于与目标值进行比较,目前v2版本的HPA除了支持CPU的对比,还可以设定其它指标,具体参考HorizontalPodAutoscaler 演练

示例

参考官方示例

  • 定义资源yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# php-apache.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: registry.k8s.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m # 最多可使用资源,500m(0.5 个 CPU)
requests:
cpu: 200m # 期望使用资源(desiredMetricValue),200m(0.2 个 CPU)
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
  • 部署yaml

1
2
3
$ k apply -f php-apache.yaml
deployment.apps/php-apache created
service/php-apache created
  • 创建HPA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 创建了一个叫“php-apache”的 HPA,与 deployment 的名称相同,可以用 --name='hpa-name' 指定hpa的名称
# replicas 变动范围是最小 1,最大 10
# 目标cpu利用率为 50%,上面我们设定 CPU request 值为 200m,所以当平均cpu值为 100m 时就会触发 autoscale
# 这里说平均cpu,是指所有pod的cpu利用率的平均值
$ k autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled

# 也可以通过yaml创建
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
namespace: test
spec:
maxReplicas: 10
minReplicas: 1
metrics:
- resource:
name: cpu
target:
averageUtilization: 50
type: Utilization
type: Resource
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
  • 查看HPA

1
2
3
$ k get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 29s
  • 测试HPA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 通过运行容器为 Web 服务器创建负载
# 这里利用 busybox 镜像临时生成一个 pod,用 while 循环不停的访问 php-apache 的 service,而 php-apache 中的 hpa-example 镜像已经配置了进行消耗 CPU 的计算网页,所以 php-apache pod 的 CPU 负载会很快增长
# 该命令会一直运行,直到 Ctrl+C
$ 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"

# 上面的命令运行一会后再开一个终端查看hpa的情况,可以看到已经发生扩容了
$ k get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 57%/50% 1 10 7 5m27s


# 运行一段时间后发现hpa稳定在8个,说明此时pod的数量已经满足平均cpu使用率小于50%的目标
$ k get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 43%/50% 1 10 8 20m

# 查看pod的cpu使用情况,虽然此时也有个别的pod大于100m,但是8个pod的平均cpu是小于100m的,此时就不会再进行扩容了
$ k top pod
NAME CPU(cores) MEMORY(bytes)
php-apache-7495ff8f5b-2kjsc 98m 11Mi
php-apache-7495ff8f5b-49vb9 85m 11Mi
php-apache-7495ff8f5b-65r62 100m 11Mi
php-apache-7495ff8f5b-7mn9l 79m 11Mi
php-apache-7495ff8f5b-7njtt 74m 11Mi
php-apache-7495ff8f5b-8n5t6 88m 11Mi
php-apache-7495ff8f5b-spvnh 103m 11Mi
php-apache-7495ff8f5b-w64f4 101m 11Mi
  • 此时Ctrl+C中断测试容器,过一会查看hpa和pod的情况,可以看到平均 CPU 负载已经降到 0 了,但 REPLICAS 还是 8 个,不会立即降低,不要着急,大约5分钟左右 REPLICAS 最终变为 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ k get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 8 26m
$ k top pod
NAME CPU(cores) MEMORY(bytes)
php-apache-7495ff8f5b-2kjsc 1m 11Mi
php-apache-7495ff8f5b-49vb9 1m 11Mi
php-apache-7495ff8f5b-65r62 1m 11Mi
php-apache-7495ff8f5b-7mn9l 1m 11Mi
php-apache-7495ff8f5b-7njtt 1m 11Mi
php-apache-7495ff8f5b-8n5t6 1m 11Mi
php-apache-7495ff8f5b-spvnh 1m 11Mi
php-apache-7495ff8f5b-w64f4 1m 11Mi

# 可以看到hpa的 AGE 在26m时还是8个,30m时就降为1个了
$ k get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30m

删除HPA

1
2
$ k delete hpa php-apache
horizontalpodautoscaler.autoscaling "php-apache" deleted