您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

挖掘Kubernetes 弹性伸缩:利用 KEDA实现基于事件驱动的自动缩放器

时间:2023-08-31 15:06:07  来源:微信公众号  作者:云原生运维圈

简介与总结

前两篇关于HPA的文章,我们了解到HPA的实现原理,通过对服务CPU的metrics的监控实现了Deployment的弹性伸缩,我们本篇文章来实现基于事件驱动的HPA,基于事件可以让HPA更“理解”业务,实现更加基于业务的弹性伸缩。接下来就让我们一探究竟吧~

KEDA是什么?

KEDA(Kube.NETes Event-driven Autoscaling)是云原生计算基金会孵化项目,是一个Kubernetes基于事件驱动的自动缩放器。借助 KEDA,可以根据需要处理的事件数量来驱动 Kubernetes 中任何容器的扩展。KEDA是一个单一用途的轻量级组件,可以部署到任何 Kubernetes 集群中。KEDA 与标准 Kubernetes 组件(例如Horizontal Pod Autoscaler)一起可以扩展K8S功能。借助 KEDA,您可以明确映射要使用事件驱动规模的应用程序,而其他应用程序继续运行。这让 KEDA 成为一个灵活且安全的选项,可以与任意数量的任何其他 Kubernetes 应用程序或框架一起运行。下图展示了 KEDA 如何与 Kubernetes Horizontal Pod Autoscaler、外部事件源和 Kubernetes 的etcd结合使用数据存储:

图片图片

概述: KEDA 使用三个组件来完成其任务:

  • Scaler:连接到外部服务(例如,MySQL)并获取指标(例如,表的数据量)
  • Operator(代理):负责“激活”一个 Deployment/Stafulset 并创建一个 Horizontal Pod Autoscaler 对象
  • Metrics Adapter:将来自外部源的指标呈现给 Horizontal Pod Autoscaler KEDA Operator 由一个控制器组成,该控制器实现“协调循环”,并充当激活和停用部署以从零扩展或从零扩展的代理。这是由安装 KEDA 时运行的 KEDA-operator 容器实现的。ScaledObject它通过创建(HPA)对资源的创建做出“反应”并创建Horizontal Pod Autoscaler。

看到这里就大致了解到了KEDA的主要工作是通过获取各个服务具体的“指标”暴露给HPA以实现弹性扩展。

最佳实践

描述

上面了解到了KEDA的架构,我们接下来通过安装Mysql和KEDA,然后创建一个自定义资源 ScaledObject实现对Mysql"事件"的监控,并将指标暴露给HPA,以实现弹性伸缩,接下来就动手试试吧~

安装KEDA

