每日分享最新,最流行的软件开发知识与最新行业趋势,希望大家能够一键三连,多多支持,跪求关注,点赞,留言。
KEDA 是一个事件驱动的自动缩放器,它通过根据需要处理的事件数量添加额外的 Pod 来水平缩放容器。
如果您使用Kubernetes解决方案作为在任何公共云中托管容器化应用程序的平台,那么计费就是迟早会追捕您的事情之一。Kubernetes 的计费很大程度上取决于节点的数量,而节点的数量取决于集群的工作负载数量。我们知道自动缩放是 Kubernetes 最喜欢的功能之一。因此,在根本没有工作时缩减一些工作负载并降低云成本会更明智。
当我们谈论 Kubernetes 自动缩放功能时,会自动想到 Horizontal Pod Autoscaler (HPA)。默认情况下,HPA 可以使用 CPU 或 RAM 使用率等基本指标来实现自动缩放。但是,如果复杂的分布式应用程序与 Kubernetes 集群外部的不同组件集成(例如:Kafka 主题滞后、Redis 流、Azure 管道队列、Azure 服务总线、PubSub 主题等),HPA 本身无法扩展基于这些组件的指标的 pod。
HPA 可以使用自定义指标并在此基础上进行扩展,但它需要您设置指标适配器和额外的配置层才能将数据正确映射到 Kubernetes。
这就是KEDA 让我的生活变得轻松的地方。
为了克服此类问题,KEDA 在 Horizo ntal Pod Autoscaler (HPA) 之上提供了扩展功能。KEDA 是一个事件驱动的自动缩放器,它通过根据需要处理的事件数量添加额外的 Pod 来水平缩放容器。它自动扩展不同类型的 Kubernetes 资源,例如部署、Statefulsets、作业和自定义资源。
架构和概念
在高水平。KEDA 由两个组件组成,用于控制 Pod/工作负载的自动缩放。
- 代理:它负责激活和停用 Kubernetes 部署、状态集或任何其他目标,以便在没有事件时缩放到零或在有事件时从零缩放。
- Metrics Server:它充当 Kubernetes 指标服务器,将从事件源收集的事件(Azure 管道队列、Kafka 主题消息等)公开给 Horizontal Pod Autoscaler (HPA)。
Scaler:KEDA的真正力量在于大量的Scaler。缩放器是丰富的信息源,因为它提供外部数据/事件并允许您根据外部数据进行缩放。今天,它支持 50 多个“缩放器”,并带有特定支持的触发器,如 Azure Pipeline(触发器:azure-pipeline)和 Kafka(触发器:Kafka 主题),并且还会有更多。
ScaledObject:这些被部署为 Kubernetes CRD,它带来了将部署/状态集与事件源链接的功能,并定义了缩放元数据。ScaledObject 使用触发器来响应事件源中发生的事件并根据需要扩展工作负载。
KEDA 使用另一个名为 TriggerAuthentication(namespaced) 或 ClusterTriggerAutnetication (Cluster Scoped) 的 CRD 对事件源进行身份验证。
现在理论足够了;让我们来看一些实际用例,看看我们如何利用 KEDA 来管理代理池中的 azure 管道代理。
用例
在开始之前,让我们花点时间了解一下我们的场景。我们有一个 ADO (Azure DevOps) 项目,它使用持续集成和部署(CICD) 解决方案。在此之下,已经构建了构建/发布管道。这些管道使用自托管的容器化代理来执行所有任务。这些自托管的容器化代理作为 statefulset 部署在 GKE 集群上。
下面的屏幕截图描述了我们在 statefulset 下只有一个 pod 代理,并且一个管道作业正在同一个 pod 代理上运行。如果我们创建更多版本,它们(作业)将进入队列并等待单个 pod 代理空闲。有了 KEDA,我们希望在队列中有新作业时看到 Pod 的数量得到扩展。
先决条件
- ADO 项目(已设置代理池)用作 CICD 解决方案。
- 在代理池下创建 Azure 管道代理所需的 ADO 项目权限。参考这里。
- Kubernetes 集群将 azure 管道代理部署为 statefulset。
- 必须为 k8s 集群中的应用程序构建所需的 GCP 网络连接才能访问互联网。
使用以下 YAML 在 k8s 集群上安装自托管容器化 azure 管道代理。
现在让我们验证代理是否已成功注册到 ADO 代理池。我们可以看到代理也出现在Azure Pipelines上。
azp-gent.yamlapiVersion: v1kind: Secretmetadata:name: azp-agent-secrettype: Opaquedata:vstsToken: BASE64-OF-PAT-TOKEN---apiVersion: v1kind: Servicemetadata:name: azp-agentlabels:app.kubernetes.io/instance: azp-agentapp.kubernetes.io/name: azp-agentspec:clusterIP: Noneselector:app.kubernetes.io/instance: azp-agentapp.kubernetes.io/name: azp-agent---apiVersion: apps/v1kind: StatefulSetmetadata:labels:app.kubernetes.io/instance: azp-agentapp.kubernetes.io/name: azp-agentname: azp-agentspec:replicas: 1selector:matchLabels:app.kubernetes.io/instance: azp-agentapp.kubernetes.io/name: azp-agentserviceName: azp-agenttemplate:metadata:labels:app.kubernetes.io/instance: azp-agentapp.kubernetes.io/name: azp-agentspec:containers:- env:- name: POD_NAMEvalueFrom:fieldRef:apiVersion: v1fieldPath: metadata.name- name: AZP_TOKENvalueFrom:secretKeyRef:key: vstsTokenname: azp-agent-secret- name: AZP_POOLvalue: POOL-NAME- name: AZP_URLvalue: https://dev.azure.com/YOUR-ORG-NAME/- name: AZP_WORKvalue: /var/vsts- name: AZP_AGENT_NAMEvalue: $(POD_NAME)image: AZURE-PIPELINE-AGENT-IMAGEimagePullPolicy: Alwaysname: azp-agentresources:limits:cpu: 500mmemory: 1Girequests:cpu: 100mmemory: 500MivolumeMounts:- mountPath: /var/vstsname: workspace- mountPath: /vsts/agentname: agent-dir- mountPath: /var/run/docker.sockname: docker-socketvolumes:- hostPath:path: /var/run/docker.socktype: ""name: docker-socketvolumeClaimTemplates:- apiVersion: v1kind: PersistentVolumeClaimmetadata:name: workspacespec:accessModes:- ReadWriteOnceresources:requests:storage: 50GistorageClassName: standardvolumeMode: Filesystem- apiVersion: v1kind: PersistentVolumeClaimmetadata:name: agent-dirspec:accessModes:- ReadWriteOnceresources:requests:storage: 5GistorageClassName: standardvolumeMode: Filesystem
在 Kubernetes 集群上安装 KEDA
KEDA 可以通过多种方式安装在 Kubernetes 集群上。我已经使用 helm chart 在集群上安装了 KEDA。您可以在此处参考官方 Helm 图表。
科达在行动
如前所述,ScaledObject 是在事件源和部署之间创建映射的对象。现在,我们将使用 azure-pipeline 触发器和 TriggerAuthentication 创建 ScaledObject,以允许 KEDA 在 statefulset 中缩放 pod。
请参阅此处的官方页面以探索 ScaledObject 的所有参数。
创建 ScaledObject 后,KEDA 会自动同步配置并开始监视上面创建的 azp-agent Statefulset。KEDA 无缝创建具有所需配置的 HPA(Horizontal Pod Autoscaler)对象,并根据通过 ScaledObject 提供的触发规则(在本例中为队列长度为“1”)扩展副本。
现在,我将对我的 repo 进行一些提交以将一些构建排入队列。
结果,我们可以看到 KEDA 扩展了 azp-agent Statefulset 中的 pod 数量,这些 pod 将注册到代理池并占用队列中的待处理作业。
KEDA 有 50 多个缩放器来驱动使用不同类型的事件源事件的自动缩放,并且它还在继续添加更多。因此,它绝对是一个生产级应用程序,可用于基于事件的自动缩放。
热门跟贴