KEDA(基于 Kubernetes 的事件驱动自动缩放器)是一个开源项目,它扩展了 Kubernetes 的自动缩放能力,超越了内置的水平 Pod 自动缩放器(HPA)。虽然 HPA 在基于 CPU 和内存的缩放方面表现出色,但 KEDA 更进一步,允许您基于自定义指标进行缩放,比如队列深度、API 流量,或者几乎任何您能想到的指标。

以下是 KEDA 改变游戏规则的原因:

  • 事件驱动缩放:响应真实世界的事件,而不仅仅是资源使用
  • 从零到英雄:在没有负载时从零个 Pod 开始缩放
  • 指标灵活性:使用来自 Prometheus、Azure Monitor、AWS CloudWatch 等各种来源的指标
  • 轻松集成:与现有的 Kubernetes 部署无缝协作

开始使用 KEDA

准备好试用 KEDA 吗?让我们一起看看设置过程:

1. 安装 KEDA

首先,让我们在您的集群中启动并运行 KEDA。您可以使用 Helm 进行快速简便的安装:


helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda --namespace keda --create-namespace

或者,如果您更喜欢使用 YAML:


kubectl apply -f https://github.com/kedacore/keda/releases/download/v2.8.1/keda-2.8.1.yaml

2. 定义一个 ScaledObject

现在是有趣的部分——定义您想要的缩放方式。KEDA 使用一个名为 ScaledObject 的自定义资源来确定缩放行为。以下是一个示例,它根据 RabbitMQ 队列中的消息数量来缩放部署:


apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: rabbitmq-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    deploymentName: my-deployment
  pollingInterval: 15
  cooldownPeriod:  30
  maxReplicaCount: 30
  triggers:
  - type: rabbitmq
    metadata:
      queueName: myqueue
      host: amqp://guest:[email protected]:5672/
      queueLength: "5"

这个 ScaledObject 告诉 KEDA 根据 "myqueue" RabbitMQ 队列的长度来缩放 "my-deployment" 部署。当队列中有超过 5 条消息时,KEDA 将开始扩展部署。

KEDA 实际应用:真实场景

让我们探索一些 KEDA 发挥作用的实际用例:

场景 1:API 流量缩放

想象一下,您有一个 API 会遇到零星的流量高峰。使用 KEDA,您可以根据传入请求的数量进行缩放:


apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: api-scaler
spec:
  scaleTargetRef:
    deploymentName: api-deployment
  triggers:
  - type: prometheus
    metadata:
      serverAddress: http://prometheus.monitoring:9090
      metricName: http_requests_total
      threshold: "100"
      query: sum(rate(http_requests_total{job="api-gateway"}[2m]))

当传入请求的速率在 2 分钟内超过每秒 100 次时,此设置将扩展您的 API 部署。

场景 2:批处理作业处理

对于批处理作业,您可以根据待处理任务的数量来缩放工作节点:


apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: batch-job-scaler
spec:
  scaleTargetRef:
    deploymentName: batch-worker
  triggers:
  - type: postgresql
    metadata:
      connectionFromEnv: POSTGRES_CONNECTION
      query: "SELECT COUNT(*) FROM jobs WHERE status='pending'"
      targetQueryValue: "10"

这个 ScaledObject 根据 PostgreSQL 数据库中待处理作业的数量来缩放 batch-worker 部署。

KEDA 精通技巧

在您开始 KEDA 之旅时,请记住以下提示:

  1. 从小开始:从非关键工作负载开始,以熟悉 KEDA 的行为。
  2. 密切监控:密切关注您的缩放模式,以微调触发器。
  3. 与 HPA 结合使用:KEDA 可以与 HPA 一起使用,以实现更灵活的缩放。
  4. 使用缩放作业进行成本优化:当没有工作时,KEDA 可以将部署缩放到零,从而节省成本。
  5. 探索自定义缩放器:如果内置缩放器不符合您的需求,您可以创建自定义缩放器。

潜在陷阱:小心行事!

虽然 KEDA 功能强大,但有一些需要注意的事项:

  • 缩放过于激进:确保您的冷却期合适,以避免快速缩放上升和下降。
  • 指标可靠性:确保您的缩放指标可靠,并能抵抗短期波动。
  • 资源限制:不要忘记为您的 Pod 设置资源请求和限制,以防止集群资源耗尽。
“强大的缩放能力伴随着巨大的责任。” - 如果本叔叔是 DevOps 工程师

自动缩放的未来:KEDA 的下一步是什么?

KEDA 正在积极发展,未来将有新功能和改进。值得关注的一些令人兴奋的领域:

  • 增强对更多云原生事件源的支持
  • 改进与服务网格的集成
  • 高级预测性缩放算法

请关注 KEDA GitHub 仓库 以获取最新更新和功能。

总结:KEDA 适合您吗?

KEDA 为 Kubernetes 自动缩放带来了新的灵活性和响应能力。如果您的应用程序处理可变工作负载、事件驱动架构或需要基于自定义指标进行缩放,KEDA 可能是您 Kubernetes 拼图中缺失的一块。

请记住,自动缩放既是一门艺术,也是一门科学。在受控环境中开始尝试 KEDA,密切监控其行为,并迭代您的缩放策略。很快,您将拥有一个像梦一样缩放的 Kubernetes 集群,优雅地响应工作负载的涨落。

那么,您准备好将 Kubernetes 自动缩放提升到一个新的水平了吗?试试 KEDA,看看您的集群如何变成一个精简、高效的缩放机器!

进一步阅读

祝您缩放愉快,Kubernetes 爱好者!