k8s HPA升级 KEDA 基于事件驱动的自动伸缩

news2024/11/17 3:25:17

说明:KEDA有啥用,相对HPA有啥优势。HPA针对于cpu,内存来进行弹性伸缩,有点不太精确。KEDA可以接入prometheus,根据prometheus的数据指标进行弹性伸缩,相比更加的精准实用。

  1. 安装k8s环境
  2. 部署prometheus
    创建ns:
    部署说明:下载的镜像地址有可能下载很慢,可以去相关网站拉取然后修改镜像地址。或者实用代理网络下载。
kubectl create ns keda-demo
#cat  prometheus.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
  - apiGroups: [""]
    resources:
      - services
    verbs: ["get", "list", "watch"]
  - nonResourceURLs: ["/metrics"]
    verbs: ["get"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: keda-demo
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
  - kind: ServiceAccount
    name: keda-demo
    namespace: keda-demo
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: prom-conf
  labels:
    name: prom-conf
data:
  prometheus.yml: |-
    global:
      scrape_interval: 5s
      evaluation_interval: 5s
    scrape_configs:
      - job_name: 'go-prom-job'
        kubernetes_sd_configs:
        - role: service
        relabel_configs:
        - source_labels: [__meta_kubernetes_service_label_run]
          regex: go-prom-app-service
          action: keep
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus-server
  template:
    metadata:
      labels:
        app: prometheus-server
    spec:
      serviceAccountName: keda-demo
      containers:
        - name: prometheus
          image: prom/prometheus
          args:
            - "--config.file=/etc/prometheus/prometheus.yml"
            - "--storage.tsdb.path=/prometheus/"
          ports:
            - containerPort: 9090
          volumeMounts:
            - name: prometheus-config-volume
              mountPath: /etc/prometheus/
            - name: prometheus-storage-volume
              mountPath: /prometheus/
      volumes:
        - name: prometheus-config-volume
          configMap:
            defaultMode: 420
            name: prom-conf
        - name: prometheus-storage-volume
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus-service
spec:
  type: NodePort
  ports:
    - port: 9090
      protocol: TCP
  selector:
    app: prometheus-server
#kubectl apply -f  prometheus.yaml  -n keda-demo
  1. 访问http://ip:端口
    在这里插入图片描述

  2. 部署Keda
    可以在github下载其他版本:

#kubectl apply -f https://github.com/kedacore/keda/releases/download/v2.4.0/keda-2.4.0.yaml 
  1. 查看
    metrics-apiserver将数据提供给Horizo​​ntal Pod Autoscaler(HPA),operator被deployment所使用。operator pod激活Kubernetes部署,实现向上和向下扩展。
#kubectl get pods -n keda

在这里插入图片描述

  1. 部署go程序
[root@master k9s]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-prom-app
  namespace: keda-demo
spec:
  selector:
    matchLabels:
      app: go-prom-app
  template:
    metadata:
      labels:
        app: go-prom-app
    spec:
      containers:
        - name: go-prom-app
          image: djam97/keda:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: go-prom-app-service
  namespace: keda-demo
  labels:
    run: go-prom-app-service
spec:
  type: NodePort
  ports:
    - port: 8080
      protocol: TCP
  selector:
    app: go-prom-app
#kubectl apply -f deployment.yaml 
#kubectl get pod -n keda-demo

访问容器go服务:
在这里插入图片描述

在prometheus上查看指标了,我们其实就是根据这个指标来做的伸缩。
在这里插入图片描述

附加内容:djam97/keda镜像源码,如果你的其他的go项目也需要有http_requests指标,就需要如下加上,不然KEDA后面无法根据指标进行监控伸缩。

package main


import (
        "fmt"
        "log"
        "net/http"


        "github.com/prometheus/client_golang/prometheus"
        "github.com/prometheus/client_golang/prometheus/promhttp"
)


type Labels map[string]string


var (
        httpRequestsCounter = prometheus.NewCounter(prometheus.CounterOpts{
               Name: "http_requests",
               Help: "number of http requests",
        })
)


func init() {
        // Metrics have to be registered to be exposed:
        prometheus.MustRegister(httpRequestsCounter)
}


func main() {
        http.Handle("/metrics", promhttp.Handler())
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
               defer httpRequestsCounter.Inc()
               fmt.Fprintf(w, "Hello, you've requested: %s\n", r.URL.Path)
        })
        log.Fatal(http.ListenAndServe(":8080", nil))
}
  1. ScaledObject部署:
#cat scaled-object.yaml
[root@master k9s]# cat scaled-object.yaml
apiVersion: keda.sh/v1alpha1
# Custom CRD provisioned by the Keda operator
kind: ScaledObject
metadata:
  name: prometheus-scaledobject
