Horizontal Pod Autoscaling,Kubernetes会自动地根据观察到的CPU利用率(或者通过一些其他应用程序提供的自定义的指标)自动地缩放在replication controller、deployment或replica set上pod的数量。
Horizontal Pod Autoscaler是作为Kubernetes API resource(K8s API 资源)和controller(控制器)实现的。资源决定控制器的行为。控制器周期性的调整replication controller或deployment中的Pod副本数量,以便将获得的CPU利用率与用户指定的目标利用率匹配。
注意,Horizontal Pod Autoscaling并不适用于不能缩放的对象,例如“DaemonSet”。
根据不同版本的API中,HPA autoscale时靠以下指标来判断资源使用率:
- autoscaling/v1: CPU
- autoscaling/v2alpha1
- 内存
- 自定义metrics
- 多metrics组合: 根据每个metric的值计算出scale的值,并将最大的那个值作为扩容的最终结果
配置HPA 需要在 kube-controller-manager.yaml 添加如下内容:
--horizontal-pod-autoscaler-use-rest-clients=true
--master=<apiserver-address>:<port>
本实验环境基于k8s 1.11,仅使用autoscaling/v1 版本API,注意确保k8s 集群插件 coredns 和 metrics-service 或 heapster(从k8s 1.11开始不建议使用) 工作正常。
# 创建deploy和service
$ kubectl run my-tomcat --image=tomcat:8.0.53-jre7 --requests=cpu=200m --expose --port=8080
# 创建autoscaler
$ kubectl autoscale deploy my-tomcat --cpu-percent=50 --min=1 --max=10
或
$ cat my-tomcat-hpa.yaml
apiVersion: autosacling/v2beta1
Kind: HorizontalPodAutoscaler
metadata:
name: my-tomcat-hpa
spec:
scaleTargetRef:
apiVersion: extensions/v1beta1
kind: Deployment
name: my-tomcat
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resouce:
name: cpu
targetAverageUtilization: 80
- type: Resource
resource:
name: memory
targetAverageValue: 200Mi
# 等待3~5分钟查看hpa状态
$ kubectl get hpa my-tomcat
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
my-tomcat Deployment/my-tomcat 1%/50% 1 10 1 2m
# 在任意主机访问 CLUSTER-IP 加端口
$ while true; do curl -I http://10.254.218.221:8080/; done;
# 等待约5分钟查看hpa显示负载增加,且副本数目增加为3
$ kubectl get hpa my-tomcat
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
my-tomcat Deployment/my-tomcat 108%/50% 1 10 3 5m
# CTRL+C 结束上述循环程序,稍后副本数目变回1
$ kubectl get hpa my-tomcat
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
my-tomcat Deployment/my-tomcat 1%/50% 1 10 3 11m
$ kubectl get hpa my-tomcat
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
my-tomcat Deployment/my-tomcat 0%/50% 1 10 1 31m
# 清除测试环境
$ kubectl delete deployment my-tomcat
$ kubectl delete deployment my-tomcat