Java根据线程指标自定义HPA(Prometheus为监控收集)
这里使用的是上面指标接口的jvm_threads_current也就是当前线程数量作为扩容指标,这个指标随便改吧…访问: http://k8s服务器:21904/metrics 出现如下输出就算配置正确了。增加/metrics接口,这里是直接暴露simpleclinet的Servlet。这里使用prometheus simpleclient暴露java的一些指标。安装:prometheus-ada
以下内容是成功后反向整理的,过程未直接验证,有问题可以直接留言 谢谢
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/
更多推荐
所有评论(0)