如何根据芹菜任务队列中的任务数量自动扩展 Kubernetes Pod?



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

是的,通过使用 Kubernetes 指标注册表和水平 Pod 自动缩放器。

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

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

现在,可以将水平容器自动缩放程序配置为从自定义指标 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

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

例如,您可以使用 Prometheus 从 Celery 收集指标。然后,您可以使用 Prometheus 适配器向 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

最新更新