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
采集监控对象的指标:
-
遵循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 .
一个初步的监控系统就搭建完成了,下一篇介绍如何使用
Prometheus结合K8s(二)使用-CSDN博客