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

How to configure your Dapr application to autoscale using KEDA

Dapr采用模块化的构件方法,加上10多个不同的pub/sub组件,简化了消息处理程序的编写工作。 由于Dapr可以在许多环境中运行(如虚拟机、裸机、云或边缘),因此Dapr应用的自动伸缩是由宿主管理的。

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

This how-to walks through the configuration of a scalable Dapr application along with the back pressure on Kafka topic, however you can apply this approach to any pub/sub components offered by Dapr.

安装KEDA

要安装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部署的状态:

  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

接下来,创建本例中使用的主题(这里用demo-topic为例):

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

  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

部署 Dapr Pub/Sub 组件

接下来,我们将为Kubernetes部署Dapr Kafka pub/sub组件。 将以下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的连接地址字符串。

另外,请注意consumerIDautoscaling-subscriber值设置,该值稍后用于确保KEDA和你的deployment使用相同的 Kafka分区偏移量

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

  1. kubectl apply -f kafka-pubsub.yaml

为Kafka部署KEDA自动伸缩

接下来,我们将部署KEDA缩放对象,该对象可以监控指定Kafka主题上的延迟情况,并配置Kubernetes Horizontal Pod Autoscaler (HPA) 来缩放你的Dapr deployment。

将以下内容粘贴到名为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"

在上面的文件中,这里有几点需要审视:

  • spec:scaleTargetRef部分的name是您的应用程序在Deployment中定义的Dapr ID(dapr.io/id注释的值)
  • pollingInterval是KEDA检查Kafka当前主题分区偏移量的以秒为单位的频率
  • minReplicaCount是KEDA为你的deployment创建的最小副本数量。 (注意,如果您的应用程序需要很长时间才能启动,最好将其设置为1,以确保部署的至少一个副本始终在运行。 否则,设置为0,KEDA就会为你创建第一个副本)
  • maxReplicaCount是你的deployment的最大副本数量。 考虑到 Kafka分区偏移量的工作方式,你不应该将该值设置得高于主题分区的总数量。
  • Kafka metadata部分的topic应该设置为你的Dapr deployment所订阅的同一主题(在本例中demo-topic
  • 类似地,bootstrapServers应该设置为kafka-pubsub.yaml文件中使用的同一个broker的连接地址字符串
  • consumerGroup应该设置为与kafka-pubsub.yaml文件中的consumerID相同的值

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

接下来,将KEDA扩展器部署到Kubernetes:

  1. kubectl apply -f kafka_scaler.yaml

全部完成!

现在,ScaledObject KEDA对象已经配置好了,你的deployment将根据Kafka主题的延迟进行扩展。 更多关于为Kafka主题配置KEDA的信息可以在这里获得。

现在你可以开始将消息发布到您的Kafka主题demo-topic,当延迟阈值高于5主题时,你可以看到pods开始自动缩放,正如我们在KEDA缩放器清单中定义的那样。 You can publish messages to the Kafka Dapr component by using the Dapr Publish CLI command