
点击上方 云原生CTO,选择设为星标
优质文章,每日送达


「【只做懂你de云原生干货知识共享】」
使用 KEDA 在 Kubernetes 中进行事件驱动的自动缩放
开箱即用的Kubernetes,通过水平Pod自动伸缩器(HPA)支持自动伸缩,HPA根据CPU和内存利用率自动伸缩部署、副本集或状态集中的Pod数量。但有时,这些是不够的,特别是如果您遵循事件驱动或无服务器架构并开发本地云应用程序。这类系统中最常见的用例之一是根据队列/主题中的消息数量(而不是CPU或内存)来扩展工作负载。最终,我们希望在消息计数增加时向外扩展主题/队列的消费者,在消息计数减少时再次向内收缩。尽管Kubernetes中没有对此的内置支持,但我们可以通过一个名为“KEDA”的开源项目来实现这一点。
KEDA代表基于 Kubernetes 的事件驱动的自动缩放器。KEDA是一个单一用途的轻量级组件,可以添加到任何 Kubernetes 集群。KEDA 与Horizontal Pod Autoscaler等标准 Kubernetes 组件一起工作,并且可以扩展功能而不会覆盖或重复。使用 KEDA,您可以明确映射要使用事件驱动规模的应用程序,而其他应用程序继续运行。这使得 KEDA 成为一个灵活且安全的选择,可以与任意数量的任何其他 Kubernetes 应用程序或框架一起运行。
架构图
下图显示了 KEDA 如何与 Kubernetes Horizontal Pod Autoscaler、外部事件源和 Kubernetes etcd数据存储结合使用:
您可以从它们的官方文档中了解KEDA的工作方式和关于KEDA的更深入的细节。在这里,我将讨论growth作为一个组织如何利用KEDA来扩展应用程序的历程,以及我们使用KEDA的学习。
Kubernetes内嵌的HPA的极限是它无法处理降至零的比例。
我们运行的是最新版本的Kubernetes 1.19.9,我在这个集群中部署了最新版本的KEDA v2.2。您可以参考该链接以获得在Kubernetes集群中部署KEDA的说明。https://keda.sh/docs/1.4/concepts/
部署成功后,您应该看到KEDA操作员和KEDA metrics API pod正在运行。

我们使用Kafka作为我们的消息代理,并根据 Kafka 主题中的延迟扩展 Pod。虽然我们在这里使用 Kafka 作为我们的消息代理,但 KEDA 内置了对许多其他缩放器的支持(缩放器代表 KEDA 可以基于其缩放的事件源)。您可以在此处查看KEDA 的更多内置缩放器。https://keda.sh/docs/2.2/scalers/
一旦我们在集群中部署了 KEDA,它将创建四个CRD(自定义资源定义),即,
ScaledObject ScaledJob TriggerAuthentications ClusterTriggerAuthentications 您可以从他们的官方文档中阅读有关这些 CRD 的更多信息。https://keda.sh/docs/2.2/concepts/
带有 Kafka 缩放器的 KEDA 的信息流如下。
当没有待处理的消息时,KEDA 可以根据 minReplica 集将部署扩展到零或一。 当消息到达时,KEDA 会检测到此事件并激活部署。 当部署开始运行时,其中一个容器连接到 Kafka 并开始拉取消息。 随着越来越多的消息到达 Kafka Topic,KEDA 可以将这些数据提供给 HPA 以推动横向扩展。 部署的每个副本都在积极处理消息。很可能,每个副本都以分布式方式处理一批消息。
让我们把KEDA引入其中,展示一下自动伸缩的威力,看看KEDA如何在真实的Kubernetes集群中扩展部署。
先决条件
Kubernetes 集群和kubectl。 Apache Kafka。 一个kafka topic Kafka 生产者和 Kafka 消费者应用程序
如果您没有准备好生产者或消费者应用程序,您可以从此 git repo克隆演示应用程序。您可以在 repo 本身中找到构建镜像的所有说明。
https://github.com/leegin/KEDA-kafka
现在我们已经准备好了应用程序镜像,所以让我们将它们部署到集群中。在此之前,请确保您已经更新了Kafka topic和Kafka broker,并在各自的应用程序的部署文件中。首先,我们将部署Kafka的生产者。
kubectl apply -f kafka-producer/deployment.yaml
由于我们创建了一个类型的服务,NodePort您可以使用 的格式SERVER_IP:32000来访问该服务。您可以通过执行以下命令来获取服务器的 IP 地址。
kubectl get pods -n keda -o wide
我已将所有这些对象部署在名称空间“keda”中。在生产集群中,您可以将它们部署到任何命名空间。
我们现在已经准备好将一些消息发布到队列中,我们可以使用生产者的其余端点来发布消息。要将一些订单消息添加到主题中,您只需执行 GET(或仅将 URL 粘贴到浏览器中)
http://10.68.64.3:32000/orders/2 #number of orders
#output
[ {
"id" : "0",
"status" : "NEW",
"price" : 650.69841600315,
"quantity" : 19,
"createdTime" : "2021-06-06T06:48:58.111Z",
"processedTime" : null
}, {
"id" : "1",
"status" : "NEW",
"price" : 481.096669522158,
"quantity" : 89,
"createdTime" : "2021-06-06T06:48:58.112Z",
"processedTime" : null
} ]
接下来,让我们继续使用以下命令部署 Kafka-consumer。
kubectl apply -f kafka-consumer/deployment.yaml

