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博客

相关推荐
时迁24724 分钟前
【k8s】k8s是怎么实现自动扩缩的
云原生·容器·kubernetes·k8s
诡异森林。4 小时前
Docker--Docker网络原理
网络·docker·容器
matrixlzp5 小时前
K8S Service 原理、案例
云原生·容器·kubernetes
angushine6 小时前
让Docker端口映射受Firewall管理而非iptables
运维·docker·容器
SimonLiu0098 小时前
清理HiNas(海纳斯) Docker日志并限制日志大小
java·docker·容器
高峰君主10 小时前
Docker容器持久化
docker·容器·eureka
能来帮帮蒟蒻吗11 小时前
Docker安装(Ubuntu22版)
笔记·学习·spring cloud·docker·容器
言之。15 小时前
别学了,打会王者吧
java·python·mysql·容器·spark·php·html5
秦始皇爱找茬18 小时前
docker部署Jenkins工具
docker·容器·jenkins
樽酒ﻬق21 小时前
Kubernetes 常用运维命令整理
运维·容器·kubernetes