摘要:(hpa简介)
Horizontal Pod Autoscaling(Pod 水平自动伸缩),简称HPA,K8S通过对Pod中运行的容器各项指标(CPU占用、内存占用、网络请求量)的检测,实现对(ReplicationController、 Deployment、ReplicaSet 或 StatefulSet 中的)Pod实例个数的动态新增和减少。
前言:
在kubernetes中,我们使用pod对外提供服务。这时候,我们需要以下两种情形需要关注:
- pod因为不明原因挂掉,导致服务不可用
- Pod在高负荷的情况下,不能支撑我们的服务
如果我们人工监控pods,人工进行调整副本那么这个工作量无疑是巨大的,但kubernetes已经有了相应的机制来应对了。
那么今天就来介绍一下在k8s 1.6中的弹性伸缩的实施
k8s是kubernetes的官方简称,HPA全称Horizontal Pod Autoscaler
官方文档参考:https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
HPA原理
Kubernetes有一个HPA(Horizontal Pod Autoscaler)的资源,可以实现基于CPU使用率的Pod自动伸缩的功能。HPA基于Master Node上的kube-controller-manager服务启动参数–horizontal-pod-autoscaler-sync-period定义的时长(默认为30秒),周期性的检测Pod的CPU使用率(需要事先安装heapster)。如果需要设置–horizontal-pod-autoscaler-sync-period可以在Master Node上的/etc/default/kube-controller-manager中修改。
早期的kubernetes版本,只支持CPU指标的检测,因为它是通过kubernetes自带的监控系统heapster实现的。
到了kubernetes 1.8版本后,heapster已经弃用,资源指标主要通过metrics api获取,这时能支持检测的指标就变多了(CPU、内存等核心指标和qps等自定义指标)
HPA创建方式
1、文本方式创建(HPA是一种资源对象,通过yaml进行配置:)
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: smb-api-service-hpa
spec:
maxReplicas: 5
minReplicas: 2
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ template "smbApiService.fullname" . }}
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 80
- type: Resource
resource:
name: memory
targetAverageValue: 200Mi
参数介绍:
minReplicas: 最小pod实例数
maxReplicas: 最大pod实例数
metrics: 用于计算所需的Pod副本数量的指标列表
resource: 核心指标,包含cpu和内存两种(被弹性伸缩的pod对象中容器的requests和limits中定义的指标。)
object: k8s内置对象的特定指标(需自己实现适配器)
pods: 应用被弹性伸缩的pod对象的特定指标(例如,每个pod每秒处理的事务数)(需自己实现适配器)
external: 非k8s内置对象的自定义指标(需自己实现适配器)
可以指定资源度量指标使用绝对数值,而不是百分比,你需要将 target.type 从 Utilization 替换成 AverageValue,同时设置 target.averageValue 而非 target.averageUtilization 的值。
2、命令行创建 Horizontal Pod Autoscaler
创建hpa用于控制创建的Deployment,使 Pod 的副本数量维持在 1 到 10 之间。 大致来说,HPA 将(通过 Deployment)增加或者减少 Pod 副本的数量以保持所有 Pod 的平均 CPU 利用率在 50% 左右。由于每个 Pod 请求 200 毫核的 CPU,这意味着平均 CPU 用量为 100 毫核。
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
我们可以通过以下命令查看 Autoscaler 的状态:
kubectl get hpa
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 0% / 50% 1 10 1 18s
通过 kubectl describe hpa
命令来查看 HPA 对象的详细信息
通过 kubectl delete hpa
命令删除对象。
总结
1、应用场景
HPA的特性结合第三方的监控应用,使得部署在HPA伸缩对象(statefulSet、replicaController、replicaSet)上的服务有了非常灵活的自适应能力,能够在一定限度内复制多个副本来应对某个指标的急剧飙升,也可以在某个指标较小的情况下删除副本来让出计算资源给其他更需要资源的应用使用,维持整个系统的稳定。非常适合于一些流量波动大,机器资源吃紧,服务数量多的业务场景,如:电商服务、抢票服务、金融服务等。
2、除了上述演示的CPU、内存两种resource metric(资源度量指标)外,还有两种其他类型的度量指标,他们被认为是 custom metrics(自定义度量指标)与Kubernetes 对象无关的度量指标(external metrics),这些度量指标可能具有特定于集群的名称,并且需要更高级的集群监控设置。