k8s HPA升级 KEDA 基于prometheus的数据指标进行弹性伸缩

news2024/11/21 0:39:49

说明: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/110304.html

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

相关文章

【软件测试】那些35岁以上的测试人哪去了?

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 先根据大体年龄阶段…

B+树详解,一次就懂

⭐注意:不会直接讲 B树的结构,会从最简单的二叉树开始讲起来。如果认真看完,我想你对树类型的数据结构的理解又上了一个新的台阶。 ⭐如果有误,请大家指出。下文均是在B站学习的过程中,总结的笔记和心得体会 索引结构 …

四、网络层(五)IP组播

目录 5.1 组播的概念 5.2 IP组播的地址 5.3 因特网组管理协议(IGMP) 5.4 组播路由算法 5.1 组播的概念 为了更好地支持像视频会议这类一对多的通信,需要源主机一次发送的单个分组,能抵达用一个组地址标识的若干台目的主…

【老保姆教程】:Tesseract-OCR图片文字识别

文章目录🌟介绍一波🌟小安装🌟配置环境变量⭐️tesseract-ocr配置⭐️tessdata语言配置⭐️检测环境变量是否安装成功🌟语言包的配置使用🌟CMD命令框中进行图片识别操作⭐️举例一:识别数字⭐️举例二&…

@PostConstruct(重点,初始化加载)和@PreDestroy 注解

PostConstruct和PreDestroy 注解 PostConstruct和PreDestroy都是属于Bean生命周期的一部分; PostConstruct:在bean创建完成并且属性赋值完成之后来执行初始化方法,常用于:项目启动完成后的初始化操作,比如不经常变的Redis缓存Pr…

二、LVS的安装部署

LVS的安装部署LVS的安装部署一、LVS的安装1、yum安装2、源码包安装二、ipvsadm命令详解LVS 相关软件ipvsadm 命令ipvsadm 工具用法:防火墙标记LVS 持久连接三、部署LVS NAT1、LVS NAT模式注意事项2、实验环境3、部署RS1和RS2的nginx4、将RS1和RS2的网关配置为DR的内…

maven私服

分模块开发时,被引用的模块不可能拷来拷去,应该放在单位内部的某一个服务器上,这就是私服。这里使用nexus作为私服软件。 Nexus ● Nexus是Sonatype公司的一款maven私服产品 ●下载地址 Nexus安装、启动与配置 ● 解压即安装 ● 修改基…

我国登山鞋行业参与者越发广泛带来广阔潜在需求 女性市场值得期待

登山鞋属于户外运动鞋,是专门为爬山和旅行而设计制造的鞋子,具有防水性、防滑性、足部保护功能、耐用性等功能,其中防水性是现代登山鞋的首要功能。 资料来源:中国登山鞋行业发展趋势研究与未来投资分析报告(2022-2029…

StarRocks Join Reorder 源码解析

导读:欢迎来到 StarRocks 源码解析系列文章,我们将为你全方位揭晓 StarRocks 背后的技术原理和实践细节,助你逐步了解这款明星开源数据库产品。 本期 StarRocks 技术内幕将介绍 Join Reorder 算法如何找到最优解的原理。 背景介绍 多表 Join…

vue之watchEffect

在Options API中,我们可以通过watch选项来侦听data或者props的数据变化,当数据变化时执行某一些操作。 在Composition API中,我们可以使用watchEffect和watch来完成响应式数据的侦听。 watchEffect用于自动收集响应式数据的依赖,需…

Jmeter实现websocket协议接口测试

一.为了方便使用,首先将jmeter设置成中文,有两种方法: 1.在Jmeter界面进行设置,Options ->Choose Language ->Chinese(Simplified),这种方法在关闭jmeter重启后又会恢复成默认的英文,如果…

学习Python编程好找工作吗?

说起编程语言,不少人都会推荐学习Python,但很多人对Python不太了解,所以比较好奇“学习Python编程是否好找工作”,关于这个问题,小编通过下文为大家详细解答一下。 从市场情况来讲,Python职位比较多&…

阿里内部进阶学习SpringBoot+Vue全栈开发实战文档

前言 Spring 作为一个轻量级的容器,在JavaEE开发中得到了广泛的应用,但是Spring 的配置烦琐臃肿,在和各种第三方框架进行整合时代码量都非常大,并且整合的代码大多是重复的,为了使开发者能够快速上手Spring&#xff0…

105.(leaflet之家)leaflet态势标绘-聚集地修改

地图之家总目录(订阅之前请先查看该博客) 地图之家:cesium+leaflet+echart+地图数据+地图工具等相关内容的介绍 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html>…

Python函数总结

在Python中&#xff0c;函数是一个带有名字的代码块&#xff0c;可以被反复调用。函数可以帮助你组织和重用代码&#xff0c;使你的程序更整洁&#xff0c;更易于维护。本文将会深入探索Python的秘密 目录 定义函数 自定义函数 内置函数 函数式方程 高阶函数 函数标注 …

Linux5.4.0内存分配器核心代码解析

理论 伙伴系统 核心代码解析 __rmqueue_smallest函数 在zone的free_list上进行搜索,找到符合migratetype的、大小为order的空闲页面块 static __always_inline struct page *__rmqueue_smallest(struct zone *zone, unsigned int order,int migratetype

【TypeScript】常用类型声明详情概述

目录 TypeScript常用类型 类型注解 TS类型概述 原始类型 数组类型 对象类型 函数类型 类型别名 接口 元组 字面量类型 枚举 any类型 typeof操作符 类型推论 类型断言 TypeScript常用类型 TypeScript是JS的超集&#xff0c;TS提供了JS的所有功能&#xff0c;并额…

【Linux】第五部分 网络配置

【Linux】第五部分 网络配置 文章目录【Linux】第五部分 网络配置5. 网络配置5.1 对vmware网络连接的三种模式探讨&#xff0c;Bridged&#xff08;桥接模式&#xff09;、NAT&#xff08;网络地址转换模式&#xff09;、Host-Only&#xff08;仅主机模式&#xff09;Bridged&a…

车企数据治理的障碍是什么?如何解决?

​在全行业数字化转型的浪潮下&#xff0c;底层技术的发展与行业之间的碰撞&#xff0c;正在成为变革的巨大力量&#xff0c;汽车行业也是如此。汽车行业的“数字化转型”是利用新的技术驱动行业的创新与发展&#xff0c;改善用户体验、重构商业模式、降本增效&#xff0c;而这…

跟着pink老师学习第二天的学习总结(1)

1.CSS初始化 <style>/* 清除浏览器默认格式 */*{margin:0;padding:0}/* 斜体文字不倾斜 */em,i{font-style:normal}/* 去掉li的小圆点 */li{list-style:none}img{/* 照顾低版本浏览器,如果图片外面包含链接,会出现边框 */border:0;/* 取消图片底部与边框产生的缝隙 */ve…