如前所述,KEDA使用标量作为KEDA可基于的事件源。我们将在这里使用Kafka scaler,它可以用于扩展基于Apache Kafka Topic的应用程序。因为我们已经部署了KEDA相关的资源,现在我们将创建一个自定义资源ScaledObject“kafka-scale -object.Yaml”来描述我们想要实现的扩展策略。KEDA operator 将观察这个ScaledObject资源,并创建HPA(水平Pod自动scaler)资源,以根据Kafka topic的延迟在“Kafka-consumer-deployment”部署中扩展Pod。
如果您有多个topics由单个消费者使用,您可以将它们添加到触发器中,如下所示。
triggers:
- type: kafka
metadata:
bootstrapServers: 10.60.10.253:9092
consumerGroup: order-shipper
topic: keda-kafka-poc
lagThreshold: "20"
offsetResetPolicy: earliest
- type: kafka
metadata:
bootstrapServers: 10.60.10.253:9092
consumerGroup: order-shipper
topic: keda_kafka
lagThreshold: "100"
offsetResetPolicy: earliest
在这里,我将 minReplica 计数设置为 1,因为我希望每次至少运行一个 pod。如果你想缩小到零,你可以相应地配置它。
缩放行为可以通过HPA行为字段进行配置。在behavior字段下的scaleUp或scaleDown部分中,分别为向上和向下伸缩指定行为。不幸的是,从Kubernetes v1.18开始,我们就可以从这个特性中获益,而不是在任何更早的版本中。
advanced:
horizontalPodAutoscalerConfig:
behavior:
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 50
periodSeconds: 60
- type: Pods
value: 3
periodSeconds: 60
selectPolicy: Max
请确保根据所使用的 Kafka 集群的值更新bootstrapServers、consumerGroup、topic值。现在让我们创建缩放对象。
kubectl apply -f kafka-scaled-object.yaml
有了这个 KEDA 也会自动创建一个 HPA 用于扩展。
现在要查看自动缩放的作用,让我们向队列提交大约 100,000 条订单消息。
http://10.68.64.3:32000/orders/ 100000
一旦延迟超过我们在scaledObjectHPA 中提到的阈值,它将开始根据配置的扩展行为扩展 Pod。一旦消息被消费,pod 计数将再次扩展到指定的最小 pod 计数。
Pods即使您将最大副本设置为更高的数字,数量也不会超过 kafka 主题的分区数。
除了 Kafka 扩展器,KEDA 提供了更多内置扩展器,如 Rabbitmq、GCP pub/sub、Redis、MYSQL 等,您可以根据自己的用例使用它们并相应地扩展您的部署或作业。
参考资料🙉
https://keda.sh https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/ https://keda.sh/docs/2.2/scalers/apache-kafka/




