Horizontal Pod Autoscaler
可以根据CPU利用率自动伸缩 replication controller、deployment 或者 replica set 中的Pod数量 (也可以基于其他应用程序提供的度量指标,目前这一功能处于 beta 版本)。
为了演示 Horizontal Pod Autoscaler,我们将使用一个基于 php-apache 镜像的定制 Docker 镜像hpa-example。
然后用deployment控制器运行。
[root@server2 hpa]# cat php-apache.yml
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: hpa-example /镜像名
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m /请求200m的cpu
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
然后再对应这个应用创建一个HPA,来实现自动伸缩。
既然服务器已经在运行,我们将使用kubectl autoscale
创建autoscale
r。下面的命令将创建一个水平Pod Autoscaler
,它维护由我们创建的php-apache
部署控制的Pods的1到10个副本。粗略地说,HPA将增加或减少副本的数量(通过部署),以保持所有Pods的平均CPU利用率为50% (因为kubectl运行时每个pod请求200毫核),这意味着平均CPU使用量为100毫核)。
这些数据的来源就是我们通过 Metrics-Server 对资源的监控.
[root@server2 hpa]# kubectl apply -f php-apache.yml
deployment.apps/php-apache created
service/php-apache created
[root@server2 hpa]# kubectl get pod
NAME READY STATUS RESTARTS AGE
php-apache-dfb6d784b-vkjw9 1/1 Running 0 2m45s
[root@server2 hpa]# kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10 /创建hpa
horizontalpodautoscaler.autoscaling/php-apache autoscaled
[root@server2 hpa]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache /50% 1 10 0 8s
/当前不显示,因为还没有资源的流入
[root@server2 ~]# kubectl top pod
NAME CPU(cores) MEMORY(bytes)
php-apache-dfb6d784b-vq99l 1m 5Mi /当前我们的cpu使用率值有1m
[root@server2 ~]# watch -n 1 kubectl top pod /进行监控
Every 1.0s: kubectl top pod
NAME CPU(cores) MEMORY(bytes)
php-apache-dfb6d784b-vq99l 1m 5Mi
我们可以通过访问,使cpu使用增大:
[root@server2 hpa]# kubectl run demo --image=busybox -it
If you don't see a command prompt, try pressing enter.
/ # while true; do wget -q -O- http://php-apache; done /这是一个循环,不ctrl+c 不会结束
OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!...
这里的http://php-apache 是我们刚才创建了svc,我们就可以通过dns的解析值解访问svc名就可以了。
Every 1.0s: kubectl top pod
NAME CPU(cores) MEMORY(bytes)
demo 7m 0Mi
php-apache-dfb6d784b-vq99l 501m 8Mi
这时的cpu已经使用了501m了,我们就可以计算得出500/200*0.5=5个,所以会调整到5个pod来维持cpu的平均利用率。
Every 1.0s: kubectl top pod
NAME CPU(cores) MEMORY(bytes)
demo 0m 0Mi
php-apache-dfb6d784b-jfmjv 151m 8Mi
php-apache-dfb6d784b-jt6rw 149m 8Mi
php-apache-dfb6d784b-k8kp6 158m 8Mi
php-apache-dfb6d784b-nfqcx 154m 8Mi
php-apache-dfb6d784b-vq99l 152m 8Mi
它的cpu还一致在增加,而且它还会继续的往下拉伸。
HPA伸缩过程:
CPU utilization的计算方法是用cpu usage(最近一分钟的平均值,通过metrics可以直接获取到)除以cpu request(这里cpu request就是我们在创建容器时制定的cpu使用核心数)得到一个平均值,这个平均值可以理解为:平均每个Pod CPU核心的使用占比。
就拿上面的5个pod来说
152+154+158+151+149=764
(764/5)/(200*0.5)=1.52 > 1.1 ,所以还会继续扩容,但是要等待3分钟的冷却,因为在创建pod的时候cpu会升蒿,数据就不准确了,所以要等稳定后再去采集。
同样的我们结束刚才的那条命令,等待cpu使用量降下来了hpa的值<0.9,我们的pod就会自动进行缩容。
Every 1.0s: kubectl top pod
NAME CPU(cores) MEMORY(bytes)
demo 0m 0Mi
php-apache-dfb6d784b-nfqcx 1m 8Mi
现在已经缩到一个了
只通过cpu来决定扩容格会缩容是不够的.我们还可以通过集群中其他能够获取到的指标进行伸缩。比如流量,每秒请求数。
[root@server2 hpa]# kubectl get hpa php-apache -oyaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
我们当前使用的版本是 v1 版本,我们可以适用 v2 (beta1,beta2)版本进行多的角度的自动伸缩。
这次我们用文件的方式进行修改:
[root@server2 hpa]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 59m
[root@server2 hpa]# vim hpa.yml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache /名字和当前的hpa名字相同
spec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
metrics:
- type: Resource
resource:
name: cpu
target:
averageUtilization: 60 / 50%调到60%
type: Utilization
- type: Resource
resource:
name: memory /加入了内存的限制
target:
averageValue: 50Mi
type: AverageValue
[root@server2 hpa]# kubectl apply -f hpa.yml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
horizontalpodautoscaler.autoscaling/php-apache configured
[root@server2 hpa]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 1m/50Mi, /60% 1 10 1 60m
生效了。剩下的操作就类似于基于cpu的操作