Prometheus结合K8s(一)搭建

公司之前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

采集监控对象的指标:

  1. 遵循Prometheus特有的指标格式
  1. 主机: node_exporter
  1. 后端服务: MySQL--> mysql_exporter,tomcat-->tomcat_exporter
  1. 内建测量系统: 支持http(s)://SERVER:PORT/PATH对外暴露指标

#例子:[root@ubuntu ~]#curl http://localhost:9090/metrics

查看Prometheus自身的指标

  1. 通过http/https协议暴露指标

#第三方exporter: 地址 https://prometheus.io/docs/instrumenting/exporters/

#官方自行维护的exporter: 地址 https://prometheus.io/download/

  1. 把目标(target)纳入监控来: 静态配置 动态发现:
  1. 如何标示target:

#Prometheus会为每个target创建一个名为up(自身的)的指标;用于监控自身状态http(s)://SERVER:PORT/PATH

scheme: 协议,默认是http

endpoint: SERVER:PORT

path: /PATH,默认/metrics

  1. job: 作业;每一个采样的过程叫job
  1. Prometheus指标抓取的生命周期: 发现--配置--relabel--指标数据抓取--metrice relabel
  1. 重新打标: 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 数据库的监控指标。

  1. 首先在 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 .

一个初步的监控系统就搭建完成了,下一篇介绍如何使用

Prometheus结合K8s(二)使用-CSDN博客

相关推荐
俺俺4 小时前
(33)iptables设置防火墙策略常用命令(docker环境、非docker环境)
运维·docker·容器·iptables·防火墙
童先生4 小时前
如何把本地docker 镜像下载用到centos系统中呢?
docker·容器·centos
让美好继续发生7 小时前
解决docker报Error response from daemon Get httpsregistry-1.docker.iov2错误
运维·docker·容器
Seal软件8 小时前
配置NVIDIA Container Runtime和容器运行GPUStack教程
docker·容器·大模型·llm·gpu集群
GPUStack8 小时前
配置NVIDIA Container Runtime和容器运行GPUStack教程
docker·容器·大模型·llm·gpu集群
❀͜͡傀儡师9 小时前
删除k8s 或者docker运行失败的脚本
docker·容器·kubernetes
福大大架构师每日一题10 小时前
32.2 prometheus倒排索引统计功能
ios·iphone·prometheus
Elastic 中国社区官方博客13 小时前
使用 Elastic 3 步实现基于 OTel 的原生 K8s 和应用可观测性
大数据·人工智能·elasticsearch·搜索引擎·云原生·容器·kubernetes