如何根据 celery 任务队列中的任务数自动扩展 Kubernetes Pods?

sy_*_*001 5 celery kubernetes

我在 Kubernetes pods 上部署了一个 celery worker,它执行一个任务(CPU 不是很密集,但由于一些 HTTP 调用需要一些时间才能完成)。有没有办法根据任务队列中的任务数量自动缩放 K8s 中的 pod?

wei*_*eld 8

是的,通过使用 Kubernetes 指标注册表和Horizo​​ntal Pod Autoscaler

首先,您需要从 Celery 收集“队列长度”指标,并通过 Kubernetes 指标 API 之一公开它。您可以使用基于 Prometheus 的管道执行此操作:

  1. 由于 Celery 不公开 Prometheus 指标,因此您需要安装一个导出器,将有关 Celery 的一些信息(包括队列长度)作为 Prometheus 指标公开。例如,这个出口商
  2. 在集群中安装Prometheus并将其配置为从 Celery 导出器收集与任务队列长度对应的指标。
  3. 在您的集群中安装Prometheus 适配器,并将其配置为通过自定义指标 API公开“队列长度”指标,方法是从 Prometheus 中提取其值。

现在,您可以配置 Horizo​​ntal Pod Autoscaler 以从 Custom Metrics API 查询此指标并根据它自动扩展您的应用程序。

例如,要根据队列长度 5 的目标值在 1 到 10 个副本之间扩展应用程序:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  minReplicas: 1
  maxReplicas: 10
  metrics:
    - type: Object
      object:
        metric:
          name: mycelery_queue_length
        target:
          type: value
          value: 5
        describedObject:
          apiVersion: apps/v1
          kind: Deployment
          name: mycelery
Run Code Online (Sandbox Code Playgroud)