spec:
  scaleTargetRef:
    # target our deployment
    #deployment的名字
    name: go-prom-app
  # Interval to when to query Prometheus
  #探测时间间隔,默认30
  pollingInterval: 5
  # The period to wait after the last trigger reported active
  # before scaling the deployment back to 1
  #pod生存的时间可选. 默认: 300 
  cooldownPeriod: 30
  # min replicas keda will scale to
  # if you have an app that has an dependency on pubsub
  # this would be a good use case to set it to zero
  # why keep your app running if your topic has no messages?
  #基础最小数量
  minReplicaCount: 1
  # max replicas keda will scale to
  #限制最大数据量
  maxReplicaCount: 20
  #可选.扩容策略在advanced.horizo​​ntalPodAutoscalerConfig.scaleUp.policies中指定了50%,这意味着pod将按其当前pod数量的50%进行扩展。1 -> 2 -> 3 -> 5 -> 8 -> 12 -> 18 -> 20,扩展到20个Pod就停止。
  advanced:
    # HPA config
    # Read about it here: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
    horizontalPodAutoscalerConfig:
      behavior:
        scaleDown:
          stabilizationWindowSeconds: 30
          policies:
            - type: Percent
              value: 50
              periodSeconds: 30
        scaleUp:
          stabilizationWindowSeconds: 0
          policies:
            - type: Percent
              value: 50
              periodSeconds: 10
  triggers:
    - type: prometheus   #支持rabbitmq, prometheus,Kafka,mysql,PostgreSQL等等
      metadata:
        # address where keda can reach our prometheus on
        #serverAddress: http://prometheus-service.keda-demo.svc.cluster.local:9090
        #prometheus地址
        serverAddress: http://192.168.14.27:32022
        # metric on what we want to scale
        #metic名字可以随便取
        metricName: http_requests_test  
        # if treshold is reached then Keda will scale our deployment
        #query值的大于100就执行hpa
        threshold: "100"
        #query语句,一分钟内的请求数大于100触发
        query:  sum(rate(http_requests{job="go-prom-job"}[1m]))
# kubectl apply -f scaled-object.yaml -n keda-demo
#kubectl  get  svc -n keda-demo

在这里插入图片描述

  1. 测试当请求数1分钟大于100是否自动扩容:
    安装hey:
#wget https://hey-release.s3.us-east-2.amazonaws.com/hey_linux_amd64
#chmod +x hey_linux_amd64
#mv hey_linux_amd64 /usr/bin/hey

#hey -n 10000 -m GET http://192.168.14.27:31064/
#for i in {1..100};do sleep 2; hey -n 1000 -m GET http://192.168.14.27:31064/;done

在这里插入图片描述

在这里插入图片描述
停止访问,看容器是否自动缩容到1:
在这里插入图片描述
在这里插入图片描述

小注意:ScaledObject 必须要和go-deployment在一个名称空间,不然无效。ScaledObject 找不到它

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HashMap最全面试题

文章目录一、 存储结构字段结构二、索引计算三、put方法四、扩容机制五、其他一、 存储结构 HashMap的底层数据结构是什么? 在JDK1.7 和JDK1.8 中有所差别: 在JDK1.7 中,由“数组链表”组成,数组是 HashMap 的主体,链…

Django学习Day6

1.ORM故障处理 1)当执行python manager.py makemigrations出现迁移问题时,如何进行解决。 处理方案:在models.py中,为book表的des非空字段设置一个默认值。 2)数据库的迁移文件混乱问题 数据库中的django_migrations记录了migra…

健康指标管理系统

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 模块划分:公告类型、公告信息、地区信息、用户信息、人员分类、人员信息、指标信息、健康信息 管理员功能&a…

Java+MYSQL基于ssm在线投票管理系统

随着社会的发展,人们在处理一些问题的时候不同意见越来越多,这源于人们对思想的解放和对社会的认识。所以在处理同一问题上,为了征求不同人的意见在线投票系统诞生了。 传统的投票模式都是通过人工手动填写问卷的方式来进行,这在很大程度上会造成人力和资源上的浪费。随着科技的…

擎创技术流 | ClickHouse实用工具—ckman教程(7)

​ ​一期一会的“ckman”教程又跟大家见面了,本期分享的重点主要针对上期后台陆续收到的问题展开,解答完问题后再带入一些关于“ckman”升级的相关讲解。感兴趣的朋友可以先关注一波。还是老规矩,先带大家复习下前几期的分享内容↓↓↓ 擎创…

springboot整合mongodb 保姆级教程

1、确保mongodb是否安装 Linux安装docker 保姆级教程_ 来杯咖啡的博客-CSDN博客&#xff08;可以看这篇文章&#xff09; 2、代码展示 2.1 使用 MongoTemplate 创建boot项目&#xff0c;导入架包。 <?xml version"1.0" encoding"UTF-8"?> <p…

带你深入了解一下vue.js中的this.$nextTick!

我们先看看nextTick究竟是个啥&#xff1f; console.log(this.$nextTick); // 控制台打印 if(fn){return nextTick(fn, this); } 我们可以看出nextTick就是一个方法&#xff0c;方法有两个参数&#xff1a;fn和this&#xff0c;fn就是需要传的回调函数&#xff0c;this就是所…

主轴承盖螺栓拧紧机PLC控制程序

