公司之前K8s集群没有监控,top查看机器cpu使用率很高,为了监控pod的cpu和内存,集群外的mysql资源,初步搭建了Prometheus监控系统
提前准备镜像
docker.io/grafana/grafana 10.4.4
docker.io/prom/prometheus v2.47.2
docker.io/prom/node-exporter v1.5.0
docker.io/prom/mysqld-exporter v0.14.0
docker.io/gcmirrors/kube-state-metrics-amd64 v1.7.1
将这些 tar 文件传输到离线环境中的机器并导入 Docker:根据harbor仓库上传镜像

Granfana是可视化界面
Node-exporter监控主机节点,所以必须每个节点都跑一个
Prometheus:server,有特定的格式;采集逻辑仅支持pull模式(意思是),通过http/https接口连接
kube-state-metrics-amd64:监控k8s里面资源
配置文件
创建名称空间
Kubectl apply -f .
cat namespace.yaml
---
apiVersion: v1
kind: Namespace
metadata:
  name: prom
        部署Prometheus
采集监控对象的指标:
- 遵循Prometheus特有的指标格式
 
- 主机: node_exporter
 
- 后端服务: MySQL--> mysql_exporter,tomcat-->tomcat_exporter
 
- 内建测量系统: 支持http(s)://SERVER:PORT/PATH对外暴露指标
 
#例子:[root@ubuntu ~]#curl http://localhost:9090/metrics
查看Prometheus自身的指标
- 通过http/https协议暴露指标
 
#第三方exporter: 地址 https://prometheus.io/docs/instrumenting/exporters/
#官方自行维护的exporter: 地址 https://prometheus.io/download/
- 把目标(target)纳入监控来: 静态配置 动态发现:
 
- 如何标示target:
 
#Prometheus会为每个target创建一个名为up(自身的)的指标;用于监控自身状态http(s)://SERVER:PORT/PATH
scheme: 协议,默认是http
endpoint: SERVER:PORT
path: /PATH,默认/metrics
- job: 作业;每一个采样的过程叫job
 
- Prometheus指标抓取的生命周期: 发现--配置--relabel--指标数据抓取--metrice relabel
 
- 重新打标: target 重新打标 metric 重新打标
 
于集群的资源有metrics度量值的概念,有各种不同的exporter可以通过api接口对外提供各种度量值的及时数据,prometheus在与k8s融合工作的过程,就是通过与这些提供metric值得exporter进行交互
对于exporter提供的metrics,采取拉的方式获取metrics(通常方式),对接的exporter常见的有:kube-apiserver 、cadvisor、node-exporter,也可根据应用类型部署相应的exporter,获取该应用的状态信息
可以按照官方定义的expr表达式格式,以及PromQL语法对相应的指标进程过滤,数据展示及图形展示。不过自带的webui较为简陋,但prometheus同时提供获取数据的api,grafana可通过api获取prometheus数据源,来绘制更精细的图形效果用以展示。
配置configmap,在部署前将Prometheus主程序配置文件准备好,以configmap的形式挂载进deployment中。
cat Prometheus-cfg.yaml
配置文件参考https://github.com/iKubernetes/k8s-prom/tree/master/prometheus,根据实际生产所需要求自行定义指标,参考文件中未给出mysql和grafana的实例,已在下方给出

Kubectl apply -f prom/
Rules是告警
MySQL Exporter
首先在mysql上创建账号,并授权该账号能够查看全局的status以及能够访问performance_schema,以便 于获取到mysql内部的各项数据配置;而mysqld_exporter则使用该用户登录到mysql上执行查询操作,并 且将采集到的数据转换后使用http的方式暴露给prometheus
MySQL Exporter 用于导出 MySQL 数据库的监控指标。
- 首先在 MySQL 数据库中创建一个用户来访问监控信息:
 
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'Expor.123';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON . TO 'exporter'@'localhost';
FLUSH PRIVILEGES;
cat mysql-exporter.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysqld-exporter
  namespace: prom
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysqld-exporter
  template:
    metadata:
      labels:
        app: mysqld-exporter
    spec:
      containers:
      - name: mysqld-exporter
        image: prom/mysqld-exporter:v0.14.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9104
        env:
        - name: DATA_SOURCE_NAME
          value: "exporter:Expor.123@(mysqlhost:3306)/"
        args:
        - --collect.info_schema.innodb_metrics
        - --collect.info_schema.innodb_tablespaces
        - --collect.perf_schema.eventsstatementssum
        - --collect.perf_schema.memory_events
        - --collect.global_status
        - --collect.engine_innodb_status
        - --collect.binlog_size
---
apiVersion: v1
kind: Service
metadata:
  name: mysqld-exporter
  namespace: prom
spec:
  type: ClusterIP
  ports:
    - port: 9104
      targetPort: 9104
      name: mysqld-exporter 
  selector:
    app: mysqld-exporter
        
Kubectl apply -f .
Node-exporter

Kubectl apply -f .
Kube-state-metrics

Kubectl apply -f .
Granfana

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
  namespace: prom
  labels:
    app: grafana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      containers:
      - name: grafana
        image: grafana/grafana:10.4.4  # 使用最新的Grafana镜像
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3000  # Grafana默认运行在3000端口
        env:
        - name: GF_SECURITY_ADMIN_PASSWORD  # 设置管理员密码(可选)
          value: "admin"
---
apiVersion: v1
kind: Service
metadata:
  name: grafana
spec:
  type: NodePort  # 使用NodePort类型
  ports:
  - port: 3000  # Service端口
    targetPort: 3000  # 容器端口
    nodePort: 32000  # 指定NodePort(可选,Kubernetes会自动分配一个未使用的端口)
  selector:
    app: grafana
        Kubectl apply -f .