• Java根据线程指标自定义HPA(Prometheus为监控收集)


    以下内容是成功后反向整理的,过程未直接验证,有问题可以直接留言 谢谢

    Java程序暴露指标

    这里使用prometheus simpleclient暴露java的一些指标
    在pom.xml增加

     
            <dependency>
                <groupId>io.prometheusgroupId>
                <artifactId>simpleclientartifactId>
                <version>0.16.0version>
            dependency>
            
            <dependency>
                <groupId>io.prometheusgroupId>
                <artifactId>simpleclient_hotspotartifactId>
                <version>0.16.0version>
            dependency>
            
            <dependency>
                <groupId>io.prometheusgroupId>
                <artifactId>simpleclient_httpserverartifactId>
                <version>0.16.0version>
            dependency>
            <dependency>
                <groupId>io.prometheusgroupId>
                <artifactId>simpleclient_servletartifactId>
                <version>0.16.0version>
            dependency>
    
            
            <dependency>
                <groupId>io.prometheusgroupId>
                <artifactId>simpleclient_pushgatewayartifactId>
                <version>0.16.0version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    增加/metrics接口,这里是直接暴露simpleclinet的Servlet

        @Bean
        public ServletRegistrationBean getServletRegistrationBean() {
            ServletRegistrationBean bean = new ServletRegistrationBean(new MetricsServlet());
            bean.addUrlMappings("/metrics");
            return bean;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    编写K8S Service将指标端口暴露

    kind: Service
    apiVersion: v1
    metadata:
      name: user-service-metrics
      namespace: wit-parking-dev
      labels:
        app: user-service-metrics
      annotations:
        kubesphere.io/creator: admin
    spec:
      ports:
        - name: http-metrics
          protocol: TCP
          port: 30002
          targetPort: 30002
          nodePort: 21904
      selector:
        app: user-service
      type: NodePort
      sessionAffinity: None
      externalTrafficPolicy: Cluster
      ipFamilies:
        - IPv4
      ipFamilyPolicy: SingleStack
      internalTrafficPolicy: Cluster
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    访问: http://k8s服务器:21904/metrics 出现如下输出就算配置正确了
    在这里插入图片描述

    配置ServiceMonitor将指标暴露给Prometheus

    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      generation: 1
      labels:
        prometheus: kube-prometheus
      name: prometheus-user-service
      namespace: monitoring-system
    spec:
      endpoints:
      # 解决当抓取的 label 与后端 Prometheus 添加 label 冲突时的处理。
    # true: 保留抓取到的 label,忽略与后端 Prometheus 冲突的 label;
    # false: 对冲突的 label,把抓取的 label 前加上 exported_,添加后端 Prometheus 增加的 label;
      - honorLabels: true
        interval: 30s # 抓取任务间隔的时间
        port: http-metrics #这里使用service的port名
      namespaceSelector:
        any: true #需要选取 namespace 列表 数组 这里 匹配任何命名空间
      selector:
        matchLabels:
          app: user-service #匹配Labels
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    安装prometheus-adapter,将prometheus指标将接口转为k8s的

    helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
    kubectl create ns prometheus-adapter
    
    • 1
    • 2

    编写 values.xml内容如下:

    rules:
      default: false
      custom:
       - seriesQuery: '{__name__=~"^jvm_threads_current.*",container="",pod!=""}' #过滤需要的指标,__name__是指标名称,后面可以是指标的过滤条件
         seriesFilters:  # 对指标进行过滤,这里支持is 和 isNot 两个过滤条件
           - isNot: "jvm_threads_current_not" # 排除掉jvm_threads_current_not 这个指标,
         resources:
           overrides: #一般K8S暴露的指标基本就是用 pod和 namespace去过滤, 意思是 指标中的namespace和k8s中的namespace关联,pod同理,因为 pod 和 namespace 都属于核心 api 组,所以不需要指定 api 组,如果需要组需要添加 group 字段 级为{group: "apps", resource: "deployment"}
             namespace: { resource: "namespace" } 
             pod: { resource: "pod" }
         name: # 这里是将只表明改个名
           matches: "(.*)"
           as: "jvm_threads_current"
         metricsQuery: <<.Series>>{<<.LabelMatchers>>} # 指标格式化模板,
    prometheus:
      url: http://prometheus-k8s.kubesphere-monitoring-system.svc.cluster.local #普罗米修斯访问地址 这里不需要加端口,默认9090
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    安装: prometheus-adapter

    helm install prometheus-adapter prometheus-community/prometheus-adapter -n prometheus-adapter --values values.yaml
    
    • 1

    测试 :

    kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 | jq .
    
    • 1

    显示如下内容即成功:
    在这里插入图片描述

    kubectl get --raw '/apis/custom.metrics.k8s.io/v1beta1/namespaces/wit-parking-dev/pods/*/jvm_threads_current' | jq .
    
    • 1

    会显示具体的指标值:
    在这里插入图片描述

    配置HPA资源,

    这里使用的是上面指标接口的jvm_threads_current也就是当前线程数量作为扩容指标,这个指标随便改吧…

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: user-service-v1
      namespace: wit-parking-dev
    spec:
      maxReplicas: 2
      metrics:
      - pods: 
          metric:
            name: jvm_threads_current
          target:
            averageValue: "400"
            type: AverageValue
        type: Pods
      minReplicas: 1
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: user-service-v1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    学习参考资料:
    https://github.com/kubernetes-sigs/prometheus-adapter/blob/master/docs/config.md
    https://www.bookstack.cn/read/kubernetes-1.23-zh/e237dd06127a0036.md
    https://system51.github.io/2021/12/22/custom-metrics-hpa/
    https://www.qikqiak.com/k8strain/monitor/adapter/

  • 相关阅读:
    【教程】微信推文怎么添加附件文档 (如word文档、excel表格、pdf文件)
    Unity摄像机跟随
    Capto2022中文版一款适用Mac屏幕录制编辑软件
    力扣-232.用栈实现队列
    六款Linux常用远程连接工具介绍,看看哪一款最适合你
    JVM_类加载过程
    springcloudalibaba架构(21):MQ的简介
    sparksql broadcast join opt
    如何一次性批量打印PDF、Word、Excel、PPT和图片 - 文件批量打印工具
    python装饰器原理梳理
  • 原文地址:https://blog.csdn.net/joker_zhou/article/details/126435534