在k8s项目中,发现pod的扩缩容和自己预期不相符,阈值设置的是80%,cpu已经到阈值了,怎么还不扩容呢?业务高峰期能不能让pod提前扩容呢?这都涉及到pod的扩缩容机制,以下简单介绍最常用的两种扩缩容机制HPA和CronHPA
HPA 工作原理
HPA是一个间歇运行的控制循环(它不是一个连续的过程)。间隔由 kube-controller-manager配置中--horizontal-pod-autoscaler-sync-period
参数设置kube-controller-manager (默认间隔为15秒)。
在每个周期内,控制器管理器都会根据每个 HorizontalPodAutoscaler 定义中指定的指标查询资源利用率。控制器管理器找到 定义的目标资源scaleTargetRef
,然后根据目标资源的标签选择 pod.spec.selector
,并从资源指标 API(针对每个 pod 资源指标)或自定义指标 API(针对所有其他资源指标)获取指标。
-
对于每个 Pod 资源指标(如 CPU),控制器从 HorizontalPodAutoscaler 所针对的每个 Pod 的资源指标 API 中获取指标。 然后,如果设置了目标利用率值,则控制器会计算利用率值占每个 Pod 中容器上的等效资源请求的百分比 。如果设置了目标原始值,则直接使用原始指标值。然后,控制器获取所有目标 Pod 的利用率或原始值(取决于指定的目标类型)的平均值,并生成用于缩放所需副本数量的比率。
请注意,如果某些 Pod 的容器没有设置相关的资源请求,则不会定义 Pod 的 CPU 利用率,并且自动缩放器不会对该指标采取任何操作。有关自动缩放算法如何工作的更多信息,请参阅下面的算法详细信息部分。
-
对于每个 Pod 自定义指标,控制器的功能与每个 Pod 资源指标类似,注意:只是自定义指标的原始值,而不是利用率。
-
对于对象指标和外部指标,将获取单个指标,该指标描述了相关对象。将该指标与目标值进行比较,以产生上述比率。在
autoscaling/v2
API 版本中,可以选择在进行比较之前将该值除以 Pod 的数量。
HPA值获取方式: 通过聚合API 实现( metrics.k8s.io
、custom.metrics.k8s.io
、 external.metrics.k8s.io
)。常用的API :metrics.k8s.io
由名为 Metrics Server 的附加组件提供,需要单独启动。
HPA算法细节
HPA控制器根据所需指标值与当前指标值之间的比率进行判断是否进行扩缩容:
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
即当前副本数*(当前指标值/期望指标值),结果向上取整
- HPA默认5 分钟给出一次扩缩建议,参数:--horizontal-pod-autoscaler-downscale-stabilization,意味着默认情况,每5分钟调整一次pod数量,
- HPA容忍误差值为0.1,即假设CPU设置70%扩缩容,HPA认为在CPU在[63%,77%]都是合理范围
- 如果在 HPA中指定了多个指标,则会针对每个指标进行此计算,然后选择最大的一个指标进行判断扩缩容。如果这些指标中的任何一个无法转换为所需的副本计数(例如,由于从指标 API 获取指标时出现错误),并且可获取的指标建议缩小规模,则将跳过缩放。
desiredReplicas
这意味着如果一个或多个指标给出的值大于当前值,HPA 仍然能够扩展。
容器水平伸缩HPA(Horizontal Pod Autoscaling)
以下是个deployment项目扩缩容样板
test-app项目最小分配pod数量为10,cpu超过70%则扩容,最大pod数量为15
#cpu超过70%扩容,低于则缩容
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: test-app
namespace: test-ns1
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment-basic
maxReplicas: 15
metrics:
#- resource:
# name: memory
# target:
# averageUtilization: 80
# type: Utilization
# type: Resource
- resource:
name: cpu
target:
averageUtilization: 70
type: Utilization
type: Resource
minReplicas: 10
容器定时伸缩CronHPA(CronHorizontal Pod Autoscaler)
这是阿里开源的一个方案,具体安装见https://github.com/AliyunContainerService/kubernetes-cronhpa-controller
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
labels:
controller-tools.k8s.io: "1.0"
name: test-app
namespace:test-ns1
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment-basic
excludeDates:
# exclude November 15th
- "* * * 15 11 *"
# exclude every Friday
- "* * * * * 5"
jobs:
- name: "scale-down"
schedule: "30 */1 * * * *"
targetSize: 1
- name: "scale-up"
schedule: "0 */1 * * * *"
targetSize: 3
runOnce: false
上面的yml配置了这样一个案例,服务nginx每小时00分扩容3台,每小时30分缩容为一台,且在11月15日及每周五不运行任务
|