Kubernetes Pod水平自动伸缩(HPA)

HPA简介

HAP,全称 Horizontal Pod Autoscaler, 能够基于 CPU 利用率自动扩缩 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 数量。 除了 CPU 利用率,也能够基于其余应程序提供的自定义度量指标来执行自动扩缩。 Pod 自动扩缩不适用于没法扩缩的对象,好比 DaemonSet。
Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。 控制器会周期性的调整副本控制器或 Deployment 中的副本数量,以使得 Pod 的平均 CPU 利用率与用户所设定的目标值匹配。node

<span class="colour" style="color:rgb(51, 51, 51)">Pod HAP工做机制示意图</span>nginx

实际生产中,普遍使用这四类指标:
一、Resource metrics - CPU核内存利用率指标
二、Pod metrics - 例如网络利用率和流量
三、Object metrics - 特定对象的指标,好比Ingress, 能够按每秒使用请求数来扩展容器
四、Custom metrics - 自定义监控,好比经过定义服务响应时间,当响应时间达到必定指标时自动扩容算法

<span class="colour" style="color:rgb(51, 51, 51)">好了,概念就说这些,想了解更多,请参看官网,如今开始实战。</span>apache

示例

<span class="colour" style="color:rgb(51, 51, 51)">一、首先咱们部署一个nginx,副本数为2,请求cpu资源为200m。同时为了便宜测试,使用NodePort暴露服务。命名空间:hpa</span>api

apiVersion: apps/v1 kind: Deployment metadata:   labels:     app: nginx   name: nginx   namespace: hpa spec:   replicas: 2   selector:     matchLabels:       app: nginx   template:     metadata:       labels:         app: nginx     spec:       containers:       - image: nginx         name: nginx         resources:           requests:             cpu: 200m             memory: 100Mi --- apiVersion: v1 kind: Service metadata:   name: nginx   namespace: hpa spec:   type: NodePort   ports:   - port: 80     targetPort: 80   selector:     app: nginx

<span class="colour" style="color:rgb(51, 51, 51)">二、查看部署结果</span>网络

[root@k8s-node001 HPA]# kubectl  get po -n hpa NAME                     READY   STATUS    RESTARTS   AGE nginx-5c87768685-48b4v   1/1     Running   0          8m38s nginx-5c87768685-kfpkq   1/1     Running   0          8m38s

三、建立HPA
简单说下:这里建立一个HPA,用于控制咱们上一步骤中建立的 Deployment,使 Pod 的副本数量维持在 1 到 10 之间。
HPA 将经过增长或者减小 Pod 副本的数量(经过 Deployment)以保持全部 Pod 的平均 CPU 利用率在 50% 之内。
算法参见app

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

<span class="colour" style="color:rgb(51, 51, 51)">四、查看部署结果</span>测试

[root@k8s-node001 HPA]# kubectl  get hpa -n hpa NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE nginx   Deployment/nginx   0%/50%      1                10                 2          50s

五、压测,观察Pod数和HPA变化
执行压测命令spa

[root@k8s-node001 ~]# ab -c 1000 -n 100000000 http://192.168.100.185:30792/ This is ApacheBench, Version 2.3 <$Revision: 1843412 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.100.185 (be patient)

<span class="colour" style="color:rgb(51, 51, 51)">观察变化</span>.net

[root@k8s-node001 HPA]#  kubectl  get hpa -n hpa NAME    REFERENCE          TARGETS    MINPODS   MAXPODS   REPLICAS   AGE nginx   Deployment/nginx   303%/50%   1         10        7          12m  [root@k8s-node001 HPA]# kubectl  get po -n hpa NAME                         READY   STATUS    RESTARTS   AGE pod/nginx-5c87768685-6b4sl   1/1     Running   0          85s pod/nginx-5c87768685-99mjb   1/1     Running   0          69s pod/nginx-5c87768685-cls7r   1/1     Running   0          85s pod/nginx-5c87768685-hhdr7   1/1     Running   0          69s pod/nginx-5c87768685-jj744   1/1     Running   0          85s pod/nginx-5c87768685-kfpkq   1/1     Running   0          27m pod/nginx-5c87768685-xb94x   1/1     Running   0          69s

从以上输出能够看出,hpa TARGETS达到了303%,须要扩容。pod数自动扩展到了7个。
继续等待压测结束或者直接打断压测

[root@k8s-node001 ~]# kubectl get hpa -n hpa NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE nginx   Deployment/nginx   20%/50%   1         10        7          16m  。。。N分钟后。。。  [root@k8s-node001 ~]# kubectl get hpa -n hpa NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE nginx   Deployment/nginx   0%/50%    1         10        7          18m  。。。再过N分钟后。。。  [root@k8s-node001 ~]# kubectl  get po -n hpa NAME                     READY   STATUS    RESTARTS   AGE nginx-5c87768685-jj744   1/1     Running   0          11m

这时,CPU 利用率已经降到 0,因此 HPA 将自动缩减副本数量至 1。
这里须要注意下:为何会将副本数降为1,而不是咱们部署时指定的replicas: 2呢?
由于在建立HPA时,指定了副本数范围,这里是minReplicas: 1,maxReplicas: 10。因此HPA在缩减副本数时减到了1。
Tips: 自动扩缩完成副本数量的改变可能须要几分钟的时间。

总结

<span class="colour" style="color:rgb(51, 51, 51)"></span>

相关文章
相关标签/搜索