Kubernetes HPA(Horizontal Pod Autoscaling)Pod水平自动伸缩,通过此功能,只需简单的配置,集群便可以利用监控指标(cpu 使用率等)自动的扩容或者缩容服务中Pod数量,当业务需求增加时,系统将为您无缝地自动增加适量容器 ,提高系统稳定性。本文将详细讲解 HPA 的核心设计原理和基于 Hepaster 的使用方法。
Kubernetes HPA(Horizontal Pod Autoscaling)Pod水平自动伸缩,通过此功能,只需简单的配置,集群便可以利用监控指标(cpu 使用率等)自动的扩容或者缩容服务中Pod数量,当业务需求增加时,系统将为您无缝地自动增加适量容器 ,提高系统稳定性。本文将详细讲解 HPA 的核心设计原理和基于 Hepaster 的使用方法。
HPA 在kubernetes中被设计为一个 controller,可以简单的使用kubectl autoscale 命令来创建。HPA Controller 默认 30 秒轮询一次,查询指定的 resource 中(Deployment,RC)的资源使用率,并且与创建时设定的值和指标做对比,从而实现自动伸缩的功能。
Ceil(前采集到的使用率 / 用户自定义的使用率) * Pod数量)
下面是一个标准的基于 heapster 的 HPA 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
创建 Heapster ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: heapster
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
创建 Heapster deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: heapster-v1.4.0-beta.0
namespace: kube-system
labels:
k8s-app: heapster
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
version: v1.4.0-beta.0
spec:
replicas: 1
selector:
matchLabels:
k8s-app: heapster
version: v1.4.0-beta.0
template:
metadata:
labels:
k8s-app: heapster
version: v1.4.0-beta.0
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ''
spec:
containers:
- image: ccr.ccs.tencentyun.com/library/heapster-amd64:v1.4.0-beta.0
name: heapster
livenessProbe:
httpGet:
path: /healthz
port: 8082
scheme: HTTP
initialDelaySeconds: 180
timeoutSeconds: 5
command:
- /heapster
- --source=kubernetes.summary_api:''
- image: ccr.ccs.tencentyun.com/library/addon-resizer:1.7
name: heapster-nanny
resources:
limits:
cpu: 50m
memory: 90Mi
requests:
cpu: 50m
memory: 90Mi
command:
- /pod_nanny
- --cpu=80m
- --extra-cpu=0.5m
- --memory=140Mi
- --extra-memory=4Mi
- --threshold=5
- --deployment=heapster-v1.4.0-beta.0
- --container=heapster
- --poll-period=300000
- --estimator=exponential
serviceAccountName: heapster
创建 Heapster Service
kind: Service
apiVersion: v1
metadata:
name: heapster
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/name: "Heapster"
spec:
ports:
- port: 80
targetPort: 8082
selector:
k8s-app: heapster
保存上述的文件,并使用 kubectl create -f FileName.yaml 创建,当创建完成后,可以使用 kubectl get 查看
$ kubectl get deployment heapster-v1.4.0-beta.0 -n=kube-system
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
heapster-v1.4.0-beta.0 1 1 1 1 1m
$ kubectl get svc heapster -n=kube-system
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
heapster 172.16.255.119 <none> 80/TCP 4d
创建一个用于测试的服务,可以选择从控制台创建,实例数量设置为 1
现在,我们要创建一个 HPA,可以使用如下命令
$ kubectl autoscale deployment nginxtest --cpu-percent=10 --min=1 --max=10
deployment "nginxtest" autoscaled
$ kubectl get hpa
NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
nginxtest Deployment/nginxtest 10% 0% 1 10 13s
此命令创建了一个关联资源 nginxtest 的 HPA,最小的 pod 副本数为 1,最大为 10。HPA 会根据设定的 cpu 使用率(10%)动态的增加或者减少 pod 数量,此地方用于测试,所以设定的伸缩阈值会比较小。
我们来创建一个 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
nginxtest Deployment/nginxtest 10% 29% 1 10 27m
同时我们查看相关资源 nginxtest 的副本数量,副本数量已经从原来的 1 变成了 3。
$ kubectl get deployment nginxtest
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginxtest 3 3 3 3 4d
同时再次查看 HPA,由于副本数量的增加,使用率也保持在了 10%左右。
$ kubectl get hpa
NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
nginxtest Deployment/nginxtest 10% 9% 1 10 35m
我们关掉刚才的 busbox 并等待一段时间。
$ kubectl get hpa
NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
nginxtest Deployment/nginxtest 10% 0% 1 10 48m
$ kubectl get deployment nginxtest
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginxtest 1 1 1 1 4d
可以看到副本数量已经由 3 变为 1。
本文主要介绍了 HPA 的相关原理和使用方法,此功能可以能对服务的容器数量做自动伸缩,对于服务的稳定性是一个很好的提升。但是当前稳定版本中只有 cpu 使用率这一个指标,是一个很大的弊端。我们会继续关注社区 HPA 自定义监控指标的特性,待功能稳定后,会持续输出相关文档。