如何使用 KEDA 对 Dapr 应用进行自动缩放

如何将 Dapr 应用程序配置为使用 KEDA 自动缩放

Dapr以其模块化的构建方式,加上许多pub/sub组件,使得编写消息处理应用程序变得容易。 由于Dapr可以在许多环境中运行(例如虚拟机、裸机、云或边缘Kubernetes),因此Dapr应用的自动伸缩是由宿主管理的。

对于 Kubernetes,Dapr集成了KEDA,这是一个用于 Kubernetes 的事件驱动的自动伸缩组件。 许多 Dapr 的 pub/sub 组件与 KEDA 提供的缩放器重叠,因此使用 KEDA 可以很容易地在 Kubernetes 上配置 Dapr deployment,以根据背压自动缩放。

在本指南中,您将配置一个可扩展的 Dapr 应用程序,以及对 Kafka 主题的背压。 然而,您可以将这种方法应用于 Dapr 提供的任何发布/订阅组件

注意

如果您正在使用Azure容器应用程序,请参考官方的Azure文档,了解如何使用KEDA扩展器扩展Dapr应用程序的规模

安装KEDA

要安装 KEDA,请遵循 部署 KEDA说明。

安装和部署Kafka

如果你没有 Kafka,你可以通过使用 Helm 将其安装到你的 Kubernetes 集群中,见下面的示例:

  1. helm repo add confluentinc https://confluentinc.github.io/cp-helm-charts/
  2. helm repo update
  3. kubectl create ns kafka
  4. helm install kafka confluentinc/cp-helm-charts -n kafka \
  5. --set cp-schema-registry.enabled=false \
  6. --set cp-kafka-rest.enabled=false \
  7. --set cp-kafka-connect.enabled=false

检查 Kafka deployment 的状态:

  1. kubectl rollout status deployment.apps/kafka-cp-control-center -n kafka
  2. kubectl rollout status deployment.apps/kafka-cp-ksql-server -n kafka
  3. kubectl rollout status statefulset.apps/kafka-cp-kafka -n kafka
  4. kubectl rollout status statefulset.apps/kafka-cp-zookeeper -n kafka

安装后,部署 Kafka 客户端并等待它准备就绪:

  1. kubectl apply -n kafka -f deployment/kafka-client.yaml
  2. kubectl wait -n kafka --for=condition=ready pod kafka-client --timeout=120s

创建 Kafka 主题

创建本例中使用的主题 (demo-topic):

  1. kubectl -n kafka exec -it kafka-client -- kafka-topics \
  2. --zookeeper kafka-cp-zookeeper-headless:2181 \
  3. --topic demo-topic \
  4. --create \
  5. --partitions 10 \
  6. --replication-factor 3 \
  7. --if-not-exists

主题分区的数量与 KEDA 为你的 deployment 创建的最大副本数量有关。

部署一个 Dapr Pub/sub 组件

为 Kubernetes 部署 Dapr Kafka 发布/订阅组件。 将以下YAML粘贴到名为kafka-pubsub.yaml的文件中:

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: autoscaling-pubsub
  5. spec:
  6. type: pubsub.kafka
  7. version: v1
  8. metadata:
  9. - name: brokers
  10. value: kafka-cp-kafka.kafka.svc.cluster.local:9092
  11. - name: authRequired
  12. value: "false"
  13. - name: consumerID
  14. value: autoscaling-subscriber

上面的 YAML 定义了你的应用程序订阅的 pub/sub 组件,也就是你之前创建的 demo-topic

如果您使用了Kafka Helm安装说明,您可以按原样保留brokers的值。 否则,将此值更改为你的 Kafka broker 的连接地址字符串。

请注意为consumerID设置的autoscaling-subscriber值。 此值稍后用于确保KEDA和您的部署使用相同的Kafka分区偏移

现在,将该组件部署到集群中:

  1. kubectl apply -f kafka-pubsub.yaml

为 Kafka 部署 KEDA 自动伸缩

部署 KEDA 缩放对象,该对象:

  • 监控指定Kafka主题上的延迟
  • 配置 Kubernetes Horizontal Pod Autoscaler (HPA) 以纵向扩展和横向扩展 Dapr 部署

将以下内容粘贴到名为 kafka_scaler.yaml 的文件中,并在需要的地方配置你的 Dapr deployment。

  1. apiVersion: keda.sh/v1alpha1
  2. kind: ScaledObject
  3. metadata:
  4. name: subscriber-scaler
  5. spec:
  6. scaleTargetRef:
  7. name: <REPLACE-WITH-DAPR-DEPLOYMENT-NAME>
  8. pollingInterval: 15
  9. minReplicaCount: 0
  10. maxReplicaCount: 10
  11. triggers:
  12. - type: kafka
  13. metadata:
  14. topic: demo-topic
  15. bootstrapServers: kafka-cp-kafka.kafka.svc.cluster.local:9092
  16. consumerGroup: autoscaling-subscriber
  17. lagThreshold: "5"

让我们来回顾一下上面文件中的一些元数据值:

说明
scaleTargetRef/name在 Deployment 中定义的应用的 Dapr ID(dapr.io/id 注解的值)。
pollingIntervalKEDA 检查 Kafka 当前主题分区偏移量的频率,以秒为单位。
minReplicaCountKEDA 为你的 deployment 创建的最小副本数量。 如果您的应用程序启动时间较长,可以将此设置为1,以确保部署的至少一个副本始终在运行。 否则,设置为0,KEDA就会为你创建第一个副本。
maxReplicaCount你的 deployment 的最大副本数量。 考虑到Kafka分区偏移的情况 考虑到 Kafka 分区偏移量的工作方式,你不应该将该值设置得高于主题分区的总数量。
触发器/元数据/主题应该设置为你的 Dapr deployment 订阅的同一主题(在本例中是 demo-topic)。
triggers/metadata/bootstrapServers应该设置为 kafka-pubsub.yaml 文件中使用的同一个 broker 的连接地址字符串。
triggers/metadata/consumerGroup应该设置为与 kafka-pubsub.yaml 文件中的 consumerID 相同的值。

重要

将连接字符串、主题和消费者组设置为_相同_的值,对于确保自动缩放正常工作,对于Dapr服务订阅和KEDA缩放器配置来说非常关键。

将 KEDA 扩展器部署到 Kubernetes:

  1. kubectl apply -f kafka_scaler.yaml

全部完成!

查看 KEDA 扩缩器工作

现在,ScaledObject KEDA 对象已经配置好了,你的 deployment 将根据 Kafka 主题的延迟进行扩展。 了解有关配置KEDA用于Kafka主题的更多信息

根据KEDA scaler清单中的定义,您现在可以开始向您的Kafka主题demo-topic发布消息,并在滞后阈值高于5个主题时观察Pod的自动缩放。 通过使用Dapr Publish CLI命令,将消息发布到Kafka Dapr组件。

下一步

了解如何在Azure容器应用中使用KEDA扩展你的Dapr发布/订阅或绑定应用程序