针对公司生产环境使用的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状态,但是也说明我们的自动发现规则并没有问题 image.png

在prometheus的查询内也可以获取jvm参数了,接下来就可以通过jvm来进行HPA横向扩容了 image.png