在K8S集群中部署KEDA,因为我的K8S的版本是1.23,安装KEDA2.9版本(具体版本配套关系详见官网keda.sh:

#Including admission webhooks
#kubectl Apply --server-side -f https://Github.com/kedacore/keda/releases/download/v2.9.3/keda-2.9.3.yaml

查看keda 状态

# kubectl get po -n keda
NAME                                               READY   STATUS    RESTARTS   AGE
keda-admission-webhooks-5f7cdd4745-7zhxn           1/1     Running   0          4d9h
keda-metrics-apiserver-5c55d5d55f-gwv29            1/1     Running   0          4d9h
keda-operator-c8d6bd9bb-ct978                      1/1     Running   0          4d9h
keda-operator-metrics-apiserver-769bb99569-knh7g   1/1     Running   0          4d9h

安装Mysql

# helm repo add bitnami https://charts.bitnami.com/bitnami
#helm pull bitnami/mysql
#tar -xf mysql-9.3.3.tgz

#vim mysql/value.yaml
global:
  imageRegistry: ""
  ## E.g.
  ## imagePullSecrets:
  ##   - myRegistryKeySecretName
  ##
  imagePullSecrets: []
  storageClass: "nfs-storage"  ##配置自己的存储配置,其余可暂不配置

# 开始安装mysql
#helm install mysql ./mysql -n mysql --create-namespace

# kubectl get po -n mysql
NAME           READY   STATUS    RESTARTS        AGE
mysql-0        1/1     Running   1 (5h29m ago)   5h31m

创建ScaledObject

(详细描述可参考链接)

# cat mysql-example.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secrets
  namespace: mysql
type: Opaque
data:
  mysql_conn_str: cm9vdDptcXZkRmFtUWlXQHRjcChteXNxbC5teXNxbC5zdmMuY2x1c3Rlci5sb2NhbDozMzA2KS90ZXN0X2Ri # mysql的connectionString格式 user:password@tcp(mysql:3306)/stats_db base64编码值
---
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
  name: keda-trigger-auth-mysql-secret
  namespace: mysql
spec:
  secretTargetRef:
  - parameter: connectionString
    name: mysql-secrets
    key: mysql_conn_str
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: mysql-scaledobject
  namespace: mysql
spec:
  scaleTargetRef:
    kind: statefulset   #扩容的控制器的类型,默认是deployment
    name: mysql
  triggers:
  - type: mysql
    metadata:
      queryValue: "4"   #在 HPA 中用作targetValue或targetAverageValue(取决于触发指标类型)的阈值。(这个值可以是浮点数)
      query: "SELECT COUNT(*) FROM test;"   #应返回单个数值的 MySQL 查询,此为本次测试的enent
    authenticationRef:
      name: keda-trigger-auth-mysql-secret

#创建ScaledObject
#kubectl apply -f mysql-example.yaml

#查看ScaledObject
# kubectl get scaledobject -n mysql
NAME                 SCALETARGETKIND       SCALETARGETNAME   MIN   MAX   TRIGGERS   AUTHENTICATION                   READY   ACTIVE   FALLBACK   AGE
mysql-scaledobject   apps/v1.statefulset   mysql                         mysql      keda-trigger-auth-mysql-secret   True    True     False      4h54m

#同时也会创建HPA
# kubectl get hpa -n mysql
NAME                          REFERENCE           TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
keda-hpa-mysql-scaledobject   statefulset/mysql   3/4 (avg)   1         100       1          4h54m

测试

上面的配置中我们以test表中的行数作为"事件",并且阈值为4

#select * from test;
+----+------------+-----------+------------+-------------------+------+----------+
| id | created_at | update_at | panel_name | link              | icon | tag_name |
+----+------------+-----------+------------+-------------------+------+----------+
|  6 | NULL       | NULL      | kubesre    | www.kubesre.com/  | ECS  |          |
|  7 | NULL       | NULL      | kubesre    | www.kubesre.com/  | ECS  |          |
|  8 | NULL       | NULL      | kubesre    | www.kubesre.com/  | ECS  |          |
+----+------------+-----------+------------+-------------------+------+----------+

#添加数据
mysql> INSERT INTO `test` VALUES (1, NULL, NULL, 'kubesre', 'www.kubesre.com/', 'ECS', '');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO `test` VALUES (2, NULL, NULL, 'kubesre', 'www.kubesre.com/', 'ECS', '');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO `test` VALUES (3, NULL, NULL, 'kubesre', 'www.kubesre.com/', 'ECS', '');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `test` VALUES (4, NULL, NULL, 'kubesre', 'www.kubesre.com/', 'ECS', '');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO `test` VALUES (5, NULL, NULL, 'kubesre', 'www.kubesre.com/', 'ECS', 'Pod');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+----+------------+-----------+------------+-------------------+------+----------+
| id | created_at | update_at | panel_name | link              | icon | tag_name |
+----+------------+-----------+------------+-------------------+------+----------+
|  1 | NULL       | NULL      | kubesre    | www.kubesre.com/  | ECS  |          |
|  2 | NULL       | NULL      | kubesre    | www.kubesre.com/  | ECS  |          |
|  3 | NULL       | NULL      | kubesre    | www.kubesre.com/  | ECS  |          |
|  4 | NULL       | NULL      | kubesre    | www.kubesre.com/  | ECS  |          |
|  5 | NULL       | NULL      | kubesre    | www.kubesre.com/  | ECS  | Pod      |
|  6 | NULL       | NULL      | kubesre    | www.kubesre.com/  | ECS  |          |
|  7 | NULL       | NULL      | kubesre    | www.kubesre.com/  | ECS  |          |
|  8 | NULL       | NULL      | kubesre    | www.kubesre.com/  | ECS  |          |
+----+------------+-----------+------------+-------------------+------+----------+

# kubectl get hpa -n mysql
NAME                          REFERENCE           TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
keda-hpa-mysql-scaledobject   statefulset/mysql   4/4 (avg)   1         100       2          4h56m

# kubectl get po -n mysql
NAME           READY   STATUS    RESTARTS        AGE
mysql-0        1/1     Running   1 (5h45m ago)   5h47m
mysql-1        0/1     Running   0               55s
由于我集群本身的原因,mysql-1 没有起来,但是我们看到了今天实验目的已经成功

结论

在本文中,我们利用KADA实现了基于事件的弹性伸缩,更加紧密的拥抱业务,基于服务的“事件”实现伸缩,使得伸缩更加合理,高效。但事实上,针对像Mysql 这类有状态服务伸缩,如何实现伸缩过程中的数据一致性及可用性是需要各个服务需要考虑的问题,但我相信在不久的将来,有状态服务的伸缩也可以像现如今的无状态服务一样顺滑~



Tags:Kubernetes   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  Search: Kubernetes  点击:(6)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  Search: Kubernetes  点击:(12)  评论:(0)  加入收藏
聊聊 Kubernetes 网络模型综合指南
这篇详细的博文探讨了 Kubernetes 网络的复杂性,提供了关于如何在容器化环境中确保高效和安全通信的见解。译自Navigating the Network: A Comprehensive Guide to Kubernete...【详细内容】
2024-02-19  Search: Kubernetes  点击:(37)  评论:(0)  加入收藏
Kubernetes是什么?主要特点是什么?
Kubernetes是什么?Kubernetes,也称为K8s,是一个开源的容器编排系统,由Google首次开发和维护。它允许容器化的应用程序在集群中自动部署、扩展和管理。Kubernetes提供了一种容器...【详细内容】
2024-02-01  Search: Kubernetes  点击:(154)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  Search: Kubernetes  点击:(50)  评论:(0)  加入收藏
Kubernetes Informer基本原理,你明白了吗?
本文分析 k8s controller 中 informer 启动的基本流程不论是 k8s 自身组件,还是自己编写 controller,都需要通过 apiserver 监听 etcd 事件来完成自己的控制循环逻辑。如何高...【详细内容】
2024-01-30  Search: Kubernetes  点击:(37)  评论:(0)  加入收藏
Kubernetes 100个常用命令!
这篇文章是关于使用 Kubectl 进行 Kubernetes 诊断的指南。列出了 100 个 Kubectl 命令,这些命令对于诊断 Kubernetes 集群中的问题非常有用。这些问题包括但不限于:• 集...【详细内容】
2024-01-03  Search: Kubernetes  点击:(76)  评论:(0)  加入收藏
一文读懂Kubernetes部署策略
在这篇文章中,我们将深入研究 Kubernetes 部署概念和一些常见策略,了解每种策略的优缺点。合适的部署策略使我们能够在发布应用程序时最大限度地减少停机时间、增强客户体验并...【详细内容】
2024-01-03  Search: Kubernetes  点击:(59)  评论:(0)  加入收藏
从Kubernetes的探针到DevOps
今天在群里又看有人问如何设置 Kubernetes 的探针,感觉要补充的话太多了,结合我们在一些 DevOps 项目中痛苦的体验,今天一劳永逸的全部说完,此外,也为大家展现一下为什么 DevOps...【详细内容】
2023-12-27  Search: Kubernetes  点击:(114)  评论:(0)  加入收藏
如何基于Kubernetes运行Nacos高可用集群
Nacos(Namings and Configuration Management)是阿里巴巴开源的一个易于构建云原生应用的动态服务发现、配置管理和服务管理平台。以下是Nacos的一些主要功能和特点: 服务发现...【详细内容】
2023-12-18  Search: Kubernetes  点击:(69)  评论:(0)  加入收藏
▌简易百科推荐
Docker 和传统虚拟机有什么区别?
我有一个程序员朋友,他每年情人节都要送女朋友一台服务器。他说:“谁不想在过节当天收到一台 4核8g 的服务器呢?”“万一对方不要,我还能留着自己用。” 给他一次过节的机会,他能...【详细内容】
2024-03-26  小白debug  微信公众号  Tags:Docker   点击:(12)  评论:(0)  加入收藏
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22    51CTO  Tags:Docker   点击:(10)  评论:(0)  加入收藏
Containerd容器管理
Nginx 指定容器名称 使用 ctr container create 命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。容器基本操作容器基本操作主要是 ctr image 命令,查看命令帮...【详细内容】
2024-03-20  云原生运维圈  微信公众号  Tags:容器   点击:(13)  评论:(0)  加入收藏
如何基于Docker镜像逆向生成Dockerfile
引言你是否曾经遇到过一个想要使用的 Docker 镜像,但却无法修改以适应你的特定需求?或者你可能发现了一个喜欢的 Docker 镜像,但想要了解它是如何构建的?在这两种情况下,将 Docke...【详细内容】
2024-03-07  云原生运维圈  微信公众号  Tags:Docker   点击:(22)  评论:(0)  加入收藏
Kubernetes是什么?主要特点是什么?
Kubernetes是什么?Kubernetes,也称为K8s,是一个开源的容器编排系统,由Google首次开发和维护。它允许容器化的应用程序在集群中自动部署、扩展和管理。Kubernetes提供了一种容器...【详细内容】
2024-02-01    简易百科  Tags:Kubernetes   点击:(154)  评论:(0)  加入收藏
我们一起聊聊容器资源自愈
在企业实际在使用容器这类资源的时候,除了技术本身,要考虑的其他问题也会很多。企业管理的容器有千千万万,出于效率考虑,对于有特殊需求的容器如何进行批量创建和管理呢,这就需要...【详细内容】
2024-01-30  匠心独运维妙维效  微信公众号  Tags:容器   点击:(47)  评论:(0)  加入收藏
Docker与Docker Compose入门:释放你应用部署的威力
今天给大家介绍一项强大而有趣的技能,那就是使用 Docker 和 Docker Compose 来释放你的应用部署的威力!无论你是一名开发人员还是系统管理员,掌握这个技能都将为你的工作带来巨...【详细内容】
2024-01-17  waynblog  微信公众号  Tags:Docker   点击:(65)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  编程技术汇  今日头条  Tags:Docker   点击:(77)  评论:(0)  加入收藏
如何在 Ubuntu 上安装 Docker
使用 Docker 意味着开启一个新的计算领域,但如果你刚刚开始使用 Docker,安装可能看起来是一项艰巨的任务。在 Ubuntu 上安装 Docker 有两种推荐的方法: 从 Ubuntu 的仓库安装 D...【详细内容】
2024-01-04    Linux中国  Tags:Docker   点击:(124)  评论:(0)  加入收藏
从Kubernetes的探针到DevOps
今天在群里又看有人问如何设置 Kubernetes 的探针,感觉要补充的话太多了,结合我们在一些 DevOps 项目中痛苦的体验,今天一劳永逸的全部说完,此外,也为大家展现一下为什么 DevOps...【详细内容】
2023-12-27  云云众生s  微信公众号  Tags:Kubernetes   点击:(114)  评论:(0)  加入收藏
站内最新
站内热门
站内头条