青00 (一起学Java)

青00 (一起学Java)

写在前面

【云原生丨Kubernetes系列⑫】Pod⽔平⾃动伸缩(HPA)详解-LMLPHP


HPA介绍

Kubernetes 为我们提供了这样⼀个资源对象: Horizontal Pod Autoscaling (Pod⽔平⾃动伸缩),简称 HPA 。 HAP 通过监控分析 RC 或者 Deployment 控制的所有 Pod 的负载变化情况来确定 是否需要调整 Pod 的副本数量,这是 HPA 最基本的原理。

【云原生丨Kubernetes系列⑫】Pod⽔平⾃动伸缩(HPA)详解-LMLPHP

HPA 在 kubernetes 集群中被设计成⼀个 controller ,我们可以简单的通过 kubectl autoscale 命令来创建⼀个 HPA 资源对象, HPA Controller 默认30s轮询⼀次(可通过 kube-controller-manager 的 标志 --horizontal-pod-autoscaler-sync-period 进⾏设置),查询指定的资源(RC或者 Deployment)中 Pod 的资源使⽤率,并且与创建时设定的值和指标做对⽐,从⽽实现⾃动伸缩的功能。

当你创建了 HPA 后, HPA 会从 Heapster 或者⽤户⾃定义的 RESTClient 端获取每⼀个⼀个 Pod 利⽤率或原始值的平均值,然后和 HPA 中定义的指标进⾏对⽐,同时计算出需要伸缩的具体值并进⾏相应 的操作。⽬前, HPA 可以从两个地⽅获取数据:

  • Heapster:仅⽀持 CPU 使⽤率
  • ⾃定义监控:我们到后⾯的监控的课程中再给⼤家讲解这部分的使⽤⽅法

我们现在来给⼤家介绍从 Heapster 获取监控数据来进⾏⾃动扩缩容的⽅法,所以⾸先我们得安装 Heapster ,前⾯我们在 kubeadm 搭建集群的文章中,实际上已经默认把 Heapster 相关的镜像都已经拉取到节点上了,所以接下来我们只需要部署即可。

我们这⾥使⽤的是 Heapster 1.4.2 版本的,前往 Heapster 的 github ⻚⾯

将该⽬录下⾯的 yaml ⽂件保存到我们的集群上,然后使⽤ kubectl 命令⾏⼯具创建即可,另外创建完成后,如果需要在 Dashboard 当中看到监控图表,我们还需要在 Dashboard 中配置上我们的 heapster-host


HPA自动扩缩容

我们来创建⼀个 Deployment 管理的 Nginx Pod,然后利⽤ HPA 来进⾏⾃动扩缩容。定义 Deployment 的 YAML ⽂件如下:(hap-deploy-demo.yaml)

--- 
apiVersion: apps/v1beta1 
kind: Deployment 
metadata: 
name: hpa-nginx-deploy 
labels: 
app: nginx-demo 
spec: 
revisionHistoryLimit: 15 
template: 
metadata: 
labels: 
app: nginx 
spec: 
containers: 
- name: nginx 
image: nginx 
ports: 
- containerPort: 80 

然后创建 Deployment :

$ kubectl create -f hpa-deploy-demo.yaml 
现在我们来创建⼀个 HPA ,可以使⽤ kubectl autoscale 命令来创建: 
$ kubectl autoscale deployment hpa-nginx-deploy --cpu-percent=10 --min=1 --max=10 
deployment "hpa-nginx-deploy" autoscaled 
··· 
$ kubectl get hpa 
NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE 
hpa-nginx-deploy Deployment/hpa-nginx-deploy 10% 0% 1 10 1 
3s 

此命令创建了⼀个关联资源 hpa-nginx-deploy 的 HPA ,最⼩的 pod 副本数为1,最⼤为10。 HPA 会根据设定的 cpu使⽤率(10%)动态的增加或者减少pod数量。

当然出来使⽤kubectl autoscale命令来创建外,我们依然可以通过创建 YAML ⽂件的形式来创建 HPA 资源对象。如果我们不知道怎么编写的话,可以查看上⾯命令⾏创建的 HPA 的 YAML ⽂件:

$ kubectl get hpa hpa-nginx-deploy -o yaml 
apiVersion: autoscaling/v1 
kind: HorizontalPodAutoscaler 
metadata: 
creationTimestamp: 2017-06-29T08:04:08Z 
name: nginxtest 
namespace: default 
resourceVersion: "951016361" 
selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginxtest 
uid: 86febb63-5ca1-11e7-aaef-5254004e79a3 
spec: 
maxReplicas: 5 //资源最⼤副本数 
minReplicas: 1 //资源最⼩副本数 
scaleTargetRef: 
apiVersion: extensions/v1beta1 
kind: Deployment //需要伸缩的资源类型 
name: nginxtest //需要伸缩的资源名称 
targetCPUUtilizationPercentage: 50 //触发伸缩的cpu使⽤率 
status: 
currentCPUUtilizationPercentage: 48 //当前资源下pod的cpu使⽤率 
currentReplicas: 1 //当前的副本数 
desiredReplicas: 2 //期望的副本数 
lastScaleTime: 2017-07-03T06:32:19Z 

压力测试

现在我们根据上⾯的 YAML ⽂件就可以⾃⼰来创建⼀个基于 YAML 的 HPA 描述⽂件了。 现在我们来增⼤负载进⾏测试,我们来创建⼀个 busybox ,并且循环访问上⾯创建的服务。

$ kubectl run -i --tty load-generator --image=busybox /bin/sh 
If you don't see a command prompt, try pressing enter. 
/ # while true; do wget -q -O- http://172.16.255.60:4000; done 

下图可以看到,HPA已经开始⼯作。

$ kubectl get hpa 
NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE 
hpa-nginx-deploy Deployment/hpa-nginx-deploy 10% 29% 1 10 
27m 

同时我们查看相关资源hpa-nginx-deploy的副本数量,副本数量已经从原来的1变成了3。

$ kubectl get deployment hpa-nginx-deploy 
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE 
hpa-nginx-deploy 3 3 3 3 4d 

同时再次查看 HPA ,由于副本数量的增加,使⽤率也保持在了10%左右。

$ kubectl get hpa 
NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE 
hpa-nginx-deploy Deployment/hpa-nginx-deploy 10% 9% 1 10 3 
5m 

同样的这个时候我们来关掉busybox来减少负载,然后等待⼀段时间观察下 HPA 和 Deployment 对象

$ kubectl get hpa 
NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE 
hpa-nginx-deploy Deployment/hpa-nginx-deploy 10% 0% 1 10 4 
8m
$ kubectl get deployment hpa-nginx-deploy 
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE 
hpa-nginx-deploy 1 1 1 1 4d 

可以看到副本数量已经由3变为1。

不过当前的 HPA 只有 CPU 使⽤率这⼀个指标,还不是很灵活的,在后⾯的课程中我们来根据我们⾃定义的监控来⾃动对 Pod 进⾏扩缩容。


【云原生丨Kubernetes系列⑫】Pod⽔平⾃动伸缩(HPA)详解-LMLPHP

09-24 18:35