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