【问题标题】:How to auto-scale Kubernetes Pods based on number of tasks in celery task queue?如何根据 celery 任务队列中的任务数自动扩展 Kubernetes Pod?
【发布时间】:2020-04-13 15:57:59
【问题描述】:

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

【问题讨论】:

  • 那么您找到解决方案了吗?
  • 我还没有实现自动缩放,因为没有紧急需要。我通常对预期负载有一个想法,因此我可以手动扩展它。当我实现它时,我会发布答案。

标签: kubernetes celery


【解决方案1】:

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

首先,您需要从 Celery 收集“队列长度”指标,并通过其中一个 Kubernetes 指标 API 公开它。您可以使用基于 Prometheus 的管道来做到这一点:

  1. 由于 Celery 不公开 Prometheus 指标,因此您需要安装一个导出器,将有关 Celery 的一些信息(包括队列长度)公开为 Prometheus 指标。例如,this exporter
  2. 在您的集群中安装Prometheus,并将其配置为从 Celery 导出器收集与任务队列长度相对应的指标。
  3. 在您的集群中安装Prometheus Adapter,并将其配置为通过Custom Metrics 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

【讨论】:

  • 能否请您澄清一下mycelery_queue_length 在这种情况下究竟如何影响副本数。 value:5 是什么意思?
【解决方案2】:

解决这个问题有两个部分:您需要从 celery 中收集指标并将它们提供给 Kubernetes API(作为自定义指标 API)。然后 Horizo​​ntalPodAutoscaler 可以查询这些指标,以便根据自定义指标进行缩放。

您可以使用 Prometheus(例如)从 Celery 收集指标。然后,您可以使用 Prometheus Adapter 将指标公开给 Kubernetes。现在,prometheus 中可用的指标可供 Kubernetes 使用。

您现在可以为您的应用程序定义一个HorizontalPodAutoscaler

kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2alpha1
metadata:
name: sample-metrics-app-hpa
spec:
    scaleTargetRef:
        kind: Deployment
        name: sample-metrics-app
    minReplicas: 2
    maxReplicas: 10
    metrics:
    - type: Object
    object:
        target:
        kind: Service
        name: sample-metrics-app
        metricName: celery_queue_length
        targetValue: 100

【讨论】:

  • 在这种情况下targetValue如何连接到minReplicas/maxReplicas
猜你喜欢
  • 2013-11-20
  • 2015-06-16
  • 2017-04-02
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 2020-09-15
相关资源
最近更新 更多