KEDA(Kubernetes Event-driven Autoscaling)是一个强大的开源工具,可用于根据事件触发器自动调整 Kubernetes 中的工作负载。本指南将深入介绍如何在实际项目中使用 KEDA,以实现基于事件的自动扩展,提高弹性和效率。

选择条件

  1. 异步事件驱动的工作负载: KEDA 特别适用于处理异步事件,如消息队列中的消息、Kafka 主题中的事件等。它可以根据事件的数量和负载动态地调整工作负载的规模,确保资源有效利用。
  2. 削峰填谷: 当你的应用程序面临不同时间段内负载波动的情况时,KEDA 可以帮助你处理这种削峰填谷的情况。通过根据实时事件动态扩展或缩减副本数量,KEDA 能够更好地应对高峰时期和低谷时期的工作负载。
  3. 支持多种事件触发器: KEDA 提供了多种事件触发器,包括消息队列(如 Azure 队列、RabbitMQ)、Kafka、AWS CloudWatch、Prometheus 等。如果你的应用使用这些事件源,KEDA 提供了通用的方式来自动调整工作负载。
  4. 无需手动缩放: 使用 KEDA 可以避免手动缩放工作负载的繁琐任务。KEDA 可以根据配置的触发器和规则,自动调整工作负载的规模,使之适应不同的负载情况,减轻运维负担。
  5. 节省成本: 通过在负载较低时减少副本数量,在需要时再进行动态扩展,KEDA 可以帮助你更有效地使用资源,从而节省成本。这对于云计算环境中的资源成本控制尤为重要。
  6. 支持多种云提供商: KEDA 提供了对多种云提供商的原生支持,包括 Azure、AWS、Google Cloud 等。这意味着你可以在不同的云环境中使用相似的配置和流程来实现基于事件的自动扩展。

步骤1:安装 KEDA

首先,确保你的 Kubernetes 集群正常运行。然后,使用 Helm 安装 KEDA:

helm repoadd kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda
  • 1.
  • 2.
  • 3.

这将在你的 Kubernetes 集群中安装 KEDA。

首先,确保你的 Kubernetes 集群已经安装并正常运行。然后,按照以下步骤安装 KEDA:

kubectl apply -f https://github.com/kedacore/keda/releases/download/v2.10.0/keda-2.10.0.yaml
  • 1.

这将在你的 Kubernetes 集群中安装 KEDA 的必要组件。

步骤2:创建示例应用

为了演示 KEDA 的功能,我们将创建一个简单的 Node.js 应用,用于处理队列消息。以下是一个示例:

// app.js
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const port = 3000;

app.use(bodyParser.json());

app.post('/process', (req, res) => {
  console.log('Processing event:', req.body);
  // 处理事件的业务逻辑
  res.sendStatus(200);
});

app.listen(port, () => {
  console.log(`App listening at http://localhost:${port}`);
});
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

确保你的应用能够接收 POST 请求,并将其打包成 Docker 镜像,并推送到你的容器仓库。

步骤3:创建 Kubernetes 部署文件

创建一个 Kubernetes 部署文件描述你的应用。以下是一个示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: your-registry/your-app:latest
          ports:
            - containerPort: 3000
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

替换 your-registry/your-app:latest 为你的应用镜像地址。

步骤4:创建 KEDA ScaledObject

为了告诉 KEDA 如何扩展你的应用,创建一个 KEDA ScaledObject。以下是一个示例:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: my-scaledobject
spec:
  scaleTargetRef:
    name: my-app
  pollingInterval: 1
  cooldownPeriod: 60
  minReplicaCount: 1
  maxReplicaCount: 10
  triggers:
    - type: azure-queue
      metadata:
        queueLength: "10"
        queueName: my-queue #或queueURL指定消息
        connectionStringFromEnv: true
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

替换 queueName 为你的 Azure 队列的名称。

参数说明:

  • scaleTargetRef: 这个字段指定了 ScaledObject 所关联的目标对象,即需要被扩展/缩减的工作负载。在这里,name: my-app 表示目标对象的名称是 my-app
  • pollingInterval: 这是轮询事件的时间间隔,以秒为单位。在这个例子中,轮询间隔是 1 秒,即每 1 秒检查一次是否有新的事件需要处理。
  • cooldownPeriod: 这是两次调整之间的冷却时间,以秒为单位。在这个例子中,冷却时间是 60 秒,确保在上一次调整后的 10 秒内不会再次触发调整。
  • minReplicaCount: 这是工作负载的最小副本数,确保即使没有事件,也至少有一个副本在运行。在这个例子中,最小副本数是 1。
  • maxReplicaCount: 这是工作负载的最大副本数,确保在负载高峰时能够动态扩展。在这个例子中,最大副本数是 10。
  • triggers: 这是一个数组,包含了触发器的配置信息。在这个例子中,我们使用了 Azure 队列触发器 (type: azure-queue),并指定了队列的名称和连接字符串。connectionStringFromEnv: true 表示连接字符串从环境变量中获取。
  • queueLength: 指定队列的长度。当队列中的消息数量达到或超过指定的长度时,可能会触发相应的操作。在这个例子中,当消息达到是 10条触发.

步骤5:部署应用和 ScaledObject

kubectl apply-f your-app-deployment.yaml
kubectl apply -f your-scaledobject-config.yaml
  • 1.
  • 2.

步骤6:测试弹性扩展

通过发送一些消息到你的 Azure 队列,观察你的应用是否根据队列中的消息数量动态扩展或缩减。

结论

通过完成这个实战指南,你已经成功地使用 KEDA 实现了基于事件的自动扩展。KEDA 提供了强大的工具,帮助你在 Kubernetes 中更有效地管理工作负载,根据实时事件动态调整应用程序的规模。根据你的应用场景,你可以尝试不同的事件触发器和配置,以最大程度地提高弹性和性能。