HOOOS

别再盲目扩缩容!K8s 自定义指标伸缩全攻略,教你精准拿捏资源利用率

0 106 K8s老司机 KubernetesHPA自定义指标
Apple

“哎,集群又双叒叕告警了!CPU 飙到 90% 了,赶紧扩容!”

“等等,先看看其他指标,内存才用了 50%,流量也没啥变化,是不是有啥异常?”

相信不少运维小伙伴都经历过类似的场景。在 Kubernetes(K8s)集群中,如何根据业务负载进行弹性伸缩,是保障服务稳定性和资源利用率的关键。K8s 自带的 HPA(Horizontal Pod Autoscaler)虽然能基于 CPU、内存等指标自动扩缩容,但面对复杂的业务场景,往往显得力不从心。

别担心,今天我就来给大家支个招,教你玩转 K8s 自定义指标伸缩,让你的集群资源利用率更上一层楼!

为什么需要自定义指标?

在深入讲解之前,咱们先来聊聊,为什么 K8s 自带的指标不够用,非得搞自定义指标?

想象一下,你的应用是个“偏科生”,CPU 消耗不高,但内存或者磁盘 IO 却是个“大胃王”。这时候,只盯着 CPU 使用率来扩缩容,就可能导致应用因内存不足而崩溃,或者因磁盘 IO 瓶颈而响应缓慢。

再比如,你的应用是个“慢性子”,即使负载很高,CPU 和内存也不会立刻飙升,而是需要一段时间才能体现出来。这时候,如果只根据当前的 CPU 和内存指标来扩缩容,就可能导致扩容不及时,影响用户体验。

还有些应用,它的负载跟某些外部因素密切相关,比如消息队列的长度、数据库的连接数等等。这些因素,K8s 自带的指标根本无法反映。

总之,K8s 自带的指标就像“通用药”,能治一些“常见病”,但对于“疑难杂症”,就得靠“特效药”——自定义指标。

如何选择合适的自定义指标?

既然自定义指标这么重要,那该如何选择呢?别急,我给你总结了几个原则:

  1. 相关性:指标必须与应用的负载密切相关,能够真实反映应用的运行状态。
  2. 可观测性:指标必须能够被 K8s 监控系统采集到,并且能够方便地查询和展示。
  3. 实时性:指标必须能够及时反映应用的负载变化,不能有明显的延迟。
  4. 稳定性:指标不能频繁波动,否则会导致 HPA 频繁扩缩容,影响服务稳定性。
  5. 可预测性:指标的变化趋势应该是可预测的,这样才能更好地设置目标值。

除了以上原则,你还需要结合应用的具体特点来选择指标。下面我举几个常见的例子:

  • Web 应用:除了 CPU、内存,还可以关注 QPS(每秒查询率)、RT(响应时间)、错误率等指标。
  • 消息队列:可以关注队列长度、消息堆积时间、消费者数量等指标。
  • 数据库:可以关注连接数、活跃连接数、慢查询数量等指标。
  • 缓存:可以关注命中率、缓存穿透率、缓存击穿率等指标。

如何采集自定义指标?

选好了指标,下一步就是采集了。目前,业界主流的 K8s 指标采集方案有两种:

  1. Prometheus + Custom Metrics Adapter:这是最常用的方案。Prometheus 负责采集应用的自定义指标,Custom Metrics Adapter 负责将 Prometheus 的指标转换为 K8s 可以识别的格式。
  2. Metrics Server + Custom Metrics API:这种方案比较轻量级,但功能相对简单,适合一些简单的场景。

这里,我重点介绍第一种方案,因为它是目前最成熟、最灵活的方案。

Prometheus

Prometheus 是一个开源的监控系统,它通过 HTTP 协议从应用的 Exporter 中拉取指标数据。Exporter 是一个将应用内部指标暴露给 Prometheus 的组件,你可以自己开发,也可以使用现成的 Exporter。

Custom Metrics Adapter

Custom Metrics Adapter 是一个将 Prometheus 指标转换为 K8s Custom Metrics API 格式的适配器。它通过查询 Prometheus 获取指标数据,然后将数据转换为 K8s 可以识别的格式,供 HPA 使用。

安装和配置

安装和配置 Prometheus 和 Custom Metrics Adapter 的过程比较繁琐,这里我就不详细展开了,网上有很多教程可以参考。你需要重点关注以下几个方面:

  • Prometheus 的配置:你需要配置 Prometheus 的抓取目标(即你的应用的 Exporter),以及抓取间隔等参数。
  • Custom Metrics Adapter 的配置:你需要配置 Custom Metrics Adapter 连接 Prometheus 的地址,以及将哪些 Prometheus 指标转换为 K8s Custom Metrics API 的指标。

如何设置合理的目标值?

采集到自定义指标后,最后一步就是设置 HPA 的目标值了。目标值设置得是否合理,直接关系到扩缩容的效果。

目标值太低,会导致频繁扩容,浪费资源;目标值太高,会导致扩容不及时,影响服务质量。

那么,如何设置合理的目标值呢?我给你几个建议:

  1. 压力测试:通过压力测试,摸清应用的性能瓶颈,找到指标与负载之间的关系,然后根据这个关系来设置目标值。
  2. 历史数据分析:分析应用的历史指标数据,找出指标的正常范围和波动规律,然后根据这个范围和规律来设置目标值。
  3. 逐步调整:先设置一个保守的目标值,然后根据实际运行情况逐步调整,直到找到一个最佳的目标值。
  4. 留有余量:为了应对突发流量,建议在目标值的基础上留有一定的余量。

案例分析

说了这么多理论,咱们来个实战案例,让你更好地理解自定义指标伸缩的应用。

假设我们有一个 Web 应用,它的负载主要取决于 QPS。我们希望在 QPS 超过 1000 时进行扩容,低于 500 时进行缩容。

  1. 选择指标:我们选择 QPS 作为自定义指标。
  2. 采集指标:我们使用 Prometheus + Custom Metrics Adapter 方案。我们开发了一个 Exporter,将应用的 QPS 暴露给 Prometheus。然后,我们配置 Custom Metrics Adapter 将 Prometheus 的 QPS 指标转换为 K8s Custom Metrics API 的指标。
  3. 设置目标值:我们通过压力测试发现,当 QPS 超过 1000 时,应用的响应时间会明显增加。因此,我们将 HPA 的目标值设置为 1000。
  4. 配置 HPA:我们创建一个 HPA 对象,指定目标指标为 QPS,目标值为 1000,最小副本数为 1,最大副本数为 10。

配置完成后,HPA 会自动根据 QPS 的变化来调整应用的副本数。当 QPS 超过 1000 时,HPA 会自动扩容;当 QPS 低于 500 时,HPA 会自动缩容。

总结

自定义指标伸缩是 K8s 弹性伸缩的重要组成部分,它可以帮助你更好地应对复杂的业务场景,提高资源利用率,保障服务稳定性。希望通过本文的介绍,你能对自定义指标伸缩有一个更深入的了解,并在实际工作中灵活运用。

记住,没有一成不变的方案,只有最适合自己的方案。你需要根据应用的具体特点,选择合适的指标,采集指标,设置合理的目标值,才能真正发挥自定义指标伸缩的威力。

最后,我想说,K8s 的世界里,还有很多值得探索的东西。让我们一起学习,一起进步,共同打造更稳定、更高效的 K8s 集群!

点评评价

captcha
健康