前言
弹性伸缩是开发者使用容器过程中非常关注的特性,如果从资源类型的角度来讲,可以分为物理资源的弹性伸缩与容器资源的弹性伸缩。在本篇中,主要向大家介绍的是容器资源的弹性伸缩,在Kubernetes中,HPA(Horizontal Pod Autoscaling)是用来抽象容器水平弹性伸缩的概念。开发者可以通过定义HPA的yaml配置,快速实现容器水平伸缩。
原理
在Kubernetes中,Pod的负载是通过Heapster进行采集的(新版本中可以通过Metrics Server进行采集),HPA Controller通过定期(定期轮询的时间通过–horizontal-pod-autoscaler-sync-period选项来设置,默认的时间为30秒)查询Pod当前系统的负载来自动水平扩容,如果系统负载超过预定值,就开始增加Pod的个数,如果低于某个值,就自动减少Pod的个数。
使用方式
下面我们针对一个Nginx应用进行举例:
apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9 # replace it with your exactly <image_name:tags>
ports:
- containerPort: 80
resources:
requests:
cpu: 500m
创建HPA,通过scaleTargetRef设置当前HPA绑定的对象,在本例中绑定是名叫nginx
的Deployment
。
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1beta2
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50
注意:HPA需要给Pod设置request资源,如果没有request资源,HPA是不会运行的,kubectl describe hpa [name]
会发现有类似如下的warnning。
Warning FailedGetResourceMetric 2m (x6 over 4m) horizontal-pod-autoscaler missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5897-mqzs7
Warning FailedComputeMetricsReplicas 2m (x6 over 4m) horizontal-pod-autoscaler failed to get cpu utilization: missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5
创建好HPA后,我们再次执行kubectl describe hpa [name]
命令,可以看到如下信息,则表示HPA已经正常运行。
Normal SuccessfulRescale 39s horizontal-pod-autoscaler New size: 1; reason: All metrics below target
此时当Nginx的Pod的利用率超过如上图所示的50%的利用率时,则会进行水平扩容,低于50%的时候会进行缩容。
使用容器服务部署支持HPA的Deployment
在阿里云容器服务中,已经集成了HPA,开发者可以非常简单的通过UI进行创建。
- 点击左侧菜单的
部署
,选择镜像创建
。
- 填写应用的名称和相应的配置信息,设置资源的所需资源。
- 勾选自动伸缩的
开启
,设置伸缩的条件和配置。
- 此时一个支持HPA的Deployment就已经创建完毕了,可以在部署的详情中查看伸缩组信息。
- 验证弹性伸缩,通过给Pod进行CPU压测,可以发现Pod在半分钟内即可完成水平的扩展。
最后
HPA是Kubernetes中最常使用的伸缩方式,除此之外,HPA还可以结合autoscaler同时使用,当HPA弹出的容器无法进行调度的时候,autoscaler会自动弹出节点,并将HPA所期望的容器运行在弹出的节点上。关于autoscaler的部分,可以参考阿里云上弹性伸缩kubernetes集群 - autoscaler。