HMI为西门子TP900触摸屏&#xff0c;支持屏幕触摸和按键操作 设备主要参数 设备外形尺寸&#xff1a;长*宽*高 2180*1900*2500mm 生产节拍&#xff1a; 55 S 电源电压&#xff1a; AC380V5%&#xff0c;50HZ&#xff0c;三相五线制 系统组态 常见故障处理 气缸报警 报警原…

Windows下安装VTK8.2.0

Windows下安装VTK8.2.0 1、依赖 VS2017 Qt5 cmake 2、前期准备 2.1、访问vtk官方下载VTK8.2.0源码 VTK源码下载地址&#xff1a;https://vtk.org/download/ 2.2、配置环境变量 配置CMAKE_PREFIX_PATH&#xff0c;值为Qt的bin路径 2.3、新建2个文件夹一个用于存放cm…

11 个有用的现代 JavaScript 技巧

在我们日常开发工作中&#xff0c;我们经常使用到字符串的转换、检查它是否存在的对象中的键、有条件地操作对象数据、过滤数组中的假值等。 在这里&#xff0c;我整理了一些很棒的JavaScript的技巧&#xff0c;这些技巧是我个人最喜欢的&#xff0c;因为它使我的代码更短更干…

亚马逊云科技:还在苦于ETL?Zero ETL的时代已全面到来

在2022亚马逊云科技re:Invent全球大会上&#xff0c;亚马逊云科技数据和机器学习副总裁Swami Sivasubramanian表示&#xff1a;“当前&#xff0c;客户管理的数据既庞大又复杂&#xff0c;这意味着他们不能只用单一技术或几个工具来分析和探索这些数据。在此次2022亚马逊云科技…

Java反射和new效率差距有多大?

1、创建对象的两种方式 //new 方式创建对象 ReflectDemo reflectDemo new ReflectDemo();//反射创建对象 反射创建对象的三种方式 (1)Class<ReflectDemo> reflectDemoClass ReflectDemo.class; (2)Class<?> aClass Class.forName ("com.whale.springtra…

网络ping不通,试试这8招

摘要&#xff1a;网络ping不通&#xff0c;该怎么办&#xff1f;本文教你8个大招&#xff0c;轻松找到问题根源。本文分享自华为云社区《网络ping不通&#xff0c;该怎么办&#xff1f;》&#xff0c;作者&#xff1a;wljslmz。 如下图&#xff0c;PC&#xff08;192.168.10.1…

使用windows系统给C盘分盘

前言 一般我们使用新电脑的时候&#xff0c;有的时候默认给我们分好了盘&#xff0c;有时候只会把全部的内存都放到C盘&#xff0c;这样就需要我们自己手动进行分配资源和分配其他硬盘资源 今天公司邮寄的新电脑到了&#xff0c;正好属于后者&#xff0c;借助这个机会分享下我…

【C语言进阶】六.预处理

&#xff08;1&#xff09;程序的翻译环境和执行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。包含编译加链接第2种是执行环境&#xff0c;它用于实际执行代码。 &#xff08;2…

KingbaseES V8R6集群运维案例---数据块故障自动修复(auto_bmr)

案例说明&#xff1a; 在Oracle11.2版本之后&#xff0c;DataGuard 若搭建实时应用日志的物理备库&#xff0c;那么在主库数据文件少 量坏块的情况下&#xff0c;可以利用ABCR技术快速修复坏块。 Starting in Oracle Database 11g Release 2 (11.2), the primary database auto…

高通Ride软件开发包使用指南(12)

高通Ride软件开发包使用指南&#xff08;12&#xff09;9 PCIe交换机9.1简介9.2 PCIe交换机管理9.2.1工具9.2.2 COM端口和COM端口设置9.2.3更新固件和配置9.2.3.1工具设置9.2.3.2 Platform setup9.2.3.3交换机更新9 PCIe交换机 9.1简介 在Snapdragon Ride的高级配置中&#x…

四、基于kubeadm安装kubernetes1.25集群第三篇

接上篇&#xff1a;https://blog.csdn.net/u011837804/article/details/128355649 1、安装 kubeadm、kubelet 和 kubectl 1.1、配置yum源 cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernet…

算法| Java的int类型最大值为什么是21亿多?

开篇 本文主要介绍在Java中&#xff0c;为什么int类型的最大值为2147483647。 理论值 我们都知道在Java中&#xff0c;int 的长度为32位。 理论上&#xff0c;用二进制表示&#xff0c;32位每一位都是1的话&#xff0c;那么这个数是多少呢&#xff1f; 我们来计算一下&…

【QGIS入门实战精品教程】10.1:QGIS基于DEM数据的地形分析案例教程

本文讲解QGIS中基于DEM数据的地形分析方法,包括:坡度分析、坡向分析、山体阴影、地貌分析、强度指数(地形复杂性)。 文章目录 一、加载DEM二、坡度分析三、坡向分析四、山体阴影五、地貌分析六、强度指数(地形复杂性)QGIS提供了地形分析的工具,位于工具箱→Raster terrain a…