The documentation you are viewing is for Dapr v1.6 which is an older version of Dapr. For up-to-date documentation, see the latest version.

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

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

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

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

本操作指南介绍了可扩展 Dapr 应用程序的配置以及 Kafka 主题的背压,但是您可以将此方法应用于 Dapr 提供的任何 发布/订阅组件

安装KEDA

要安装 KEDA,请遵循 KEDA 网站上的部署 KEDA说明。

安装Kafka(可选)

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

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

检查 Kafka deployment 的状态:

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

完成后,还要部署 Kafka 客户端,并等待就绪:

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

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

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

kubectl -n kafka exec -it kafka-client -- kafka-topics \
        --zookeeper kafka-cp-zookeeper-headless:2181 \
        --topic demo-topic \
        --create \
        --partitions 10 \
        --replication-factor 3 \
        --if-not-exists

部署 Dapr Pub/Sub 组件

接下来,我们将为Kubernetes部署Dapr Kafka pub/sub组件。 将以下YAML粘贴到一个名为kafka-pubsub.yaml的文件中:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: autoscaling-pubsub
spec:
  type: pubsub.kafka
  version: v1
  metadata:
    - name: brokers
      value: kafka-cp-kafka.kafka.svc.cluster.local:9092
    - name: authRequired
      value: "false"
    - name: consumerID
      value: autoscaling-subscriber

上面的 YAML 定义了你的应用程序所订阅的 pub/sub 组件,也就是我们在上面创建的 demo-topic。 如果你使用了上面的 Kafka Helm 安装说明,你可以将 brokers 值保持不变。 否则,将其改为你的 Kafka broker 的连接地址字符串。

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

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

kubectl apply -f kafka-pubsub.yaml

为 Kafka 部署 KEDA 自动伸缩

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

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

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: subscriber-scaler
spec:
  scaleTargetRef:
    name: <REPLACE-WITH-DAPR-DEPLOYMENT-NAME>
  pollingInterval: 15
  minReplicaCount: 0
  maxReplicaCount: 10
  triggers:
  - type: kafka
    metadata:
      topic: demo-topic
      bootstrapServers: kafka-cp-kafka.kafka.svc.cluster.local:9092
      consumerGroup: autoscaling-subscriber
      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:

kubectl apply -f kafka_scaler.yaml

全部完成!

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

现在你可以开始将消息发布到您的 Kafka 主题 demo-topic,当延迟阈值高于 5 主题时,你可以看到 pods 开始自动缩放,正如我们在 KEDA 缩放器清单中定义的那样。 您可以通过使用 Dapr Publish CLI 命令将消息发布到 Kafka Dapr 组件。