Horizontal Pod Autoscaling - HPA
HPA 与之前的 Deployment、Service 一样,也属于一种 K8S 资源对象。
HPA 的目标是希望通过追踪集群中所有 Pod 的负载变化情况,来自动化地调整 Pod 的副本数,以此来满足应用的需求和减少资源的浪费。
HAP 度量 Pod 负载变化情况的指标有两种:
- CPU 利用率(CPUUtilizationPercentage)
- 自定义的度量指标,比如服务在每秒之内的请求数(TPS 或 QPS)
如何统计和查询这些指标,要依托于组件Heapster。Heapster 会监控一段时间内集群内所有 Pod 的 CPU 利用率的平均值或者其他自定义的值,在满足条件时(比如 CPU 使用率超过 80% 或 降低到 10%)会将这些信息反馈给 HPA 控制器,HPA 控制器就根据 RC 或者 Deployment 的定义调整 Pod 的数量。
Theory
autoscaler(自动扩容器)的实现方式是一个循环,它通过定期通过 Status.PodSelector 来查询Pods的状态,获得他们的CPU使用率。然后,它通过现有Pods的CPU使用率的算数平均值跟目标使用率进行比较,并且在扩容的时候,还要遵循预先设定的副本数限制:MinReplicas <= Replicas <= MaxReplicas(MinReplicas是用户预先设置的最小副本数,MaxReplicas是用户预先设置的最大副本数)
定期轮询的时间通过–horizontal-pod-autoscaler-sync-period选项来设置,默认的时间为30秒。
CPU利用率是指最近的Pod使用量(最近一分钟的平均值,从heapster中获得)除以设定的每个Pod的CPU使用率限额,在kubernetes1.1版本中,CPU的使用率直接从Heapster中获得,将来,我们将从Master提供的API中获得。
计算扩容后Pod的个数计算公式:TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)
CurrentPodsCPUUtilization 为最近一分钟内某个Pod的CPU使用率/量的平均值
Target CPU使用上限
自动扩容的流程:
- 创建HPA资源,设定目标CPU使用率限额,以及最大、最小实例数;
- 收集一组中(PodSelector)每个Pod最近一分钟内的CUP使用率,并计算平均值;
- 读取HPA中设定的CPU使用限额;
- 计算:平均值之和/限额,求出目标调整的实例个数;
- 目标调整的实例数不能超过1中设定的最大、最小实例数,如果没有超过,则扩容;超过,则扩容至最大的实例个数;
- 默认情况每隔30秒做一次自动扩容判断。
Example:假设一组Pod中有三个实例,CPU限额为50%,当前的CPU使用率/量分别为:60%, 80%, 80%时,要扩容成多少实例呢?
(60%+80%+80%)/ 50% = 4.4,4.4取整后为4,即应该扩容到4个实例。
启动、停止Pod可能会引入噪声度量(例如,启动过程会暂时增加cpu的使用),所以,在每次起/停操作后,自动扩容器会等待一段时间(冷却时间),以获得更可靠的数据。扩容每次要冷却3分钟之后才能再次扩容,缩容要冷却5分钟。
实现方式:
- 配置文件
- 命令行
配置文件
1 | apiVersion: autoscaling/v1 |
- scaleTargetRef 字段指定需要管理的 Deployment/RC 的名字,也就是提前需要存在一个 Deployment/RC 对象。
- minReplicas 和 maxReplicas 字段定义 Pod 可伸缩的数量范围。这个例子中扩容最高不能超过 10 个,缩容最低不能少于 1 个。
- targetAverageUtilization 指定 CPU 使用率,也就是自动扩容和缩容的触发条件,当 CPU 使用率超过 50% 时会触发自动动态扩容的行为,当回落到 50% 以下时,又会触发自动动态缩容的行为。
命令行
kubectl autoscale deployment php-apache –cpu-percent=50 –min=1 –max=10
Command
Force delete
1 | kubectl delete pods pod-name --grace-period=0 --force |
If even after these commands the pod is stuck on Unknown state, use the following command to remove the pod from the cluster:
1 | kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}' |
Running with Shell
1 | kubectl run pod-name -i --rm --image nginx:lastes -- sh -c |
1 | Examples: |
Adding or updating labels for existing clusters
1 | gcloud container clusters update [CLUSTER_NAME] --update-labels [KEY]=[VALUE] |
Remove labels for existing clusters
1 | gcloud container clusters update example-cluster --remove-labels env=dev |
Reference
- [Kubernetes 1.2 新功能介绍:自动扩容算法] http://www.dockerinfo.net/1095.html
- https://www.cnblogs.com/bakari/p/10620592.html