kube-prometheus自动发现
针对公司生产环境使用的k8s集群监控,我安装了prometheus官网的套件"kube-prometheus" →本地使用下载→ kube-prometheus
tar xfv kube-prometheus.tar
sed -i 's@registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.7.0@registry.cn-hangzhou.aliyuncs.com/kubernetesz/kube-state-metrics:v2.9.2@' manifests/kubeStateMetrics-deployment.yaml
sed -i 's@registry.k8s.io/prometheus-adapter/prometheus-adapter@registry.cn-hangzhou.aliyuncs.com/kubernetesz/prometheus-adapter@' manifests/prometheusAdapter-deployment.yaml
kubectl create -f manifests/setup
kubectl create -f manifests
其中有两个外国镜像下载不了,替换为国内源,其他的可能慢点,稍等等就可以下载下来
简单几条命令你就可以在自己的集群内安装一套prometheus的监控
其中prometheus的web页面和grafana的页面需要自己将svc的clusterIP改为NodePort,就可以直接访问ip加端口进入页面,grafana初始账号密码都是admin
kube-prometheus 套件是一套用于Kubernetes的监控资源的预打包集合。它使用了几个关键的开源项目来提供对Kubernetes集群的全方位监控解决方案。具体包括:
Prometheus: 一个开源监控系统和时间序列数据库。它收集和存储指标(metrics),提供了强大的查询语言(PromQL)来利用这些数据。
Alertmanager: Prometheus的组件之一,负责处理由Prometheus服务器发送的警报,并且将这些警报通过配置的方式发送给用户。
Node-exporter: 一种运行在集群中每个节点上的代理,用于收集关于节点的硬件和操作系统指标。
kube-state-metrics: 一个简单的服务,用于监听Kubernetes API服务器,并生成关于对象(如部署、节点和Pod)状态的指标。
Grafana: 一个用于数据可视化的工具,通常与Prometheus集成,用于构建和分享用于查看和分析监控数据的仪表板。
这些组件在kube-prometheus套件中紧密集成,实现以下功能:
集群监控: 能够监控整个Kubernetes集群的状态,包括节点、Pods和其他Kubernetes特定的指标。
应用监控: 能够监控部署在集群上的应用程序的性能。
自动警报: 通过Alertmanager配置警报规则,实现对异常行为的自动检测和警报。
可视化: 使用Grafana提供的丰富仪表板,为操作员提供直观的视图来查看集群和应用程序的实时状态。
扩展性和灵活性: 可以自定义和扩展以包括额外的Prometheus Exporters、Grafana仪表板或Alertmanager配置。
虽然这个套件已经设置了基本的自动发现,但是公司使用java开发,pod内实际的jvm内存不能被监控到实际的时候情况,只会监控到堆内存最大申请的情况,这个指标只会涨不会降,使用这个指标做HPA的话不能做到想要的情况,然后和开发一起商量,提出了使用springboot代码框架来暴露服务的jvm数据,然后通过prometheus自动发现将这些数据加入到监控列表。
具体操作使用了kube-prometheus中的ServiceMonitor资源对象。
使用yaml文件创建,cat ServiceMonitor.yaml
apiVersion: monitoring.coreos.com/v1 #API版本
kind: ServiceMonitor #这是由Prometheus Operator定义的自定义资源类型
metadata:
name: springboot-Monitor #自定义ServiceMonitor的名称
labels:
app: ServiceMonitor #自定义标签
spec:
selector:
matchLabels:
svc: app-svc #监控匹配这里指定的标签的服务,所有需要被自动发现的svc都要包含这个标签
namespaceSelector:
matchNames: #指定了发现哪个命名空间的svc,可以添加多个
- "default"
- "monitoring"
endpoints:
- port: one #通过名为one的端口来连接服务,这个端口名字要自己在svc配置
path: /actuator/prometheus #服务收集指标时要访问的HTTP路径
创建svc的例子,这样创建的svc都会被自动发现
apiVersion: v1
kind: Service
metadata:
name: pod-name #svc的名字,自定
namespace: default #指定在哪个命名空间
labels:
app: pod-project-name
svc: app-svc #这里指定svc的标签
spec:
type: NodePort
ports:
- name: one #这里指定svc的名字,被ServiceMonitor自动发现会指定服务内的端口
port: pod-port #pod内部服务的端口
nodePort: svc-port #在集群中暴露到外部的端口,可以不设置随机分配
selector:
app: pod-project-name
然后修改prometheus的rbac权限,默认他是不能获取所有空间的资源
直接apply更新prometheus-clusterRole.yaml,内容如下
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus-k8s
rules:
- apiGroups:
- ""
resources:
- nodes
- services
- endpoints
- pods
- nodes/proxy
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
- nodes/metrics
verbs:
- get
- nonResourceURLs:
- /metrics
verbs:
- get
这个ClusterRole主要给Prometheus监控系统提供了对于Kubernetes集群内的核心监控资源(如节点、服务、端点、Pods)的读取权限,以及访问/metrics路径来收集监控数据的能力。这样,Prometheus就能够获取它需要的所有数据来监控集群的状态和性能。
然后将直接配置好的自动发现规则创建
kubectl apply -f ServiceMonitor.yaml
访问prometheus的web页面查看target
可以看到已经自动发现了带有指定标签的svc的pod,并且加入了监控,处于up状态的是正确的收集到了指标,而下面的那个pod是因为并没有在代码加入springboot暴露指数,所以处于down状态,但是也说明我们的自动发现规则并没有问题
在prometheus的查询内也可以获取jvm参数了,接下来就可以通过jvm来进行HPA横向扩容了