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

Java程序暴露指标

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

 <!-- The client -->
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient</artifactId>
            <version>0.16.0</version>
        </dependency>
        <!-- Hotspot JVM metrics-->
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient_hotspot</artifactId>
            <version>0.16.0</version>
        </dependency>
        <!-- Exposition HTTPServer-->
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient_httpserver</artifactId>
            <version>0.16.0</version>
        </dependency>
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient_servlet</artifactId>
            <version>0.16.0</version>
        </dependency>

        <!-- Pushgateway exposition-->
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient_pushgateway</artifactId>
            <version>0.16.0</version>
        </dependency>

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

    @Bean
    public ServletRegistrationBean getServletRegistrationBean() {
        ServletRegistrationBean bean = new ServletRegistrationBean(new MetricsServlet());
        bean.addUrlMappings("/metrics");
        return bean;
    }

编写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

访问: 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_<original-label>,添加后端 Prometheus 增加的 label;
  - honorLabels: true
    interval: 30s # 抓取任务间隔的时间
    port: http-metrics #这里使用service的port名
  namespaceSelector:
    any: true #需要选取 namespace 列表 数组 这里 匹配任何命名空间
  selector:
    matchLabels:
      app: user-service #匹配Labels

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

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

编写 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

安装: prometheus-adapter

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

测试 :

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

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

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

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

配置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

学习参考资料:
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/

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