监控告警平台
Zabbix、Prometheus
CI/CD平台
Jenkins+gitlab+sq+argoCD+tekton
自动化运维平台
监控告警是个非常重要的平台
Prometheus
prometheus有很多组件组成
上图中间部分Prometheus server 就是我们所安装运行的Prometheus服务,这个Prometheus本身需要后端的存储:TSDB
Prometheus本身是一种数据库,TSDB就是一种数据库类型,这种数据库叫时序数据库,它本身就是一个横轴和数轴,xy轴。采集的数据存储在TSDB数据库里面 TSDB是Prometheus底层使用的数据的机制,叫TSDB,数据最终还是存储在对应Prometheus server对应的 硬盘上面,只是读取的方式是数据库读取,和文件系统读取不大一样,不是一个可读的文件方式 prometheus除了TSDB以外还给提供了 HTTP Server 有个UI界面 Prometheus只能负责采集数据和存储数据,本身没有报警和展示的功能,提供的HTTP Server不是展示ui界面,只是提供了查询界面,本身没有告警功能,没有生成绚丽的图形化的功能,针对这俩功能,有另外两个组件,上图右上,Alert manager:能够发报警的,短信微信钉钉,发送报警的组件 上图右下 Grafana 提供绚丽的ui,展示的组件,Grafana展示的数据是通过 Prometheus内部的查询语言叫Prom QL (Prom就是Prometheus,QL就是查询语言的意思,比如之前的SQL,S就是结构化的意思,QL是查询语言,SQL结构化查询语言) Prom QL 就是prometheus 创造的,之后还有很多应用采用了这种语言 整个Prometheus最主要的三个组件就是:Prometheus server 和Alert manager 还有 Grafana 还有一些服务发现组件,上图中上 Service discovery 服务发现组件,这个服务发现组件事实上我们呢可以基于文件系统级别的,可能就弄个文件, 什么叫服务发现:比如我们要监控主机,k8s集群有master节点和node节点,在我们这怎么知道集群有多少node节点,有多少master节点呢?我们是把节点加到集群上来,不管是master节点还是node节点,都是通过etcd存储,通过apiserver通信,所有的添加的组件都是添加剂etcd数据库里面的,etcd就类似一个服务发现,它能够通过注册到etcd服务里面来,知道你有多少个node,多少个pod,多少个kubelet kubeproxy 组件 prometheus 未来加监控,我们要动态知道有那些节点要加入到 prometheus server 里面来,我们可以通过服务发现的组件,服务发现的组件可以是我们的k8s集群,我们待会就基于k8s集群来做服务发现,也就是基于etcd的,第二种还有基于file_sd 一个文件系统的,整个文件的,就是我从文件里面定义好我把那些东西加进来,他就可以自动的去监控文件的变化。通过监控一个静态的文件的变化来实现服务的发现,除了这个以外还有很多。 我们这次基于k8s环境来做服务发现 上图中间和右面是常用的组件 上图左面 Pushgateway 就是我们prometheus server默认情况下怎么发现服务的呢?他是主动的方式,prometheus自己主动去发现那些监控的各种各样的角色,这叫主动模式,还有一些情况比较特殊,比如我现在有一个节点需要监控但是节点本身和prometheus主机本身网络不通,不在一个网络下,那prometheus无法主动去发现它,获取不到数据,然后就有这个Phshgatway的组件,这个组件是去发现node节点,或者node节点把想要监控的数据传给pushgateway 然后由pushgateway主动的把数据传给prometheus ,push方式 上传 ,就是pushgateway 主动的把采集的主机传给prometheusserver 这是被动的方式
prometheus 最主要的还是主动的方式,
上图左下 Jobs就是添加的各种各样的监控项,比如监控pod是否运行。jobs是通过exporters来去采集数据 如果想去自己写exporters 就需要自己懂开发的内容,但是现在不需要去写,都有对应的写好的
这就是prometheus的架构模型
➢ Prometheus Server:Prometheus 生态最重要的组件, 主要用于抓取和存储时间序 列数据, 同时
提供数据的查询和告警策略的配置管理;
➢ Alertmanager:Prometheus 生态用于告警的组件,Prometheus Server 会将告警发 送给
Alertmanager ,Alertmanager 根据路由配置,将告警信息发送给指定的人或 组。Alertmanager 支持邮件、Webhook、微信、钉钉、短信等媒介进行告警通知;
➢ Grafana:用于展示数据, 便于数据的查询和观测;
➢ Push Gateway:Prometheus 本身是通过 Pull 的方式拉取数据, 但是有些监控数据 可能是短期的, 如果没有采集数据可能会出现丢失。Push Gateway 可以用来解决 此类问题,它可以用来接收数据,也就是客户端可以通过 Push 的方式将数据推送 到 Push Gateway,之后 Prometheus 可以通过 Pull拉取该数据;
➢ Exporter:主要用来采集监控数据, 比如主机的监控数据可以通过 node_exporter 采集, MySQL的监控数据可以通过 mysql_exporter 采集,之后 Exporter 暴露一个 接口,比如/metrics ,Prometheus 可以通过该接口采集到数据;
➢ PromQL:PromQL 其实不算 Prometheus 的组件, 它是用来查询数据的一种语法, 比如查询数据库的数据,可以通过 SQL 语句,查询 Loki 的数据,可以通过 LogQL, 查询 Prometheus 数据的叫做
PromQL;
➢ Service Discovery:用来发现监控目标的自动发现,常用的有基于 Kubernetes、 Consul 、Eureka 、文件的自动发现等。
Prometheus安装
https://github.com/prometheus-operator
我们用的k8s集群是1.21的,我们使用prometheus最低版本是0.8
operator是一种包
如果是虚拟机安装那么更简单了,直接下载二进制包就行,都不需要安装
二进制官网下载地址
https://prometheus.io/download/
k8s安装方法
https://github.com/prometheus-operator/kube-prometheus
要根据k8s版本来下载
我们的是1.21.5 的 这没有了 我们下载0.8的 0.8和0.9都支持1.21
目前最新的是0.13
我们下载0.8的
git clone -b release-0.8 https://github.com/prometheus-operator/kube-prometheus.git
#-b 指定分支
cd kube-prometheus/manifests
root@k8s-master1:/apps/kube-prometheus# ll
total 224
drwxr-xr-x 12 root root 4096 Sep 25 09:45 ./
drwxr-xr-x 11 root root 4096 Sep 24 14:17 ../
-rwxr-xr-x 1 root root 679 Sep 24 14:17 build.sh*
-rw-r--r-- 1 root root 3039 Sep 24 14:17 code-of-conduct.md
-rw-r--r-- 1 root root 1422 Sep 24 14:17 DCO
drwxr-xr-x 2 root root 4096 Sep 24 14:17 docs/
-rw-r--r-- 1 root root 2051 Sep 24 14:17 example.jsonnet
drwxr-xr-x 7 root root 4096 Sep 24 14:17 examples/
drwxr-xr-x 3 root root 4096 Sep 24 14:17 experimental/
drwxr-xr-x 8 root root 4096 Sep 24 14:17 .git/
drwxr-xr-x 4 root root 4096 Sep 24 14:17 .github/
-rw-r--r-- 1 root root 57 Sep 24 14:17 .gitignore
-rw-r--r-- 1 root root 709 Sep 24 14:17 .gitpod.yml
-rw-r--r-- 1 root root 237 Sep 24 14:17 go.mod
-rw-r--r-- 1 root root 59996 Sep 24 14:17 go.sum
drwxr-xr-x 3 root root 4096 Sep 24 14:17 hack/
drwxr-xr-x 3 root root 4096 Sep 24 14:17 jsonnet/
-rw-r--r-- 1 root root 206 Sep 24 14:17 jsonnetfile.json
-rw-r--r-- 1 root root 4857 Sep 24 14:17 jsonnetfile.lock.json
-rw-r--r-- 1 root root 4495 Sep 24 14:17 kustomization.yaml
-rw-r--r-- 1 root root 11325 Sep 24 14:17 LICENSE
-rw-r--r-- 1 root root 2153 Sep 24 14:17 Makefile
drwxr-xr-x 3 root root 4096 Sep 24 14:17 manifests/
-rw-r--r-- 1 root root 126 Sep 24 14:17 NOTICE
-rw-r--r-- 1 root root 38246 Sep 24 14:17 README.md
drwxr-xr-x 2 root root 4096 Sep 24 14:17 scripts/
-rw-r--r-- 1 root root 928 Sep 24 14:17 sync-to-internal-registry.jsonnet
drwxr-xr-x 3 root root 4096 Sep 24 14:17 tests/
-rwxr-xr-x 1 root root 808 Sep 24 14:17 test.sh*
进入manifests 里面都是yaml文件
root@k8s-master1:/apps/kube-prometheus# cd manifests/
root@k8s-master1:/apps/kube-prometheus/manifests# ll
total 1840
drwxr-xr-x 3 root root 4096 Sep 24 14:17 ./
drwxr-xr-x 12 root root 4096 Sep 25 09:45 ../
-rw-r--r-- 1 root root 875 Sep 24 14:17 alertmanager-alertmanager.yaml
-rw-r--r-- 1 root root 515 Sep 24 14:17 alertmanager-podDisruptionBudget.yaml
-rw-r--r-- 1 root root 6831 Sep 24 14:17 alertmanager-prometheusRule.yaml
-rw-r--r-- 1 root root 1169 Sep 24 14:17 alertmanager-secret.yaml
-rw-r--r-- 1 root root 301 Sep 24 14:17 alertmanager-serviceAccount.yaml
-rw-r--r-- 1 root root 540 Sep 24 14:17 alertmanager-serviceMonitor.yaml
-rw-r--r-- 1 root root 577 Sep 24 14:17 alertmanager-service.yaml
-rw-r--r-- 1 root root 278 Sep 24 14:17 blackbox-exporter-clusterRoleBinding.yaml
-rw-r--r-- 1 root root 287 Sep 24 14:17 blackbox-exporter-clusterRole.yaml
-rw-r--r-- 1 root root 1392 Sep 24 14:17 blackbox-exporter-configuration.yaml
-rw-r--r-- 1 root root 3080 Sep 24 14:17 blackbox-exporter-deployment.yaml
-rw-r--r-- 1 root root 96 Sep 24 14:17 blackbox-exporter-serviceAccount.yaml
-rw-r--r-- 1 root root 680 Sep 24 14:17 blackbox-exporter-serviceMonitor.yaml
-rw-r--r-- 1 root root 540 Sep 24 14:17 blackbox-exporter-service.yaml
-rw-r--r-- 1 root root 721 Sep 24 14:17 grafana-dashboardDatasources.yaml
-rw-r--r-- 1 root root 1480474 Sep 24 14:17 grafana-dashboardDefinitions.yaml
-rw-r--r-- 1 root root 625 Sep 24 14:17 grafana-dashboardSources.yaml
-rw-r--r-- 1 root root 8063 Sep 24 14:17 grafana-deployment.yaml
-rw-r--r-- 1 root root 86 Sep 24 14:17 grafana-serviceAccount.yaml
-rw-r--r-- 1 root root 398 Sep 24 14:17 grafana-serviceMonitor.yaml
-rw-r--r-- 1 root root 452 Sep 24 14:17 grafana-service.yaml
-rw-r--r-- 1 root root 3319 Sep 24 14:17 kube-prometheus-prometheusRule.yaml
-rw-r--r-- 1 root root 63977 Sep 24 14:17 kubernetes-prometheusRule.yaml
-rw-r--r-- 1 root root 6898 Sep 24 14:17 kubernetes-serviceMonitorApiserver.yaml
-rw-r--r-- 1 root root 440 Sep 24 14:17 kubernetes-serviceMonitorCoreDNS.yaml
-rw-r--r-- 1 root root 6417 Sep 24 14:17 kubernetes-serviceMonitorKubeControllerManager.yaml
-rw-r--r-- 1 root root 7539 Sep 24 14:17 kubernetes-serviceMonitorKubelet.yaml
-rw-r--r-- 1 root root 530 Sep 24 14:17 kubernetes-serviceMonitorKubeScheduler.yaml
-rw-r--r-- 1 root root 464 Sep 24 14:17 kube-state-metrics-clusterRoleBinding.yaml
-rw-r--r-- 1 root root 1712 Sep 24 14:17 kube-state-metrics-clusterRole.yaml
-rw-r--r-- 1 root root 2957 Sep 24 14:17 kube-state-metrics-deployment.yaml
-rw-r--r-- 1 root root 1864 Sep 24 14:17 kube-state-metrics-prometheusRule.yaml
-rw-r--r-- 1 root root 280 Sep 24 14:17 kube-state-metrics-serviceAccount.yaml
-rw-r--r-- 1 root root 1011 Sep 24 14:17 kube-state-metrics-serviceMonitor.yaml
-rw-r--r-- 1 root root 580 Sep 24 14:17 kube-state-metrics-service.yaml
-rw-r--r-- 1 root root 444 Sep 24 14:17 node-exporter-clusterRoleBinding.yaml
-rw-r--r-- 1 root root 461 Sep 24 14:17 node-exporter-clusterRole.yaml
-rw-r--r-- 1 root root 3046 Sep 24 14:17 node-exporter-daemonset.yaml
-rw-r--r-- 1 root root 12975 Sep 24 14:17 node-exporter-prometheusRule.yaml
-rw-r--r-- 1 root root 270 Sep 24 14:17 node-exporter-serviceAccount.yaml
-rw-r--r-- 1 root root 850 Sep 24 14:17 node-exporter-serviceMonitor.yaml
-rw-r--r-- 1 root root 492 Sep 24 14:17 node-exporter-service.yaml
-rw-r--r-- 1 root root 482 Sep 24 14:17 prometheus-adapter-apiService.yaml
-rw-r--r-- 1 root root 576 Sep 24 14:17 prometheus-adapter-clusterRoleAggregatedMetricsReader.yaml
-rw-r--r-- 1 root root 494 Sep 24 14:17 prometheus-adapter-clusterRoleBindingDelegator.yaml
-rw-r--r-- 1 root root 471 Sep 24 14:17 prometheus-adapter-clusterRoleBinding.yaml
-rw-r--r-- 1 root root 378 Sep 24 14:17 prometheus-adapter-clusterRoleServerResources.yaml
-rw-r--r-- 1 root root 409 Sep 24 14:17 prometheus-adapter-clusterRole.yaml
-rw-r--r-- 1 root root 1836 Sep 24 14:17 prometheus-adapter-configMap.yaml
-rw-r--r-- 1 root root 1804 Sep 24 14:17 prometheus-adapter-deployment.yaml
-rw-r--r-- 1 root root 506 Sep 24 14:17 prometheus-adapter-podDisruptionBudget.yaml
-rw-r--r-- 1 root root 515 Sep 24 14:17 prometheus-adapter-roleBindingAuthReader.yaml
-rw-r--r-- 1 root root 287 Sep 24 14:17 prometheus-adapter-serviceAccount.yaml
-rw-r--r-- 1 root root 677 Sep 24 14:17 prometheus-adapter-serviceMonitor.yaml
-rw-r--r-- 1 root root 501 Sep 24 14:17 prometheus-adapter-service.yaml
-rw-r--r-- 1 root root 447 Sep 24 14:17 prometheus-clusterRoleBinding.yaml
-rw-r--r-- 1 root root 394 Sep 24 14:17 prometheus-clusterRole.yaml
-rw-r--r-- 1 root root 4930 Sep 24 14:17 prometheus-operator-prometheusRule.yaml
-rw-r--r-- 1 root root 715 Sep 24 14:17 prometheus-operator-serviceMonitor.yaml
-rw-r--r-- 1 root root 499 Sep 24 14:17 prometheus-podDisruptionBudget.yaml
-rw-r--r-- 1 root root 12732 Sep 24 14:17 prometheus-prometheusRule.yaml
-rw-r--r-- 1 root root 1195 Sep 24 14:17 prometheus-prometheus.yaml
-rw-r--r-- 1 root root 471 Sep 24 14:17 prometheus-roleBindingConfig.yaml
-rw-r--r-- 1 root root 1547 Sep 24 14:17 prometheus-roleBindingSpecificNamespaces.yaml
-rw-r--r-- 1 root root 366 Sep 24 14:17 prometheus-roleConfig.yaml
-rw-r--r-- 1 root root 2047 Sep 24 14:17 prometheus-roleSpecificNamespaces.yaml
-rw-r--r-- 1 root root 271 Sep 24 14:17 prometheus-serviceAccount.yaml
-rw-r--r-- 1 root root 531 Sep 24 14:17 prometheus-serviceMonitor.yaml
-rw-r--r-- 1 root root 558 Sep 24 14:17 prometheus-service.yaml
drwxr-xr-x 2 root root 4096 Sep 24 14:17 setup/
进入setup目录 这些是安装的yaml文件 在k8s执行直接运行的
root@k8s-master1:/apps/kube-prometheus/manifests# cd setup/
root@k8s-master1:/apps/kube-prometheus/manifests/setup# ll
total 1036
drwxr-xr-x 2 root root 4096 Sep 24 14:17 ./
drwxr-xr-x 3 root root 4096 Sep 24 14:17 ../
-rw-r--r-- 1 root root 60 Sep 24 14:17 0namespace-namespace.yaml #看下这个ns
-rw-r--r-- 1 root root 122054 Sep 24 14:17 prometheus-operator-0alertmanagerConfigCustomResourceDefinition.yaml
-rw-r--r-- 1 root root 247084 Sep 24 14:17 prometheus-operator-0alertmanagerCustomResourceDefinition.yaml
-rw-r--r-- 1 root root 20907 Sep 24 14:17 prometheus-operator-0podmonitorCustomResourceDefinition.yaml
-rw-r--r-- 1 root root 20077 Sep 24 14:17 prometheus-operator-0probeCustomResourceDefinition.yaml
-rw-r--r-- 1 root root 327667 Sep 24 14:17 prometheus-operator-0prometheusCustomResourceDefinition.yaml
-rw-r--r-- 1 root root 3618 Sep 24 14:17 prometheus-operator-0prometheusruleCustomResourceDefinition.yaml
-rw-r--r-- 1 root root 21941 Sep 24 14:17 prometheus-operator-0servicemonitorCustomResourceDefinition.yaml
-rw-r--r-- 1 root root 253551 Sep 24 14:17 prometheus-operator-0thanosrulerCustomResourceDefinition.yaml
-rw-r--r-- 1 root root 471 Sep 24 14:17 prometheus-operator-clusterRoleBinding.yaml
-rw-r--r-- 1 root root 1377 Sep 24 14:17 prometheus-operator-clusterRole.yaml
-rw-r--r-- 1 root root 2261 Sep 24 14:17 prometheus-operator-deployment.yaml
-rw-r--r-- 1 root root 285 Sep 24 14:17 prometheus-operator-serviceAccount.yaml
-rw-r--r-- 1 root root 515 Sep 24 14:17 prometheus-operator-service.yaml
root@k8s-master1:/apps/kube-prometheus/manifests/setup# cat 0namespace-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: monitoring
#这就是创建一个名为montroring 的ns 所有的资源对象都是运行这个ns里面的
把大师兄提供的包传上来使用大师兄给的执行
root@k8s-master1:/apps/test/kube-prometheus/manifests/setup# kubectl apply -f .
namespace/monitoring created
customresourcedefinition.apiextensions.k8s.io/alertmanagerconfigs.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/probes.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/thanosrulers.monitoring.coreos.com created
clusterrole.rbac.authorization.k8s.io/prometheus-operator created
clusterrolebinding.rbac.authorization.k8s.io/prometheus-operator created
deployment.apps/prometheus-operator created
service/prometheus-operator created
serviceaccount/prometheus-operator created
root@k8s-master1:/apps/test/kube-prometheus/manifests/setup# kubectl get pods -n monitoring
NAME READY STATUS RESTARTS AGE
prometheus-operator-7775c66ccf-q7fpk 2/2 Running 0 98s
#这个pod是prometheus的 Operator
operator安装完成了,然后去安装prometheus的技术栈
root@k8s-master1:/apps/test/kube-prometheus/manifests/setup# cd ..
root@k8s-master1:/apps/test/kube-prometheus/manifests# ll
total 1840
drwxr-xr-x 3 root root 4096 May 24 15:35 ./
drwxr-xr-x 12 root root 4096 May 24 15:19 ../
-rw-r--r-- 1 root root 875 May 24 15:19 alertmanager-alertmanager.yaml #alertmanager 发报警的组件
-rw-r--r-- 1 root root 515 May 24 15:19 alertmanager-podDisruptionBudget.yaml #
-rw-r--r-- 1 root root 6831 May 24 15:19 alertmanager-prometheusRule.yaml #
-rw-r--r-- 1 root root 1169 May 24 15:19 alertmanager-secret.yaml # 配置的密钥 发什么报警发给谁 就靠这个文件定义
-rw-r--r-- 1 root root 301 May 24 15:19 alertmanager-serviceAccount.yaml # 提供权限的 加入k8s集群权限的
-rw-r--r-- 1 root root 540 May 24 15:19 alertmanager-serviceMonitor.yaml # 提供权限的 加入k8s集群权限的
-rw-r--r-- 1 root root 577 May 24 15:19 alertmanager-service.yaml #
-rw-r--r-- 1 root root 278 May 24 15:19 blackbox-exporter-clusterRoleBinding.yaml # blackbox 黑盒监控 ,最主要的功能就是做http监控 就是web监控 它可以监控 只要网络通就可以 可以监控在不同地方 访问一个web服务 他的时间 比较访问一个界面经过多少时间 响应时间
-rw-r--r-- 1 root root 287 May 24 15:19 blackbox-exporter-clusterRole.yaml #
-rw-r--r-- 1 root root 1392 May 24 15:19 blackbox-exporter-configuration.yaml#
-rw-r--r-- 1 root root 3080 May 24 15:19 blackbox-exporter-deployment.yaml#
-rw-r--r-- 1 root root 96 May 24 15:19 blackbox-exporter-serviceAccount.yaml#
-rw-r--r-- 1 root root 680 May 24 15:19 blackbox-exporter-serviceMonitor.yaml#
-rw-r--r-- 1 root root 540 May 24 15:19 blackbox-exporter-service.yaml #
-rw-r--r-- 1 root root 721 May 24 15:19 grafana-dashboardDatasources.yaml
-rw-r--r-- 1 root root 1480474 May 24 15:19 grafana-dashboardDefinitions.yaml
-rw-r--r-- 1 root root 625 May 24 15:19 grafana-dashboardSources.yaml
-rw-r--r-- 1 root root 8063 May 24 15:19 grafana-deployment.yaml
-rw-r--r-- 1 root root 86 May 24 15:19 grafana-serviceAccount.yaml
-rw-r--r-- 1 root root 398 May 24 15:19 grafana-serviceMonitor.yaml
-rw-r--r-- 1 root root 452 May 24 15:19 grafana-service.yaml
-rw-r--r-- 1 root root 3319 May 24 15:19 kube-prometheus-prometheusRule.yaml #Prometheus server 的安装包
-rw-r--r-- 1 root root 63977 May 24 15:19 kubernetes-prometheusRule.yaml
-rw-r--r-- 1 root root 6898 May 24 15:19 kubernetes-serviceMonitorApiserver.yaml
-rw-r--r-- 1 root root 440 May 24 15:19 kubernetes-serviceMonitorCoreDNS.yaml
-rw-r--r-- 1 root root 6417 May 24 15:19 kubernetes-serviceMonitorKubeControllerManager.yaml
-rw-r--r-- 1 root root 7539 May 24 15:19 kubernetes-serviceMonitorKubelet.yaml
-rw-r--r-- 1 root root 530 May 24 15:19 kubernetes-serviceMonitorKubeScheduler.yaml
-rw-r--r-- 1 root root 464 May 24 15:19 kube-state-metrics-clusterRoleBinding.yaml #metrics 是 后面讲的所有的 不管暴漏的 任何export 事实上都是通过 metrics 接口 给暴漏出来 才能收集到数据的
-rw-r--r-- 1 root root 1712 May 24 15:19 kube-state-metrics-clusterRole.yaml
-rw-r--r-- 1 root root 2958 May 24 15:35 kube-state-metrics-deployment.yaml
-rw-r--r-- 1 root root 1864 May 24 15:19 kube-state-metrics-prometheusRule.yaml
-rw-r--r-- 1 root root 280 May 24 15:19 kube-state-metrics-serviceAccount.yaml
-rw-r--r-- 1 root root 1011 May 24 15:19 kube-state-metrics-serviceMonitor.yaml
-rw-r--r-- 1 root root 580 May 24 15:19 kube-state-metrics-service.yaml
-rw-r--r-- 1 root root 444 May 24 15:19 node-exporter-clusterRoleBinding.yaml #这不是prometheus 架构里面的 这个是采集数据的 他就负责负载采集整个k8s 集群node 节点的数据的 集群node数量 多少master 内存 cpu 网卡 io读写的
-rw-r--r-- 1 root root 461 May 24 15:19 node-exporter-clusterRole.yaml
-rw-r--r-- 1 root root 3046 May 24 15:19 node-exporter-daemonset.yaml
-rw-r--r-- 1 root root 12975 May 24 15:19 node-exporter-prometheusRule.yaml
-rw-r--r-- 1 root root 270 May 24 15:19 node-exporter-serviceAccount.yaml
-rw-r--r-- 1 root root 850 May 24 15:19 node-exporter-serviceMonitor.yaml
-rw-r--r-- 1 root root 492 May 24 15:19 node-exporter-service.yaml
-rw-r--r-- 1 root root 482 May 24 15:19 prometheus-adapter-apiService.yaml
-rw-r--r-- 1 root root 576 May 24 15:19 prometheus-adapter-clusterRoleAggregatedMetricsReader.yaml
-rw-r--r-- 1 root root 494 May 24 15:19 prometheus-adapter-clusterRoleBindingDelegator.yaml
-rw-r--r-- 1 root root 471 May 24 15:19 prometheus-adapter-clusterRoleBinding.yaml
-rw-r--r-- 1 root root 378 May 24 15:19 prometheus-adapter-clusterRoleServerResources.yaml
-rw-r--r-- 1 root root 409 May 24 15:19 prometheus-adapter-clusterRole.yaml
-rw-r--r-- 1 root root 1836 May 24 15:19 prometheus-adapter-configMap.yaml
-rw-r--r-- 1 root root 1804 May 24 15:19 prometheus-adapter-deployment.yaml
-rw-r--r-- 1 root root 506 May 24 15:19 prometheus-adapter-podDisruptionBudget.yaml
-rw-r--r-- 1 root root 515 May 24 15:19 prometheus-adapter-roleBindingAuthReader.yaml
-rw-r--r-- 1 root root 287 May 24 15:19 prometheus-adapter-serviceAccount.yaml
-rw-r--r-- 1 root root 677 May 24 15:19 prometheus-adapter-serviceMonitor.yaml
-rw-r--r-- 1 root root 501 May 24 15:19 prometheus-adapter-service.yaml
-rw-r--r-- 1 root root 447 May 24 15:19 prometheus-clusterRoleBinding.yaml
-rw-r--r-- 1 root root 394 May 24 15:19 prometheus-clusterRole.yaml
-rw-r--r-- 1 root root 4930 May 24 15:19 prometheus-operator-prometheusRule.yaml
-rw-r--r-- 1 root root 715 May 24 15:19 prometheus-operator-serviceMonitor.yaml
-rw-r--r-- 1 root root 499 May 24 15:19 prometheus-podDisruptionBudget.yaml
-rw-r--r-- 1 root root 12732 May 24 15:19 prometheus-prometheusRule.yaml
-rw-r--r-- 1 root root 1195 May 24 15:19 prometheus-prometheus.yaml
-rw-r--r-- 1 root root 471 May 24 15:19 prometheus-roleBindingConfig.yaml
-rw-r--r-- 1 root root 1547 May 24 15:19 prometheus-roleBindingSpecificNamespaces.yaml
-rw-r--r-- 1 root root 366 May 24 15:19 prometheus-roleConfig.yaml
-rw-r--r-- 1 root root 2047 May 24 15:19 prometheus-roleSpecificNamespaces.yaml
-rw-r--r-- 1 root root 271 May 24 15:19 prometheus-serviceAccount.yaml
-rw-r--r-- 1 root root 531 May 24 15:19 prometheus-serviceMonitor.yaml
-rw-r--r-- 1 root root 558 May 24 15:19 prometheus-service.yaml
drwxr-xr-x 2 root root 4096 May 24 15:20 setup/
这个是大师兄改过的,不能运行这个 还得运行我们之前下载的
root@k8s-master1:/apps/kube-prometheus/manifests# ll
total 1840
drwxr-xr-x 3 root root 4096 Sep 24 14:17 ./
drwxr-xr-x 12 root root 4096 Sep 25 09:45 ../
-rw-r--r-- 1 root root 875 Sep 24 14:17 alertmanager-alertmanager.yaml
-rw-r--r-- 1 root root 515 Sep 24 14:17 alertmanager-podDisruptionBudget.yaml
-rw-r--r-- 1 root root 6831 Sep 24 14:17 alertmanager-prometheusRule.yaml
-rw-r--r-- 1 root root 1169 Sep 24 14:17 alertmanager-secret.yaml
-rw-r--r-- 1 root root 301 Sep 24 14:17 alertmanager-serviceAccount.yaml
-rw-r--r-- 1 root root 540 Sep 24 14:17 alertmanager-serviceMonitor.yaml
-rw-r--r-- 1 root root 577 Sep 24 14:17 alertmanager-service.yaml
-rw-r--r-- 1 root root 278 Sep 24 14:17 blackbox-exporter-clusterRoleBinding.yaml
-rw-r--r-- 1 root root 287 Sep 24 14:17 blackbox-exporter-clusterRole.yaml
-rw-r--r-- 1 root root 1392 Sep 24 14:17 blackbox-exporter-configuration.yaml
-rw-r--r-- 1 root root 3080 Sep 24 14:17 blackbox-exporter-deployment.yaml
-rw-r--r-- 1 root root 96 Sep 24 14:17 blackbox-exporter-serviceAccount.yaml
-rw-r--r-- 1 root root 680 Sep 24 14:17 blackbox-exporter-serviceMonitor.yaml
-rw-r--r-- 1 root root 540 Sep 24 14:17 blackbox-exporter-service.yaml
-rw-r--r-- 1 root root 721 Sep 24 14:17 grafana-dashboardDatasources.yaml
-rw-r--r-- 1 root root 1480474 Sep 24 14:17 grafana-dashboardDefinitions.yaml
-rw-r--r-- 1 root root 625 Sep 24 14:17 grafana-dashboardSources.yaml
-rw-r--r-- 1 root root 8063 Sep 24 14:17 grafana-deployment.yaml
-rw-r--r-- 1 root root 86 Sep 24 14:17 grafana-serviceAccount.yaml
-rw-r--r-- 1 root root 398 Sep 24 14:17 grafana-serviceMonitor.yaml
-rw-r--r-- 1 root root 452 Sep 24 14:17 grafana-service.yaml
-rw-r--r-- 1 root root 3319 Sep 24 14:17 kube-prometheus-prometheusRule.yaml
-rw-r--r-- 1 root root 63977 Sep 24 14:17 kubernetes-prometheusRule.yaml
-rw-r--r-- 1 root root 6898 Sep 24 14:17 kubernetes-serviceMonitorApiserver.yaml
-rw-r--r-- 1 root root 440 Sep 24 14:17 kubernetes-serviceMonitorCoreDNS.yaml
-rw-r--r-- 1 root root 6417 Sep 24 14:17 kubernetes-serviceMonitorKubeControllerManager.yaml
-rw-r--r-- 1 root root 7539 Sep 24 14:17 kubernetes-serviceMonitorKubelet.yaml
-rw-r--r-- 1 root root 530 Sep 24 14:17 kubernetes-serviceMonitorKubeScheduler.yaml
-rw-r--r-- 1 root root 464 Sep 24 14:17 kube-state-metrics-clusterRoleBinding.yaml
-rw-r--r-- 1 root root 1712 Sep 24 14:17 kube-state-metrics-clusterRole.yaml
-rw-r--r-- 1 root root 2957 Sep 24 14:17 kube-state-metrics-deployment.yaml
-rw-r--r-- 1 root root 1864 Sep 24 14:17 kube-state-metrics-prometheusRule.yaml
-rw-r--r-- 1 root root 280 Sep 24 14:17 kube-state-metrics-serviceAccount.yaml
-rw-r--r-- 1 root root 1011 Sep 24 14:17 kube-state-metrics-serviceMonitor.yaml
-rw-r--r-- 1 root root 580 Sep 24 14:17 kube-state-metrics-service.yaml
-rw-r--r-- 1 root root 444 Sep 24 14:17 node-exporter-clusterRoleBinding.yaml
-rw-r--r-- 1 root root 461 Sep 24 14:17 node-exporter-clusterRole.yaml
-rw-r--r-- 1 root root 3046 Sep 24 14:17 node-exporter-daemonset.yaml
-rw-r--r-- 1 root root 12975 Sep 24 14:17 node-exporter-prometheusRule.yaml
-rw-r--r-- 1 root root 270 Sep 24 14:17 node-exporter-serviceAccount.yaml
-rw-r--r-- 1 root root 850 Sep 24 14:17 node-exporter-serviceMonitor.yaml
-rw-r--r-- 1 root root 492 Sep 24 14:17 node-exporter-service.yaml
-rw-r--r-- 1 root root 482 Sep 24 14:17 prometheus-adapter-apiService.yaml
-rw-r--r-- 1 root root 576 Sep 24 14:17 prometheus-adapter-clusterRoleAggregatedMetricsReader.yaml
-rw-r--r-- 1 root root 494 Sep 24 14:17 prometheus-adapter-clusterRoleBindingDelegator.yaml
-rw-r--r-- 1 root root 471 Sep 24 14:17 prometheus-adapter-clusterRoleBinding.yaml
-rw-r--r-- 1 root root 378 Sep 24 14:17 prometheus-adapter-clusterRoleServerResources.yaml
-rw-r--r-- 1 root root 409 Sep 24 14:17 prometheus-adapter-clusterRole.yaml
-rw-r--r-- 1 root root 1836 Sep 24 14:17 prometheus-adapter-configMap.yaml
-rw-r--r-- 1 root root 1804 Sep 24 14:17 prometheus-adapter-deployment.yaml
-rw-r--r-- 1 root root 506 Sep 24 14:17 prometheus-adapter-podDisruptionBudget.yaml
-rw-r--r-- 1 root root 515 Sep 24 14:17 prometheus-adapter-roleBindingAuthReader.yaml
-rw-r--r-- 1 root root 287 Sep 24 14:17 prometheus-adapter-serviceAccount.yaml
-rw-r--r-- 1 root root 677 Sep 24 14:17 prometheus-adapter-serviceMonitor.yaml
-rw-r--r-- 1 root root 501 Sep 24 14:17 prometheus-adapter-service.yaml
-rw-r--r-- 1 root root 447 Sep 24 14:17 prometheus-clusterRoleBinding.yaml
-rw-r--r-- 1 root root 394 Sep 24 14:17 prometheus-clusterRole.yaml
-rw-r--r-- 1 root root 4930 Sep 24 14:17 prometheus-operator-prometheusRule.yaml
-rw-r--r-- 1 root root 715 Sep 24 14:17 prometheus-operator-serviceMonitor.yaml
-rw-r--r-- 1 root root 499 Sep 24 14:17 prometheus-podDisruptionBudget.yaml
-rw-r--r-- 1 root root 12732 Sep 24 14:17 prometheus-prometheusRule.yaml
-rw-r--r-- 1 root root 1195 Sep 24 14:17 prometheus-prometheus.yaml
-rw-r--r-- 1 root root 471 Sep 24 14:17 prometheus-roleBindingConfig.yaml
-rw-r--r-- 1 root root 1547 Sep 24 14:17 prometheus-roleBindingSpecificNamespaces.yaml
-rw-r--r-- 1 root root 366 Sep 24 14:17 prometheus-roleConfig.yaml
-rw-r--r-- 1 root root 2047 Sep 24 14:17 prometheus-roleSpecificNamespaces.yaml
-rw-r--r-- 1 root root 271 Sep 24 14:17 prometheus-serviceAccount.yaml
-rw-r--r-- 1 root root 531 Sep 24 14:17 prometheus-serviceMonitor.yaml
-rw-r--r-- 1 root root 558 Sep 24 14:17 prometheus-service.yaml
drwxr-xr-x 2 root root 4096 Sep 25 10:09 setup/
开始安装
root@k8s-master1:/apps/kube-prometheus/manifests# kubectl apply -f .
这个过程会慢点
国内无法直接获取 gcr.io 镜像,我们还可以将 gcr.io/<repo-name>/<image-name>:<version> 替换为 gcr.azk8s.cn/<repo-name>/<image-name>:<version>
docker pull gcr.io/google_containers/hyperkube-amd64:v1.9.2
docker pull gcr.azk8s.cn/google_containers/hyperkube-amd64:v1.9.2
如拉取k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.0.0, 我们可以这么做
docker pull quay.io/coreos/kube-state-metrics:v2.0.0-rc.0
docker tag quay.io/coreos/kube-state-metrics:v2.0.0-rc.0 k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.0.0
这样就安装完了,prometheus server给我们提供一个ui界面 grafana也给提供了一个ui界面
root@k8s-master1:/apps/kube-prometheus/manifests/setup# kubectl get pods -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 2/2 Running 0 3h6m
alertmanager-main-1 2/2 Running 0 3h6m
alertmanager-main-2 2/2 Running 0 3h6m
blackbox-exporter-55c457d5fb-jw82p 3/3 Running 0 3h6m
grafana-6dd5b5f65-64nrk 1/1 Running 0 3h6m
kube-state-metrics-76f6cb7996-4jxlm 3/3 Running 0 3h6m
node-exporter-h44tf 2/2 Running 0 3h6m
node-exporter-jhl2d 2/2 Running 0 3h6m
node-exporter-rlrhh 2/2 Running 0 3h6m
node-exporter-w9jzh 2/2 Running 0 3h6m
prometheus-adapter-59df95d9f5-kkpwf 1/1 Running 0 3h6m
prometheus-adapter-59df95d9f5-ztwm7 1/1 Running 0 3h6m
prometheus-k8s-0 2/2 Running 1 3h5m
prometheus-k8s-1 2/2 Running 1 3h5m
prometheus-operator-7775c66ccf-q7fpk 2/2 Running 0 3h29m
grafana提供的ui界面
root@k8s-master1:/apps/kube-prometheus/manifests/setup# kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager-main ClusterIP 10.104.152.237 <none> 9093/TCP 3h10m
alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 3h10m
blackbox-exporter ClusterIP 10.110.78.66 <none> 9115/TCP,19115/TCP 3h10m
grafana ClusterIP 10.105.79.56 <none> 3000/TCP 3h10m
#grafana 提供的UI界面 但是使用的Cluster IP 我们想访问要么使用ingress-nginx 要么使用NodePort方式
kube-state-metrics ClusterIP None <none> 8443/TCP,9443/TCP 3h10m
node-exporter ClusterIP None <none> 9100/TCP 3h10m
prometheus-adapter ClusterIP 10.98.113.230 <none> 443/TCP 3h10m
prometheus-k8s ClusterIP 10.104.78.168 <none> 9090/TCP 3h10m
prometheus-operated ClusterIP None <none> 9090/TCP 3h10m
prometheus-operator ClusterIP None <none> 8443/TCP 3h33m
修改
root@k8s-master1:/apps/kube-prometheus/manifests/setup# kubectl edit svc -n monitoring grafana
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/component":"grafana","app.kubernetes.io/name":"grafana","app.kubernetes.io/part-of":"kube-prometheus","app.kubernetes.io/version":"7.5.4"},"name":"grafana","namespace":"monitoring"},"spec":{"ports":[{"name":"http","port":3000,"targetPort":"http"}],"selector":{"app.kubernetes.io/component":"grafana","app.kubernetes.io/name":"grafana","app.kubernetes.io/part-of":"kube-prometheus"}}}
creationTimestamp: "2023-09-25T02:39:46Z"
labels:
app.kubernetes.io/component: grafana
app.kubernetes.io/name: grafana
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 7.5.4
name: grafana
namespace: monitoring
resourceVersion: "185875"
uid: 7378b7c2-2119-4949-bf5d-4c44007562ce
spec:
clusterIP: 10.105.79.56
clusterIPs:
- 10.105.79.56
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: http
port: 3000
protocol: TCP
targetPort: http
selector:
app.kubernetes.io/component: grafana
app.kubernetes.io/name: grafana
app.kubernetes.io/part-of: kube-prometheus
sessionAffinity: None
type: NodePort #把这里改为NodePort
status:
loadBalancer: {}
查询一下
root@k8s-master1:/apps/kube-prometheus/manifests/setup# kubectl get svc -n monitoring grafana
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana NodePort 10.105.79.56 <none> 3000:32281/TCP 3h14m
通过ip+端口号进去
用户名和口令都是admin
输入后会让你修改密码
给我们装了很多node-exporter
root@k8s-master1:/apps/kube-prometheus/manifests/setup# kubectl get pod -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 2/2 Running 0 3h18m
alertmanager-main-1 2/2 Running 0 3h18m
alertmanager-main-2 2/2 Running 0 3h18m
blackbox-exporter-55c457d5fb-jw82p 3/3 Running 0 3h18m
grafana-6dd5b5f65-64nrk 1/1 Running 0 3h18m
kube-state-metrics-76f6cb7996-4jxlm 3/3 Running 0 3h18m
node-exporter-h44tf 2/2 Running 0 3h18m
#这些是监控我们集群的
node-exporter-jhl2d 2/2 Running 0 3h18m
#监控master和node节点的
node-exporter-rlrhh 2/2 Running 0 3h18m
#
node-exporter-w9jzh 2/2 Running 0 3h18m
prometheus-adapter-59df95d9f5-kkpwf 1/1 Running 0 3h18m
prometheus-adapter-59df95d9f5-ztwm7 1/1 Running 0 3h18m
prometheus-k8s-0 2/2 Running 1 3h18m
prometheus-k8s-1 2/2 Running 1 3h18m
prometheus-operator-7775c66ccf-q7fpk 2/2 Running 0 3h41m
除了这个界面还有prometheus 自带的界面
root@k8s-master1:/apps/kube-prometheus/manifests/setup# kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager-main ClusterIP 10.104.152.237 <none> 9093/TCP 3h13m
alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 3h13m
blackbox-exporter ClusterIP 10.110.78.66 <none> 9115/TCP,19115/TCP 3h13m
grafana NodePort 10.105.79.56 <none> 3000:32281/TCP 3h13m
kube-state-metrics ClusterIP None <none> 8443/TCP,9443/TCP 3h13m
node-exporter ClusterIP None <none> 9100/TCP 3h13m
prometheus-adapter ClusterIP 10.98.113.230 <none> 443/TCP 3h13m
prometheus-k8s ClusterIP 10.104.78.168 <none> 9090/TCP 3h13m
# 默认端口号是9090
prometheus-operated ClusterIP None <none> 9090/TCP 3h13m
prometheus-operator ClusterIP None <none> 8443/TCP 3h37m
我们也把这个改为nodeport类型的
root@k8s-master1:/apps/kube-prometheus/manifests/setup# kubectl edit svc -n monitoring prometheus-k8s
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/component":"prometheus","app.kubernetes.io/name":"prometheus","app.kubernetes.io/part-of":"kube-prometheus","app.kubernetes.io/version":"2.26.0","prometheus":"k8s"},"name":"prometheus-k8s","namespace":"monitoring"},"spec":{"ports":[{"name":"web","port":9090,"targetPort":"web"}],"selector":{"app":"prometheus","app.kubernetes.io/component":"prometheus","app.kubernetes.io/name":"prometheus","app.kubernetes.io/part-of":"kube-prometheus","prometheus":"k8s"},"sessionAffinity":"ClientIP"}}
creationTimestamp: "2023-09-25T02:39:48Z"
labels:
app.kubernetes.io/component: prometheus
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 2.26.0
prometheus: k8s
name: prometheus-k8s
namespace: monitoring
resourceVersion: "186058"
uid: d7eaeb30-0882-474a-9be2-54e9c6904062
spec:
clusterIP: 10.104.78.168
clusterIPs:
- 10.104.78.168
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: web
port: 9090
protocol: TCP
targetPort: web
selector:
app: prometheus
app.kubernetes.io/component: prometheus
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
prometheus: k8s
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
type: NodePort
status:
loadBalancer: {}
root@k8s-master1:/apps/kube-prometheus/manifests/setup# kubectl get svc -n monitoring prometheus-k8s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus-k8s NodePort 10.104.78.168 <none> 9090:32742/TCP 3h23m
这个就是prometheus提供的接口
Alerts的监控的
这里面是默认生成的各种各样的告警插件,这些事因为装了node-exports产生的,不装是没这些的
Status 看状态
Runtiume & Build Information 运行时和构建信息
TSDB Status TSDB状态
Command-Line Flags 命令行标记
Congifuration 配置
Rules 规则
Targets 目标
Service Discovery 服务发现
想查询东西就可以在里面输入
切换到grafana的IU
里面其实啥也没有,能够采集到,prometheus里面的各种各样的监控组件,比如监控node-exports的方式,但是没有展示出来,我们要去寻找符合要求的dashboard
gragana给我们提供了一个网站
最下面有个dashboards 点进去,里面有各种各样的dashboards
https://grafana.com/grafana/dashboards/?plcmt=footer
刚才安装了个node-export的监控插件 监控k8s集群的
直接搜索 想搜啥搜啥 比如node
用那个UI都可以 看自己习惯 比如我们点这个
https://grafana.com/grafana/dashboards/11074-node-exporter-for-prometheus-dashboard-en-v20201010/
住他的ID号 11074
或者复制这个链接
切换grafana
点击加号 inport 导入
或者把url地址粘贴到这个搜索框里 一样
上面这个页面有集群所有node的状态
cpu 内存 磁盘 读写 各种各种
还可以选择时间
选择5分钟
这里面横竖轴 里面的线 时序序列 时间指定的时间 某一个节点
默认的采集时间是三十秒钟采集一次,几百个三十秒 点成线
这个node export是我们采集集群的 资源使用率的 组件 叫node export
node节点 一个节点收集的组件 这是自带的
这是kube-prometheus所自带的
目前比较常用的exporter
类型 | Exporter |
数据库 | MySQL Exporter, Redis Exporter, MongoDB Exporter, MSSQL Exporter |
硬件 | Apcupsd Exporter ,IoT Edison Exporter , IPMI Exporter, Node Exporter |
消息队列 | Beanstalkd Exporter, Kafka Exporter, NSQ Exporter, RabbitMQ Exporter |
存储 | Ceph Exporter, Gluster Exporter, HDFS Exporter, ScaleIO Exporter |
HTTP服务 | Apache Exporter, HAProxy Exporter, Nginx Exporter |
API服务 | AWS ECS Exporter , Docker Cloud Exporter, Docker Hub Exporter, GitHub Exporter |
日志 | Fluentd Exporter, Grok Exporter |
监控系统 | Collectd Exporter, Graphite Exporter, InfluxDB Exporter, Nagios Exporter, SNMP Exporter |
其他 | Blackbox Exporter, JIRA Exporter, Jenkins Exporter , Confluence Exporter |
以上这些从github上下载
prometheus官方
https://prometheus.io/download/
里面各种各样的export mysql 的 memcached的 node的
这些都是二进制的 我们这次用的k8s 下载的都是镜像
node export是我们通过下载下来的prometheus自带的安装的,如果是其他的监控项,怎么安装,然后倒入到grafana里面
监控集群的etcd
我们先去找一个etcd的export 来去使用
etcd通信是用的tls key 所以我们需要提供 tls key tls就是ssl 需要把这个key提供给prometheus 才行 不然连接不了
必须保证 通过这个key 能访问etcd集群 才能够通过k8s 集群里面的prometheus 去获取etcd去监控它才行
curl -s --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key https://172.17.18.1:2379/metrics -k
# 使用 curl 工具从 etcd 集群的指定地址获取监控指标。这个命令的含义如下:
# -s:表示静默模式,curl 不会输出下载进度或错误消息,只返回响应的内容。
# --cert /etc/kubernetes/pki/etcd/server.crt:指定客户端证书,用于进行安全的 TLS 通信。
# --key /etc/kubernetes/pki/etcd/server.key:指定客户端私钥,与客户端证书一起使用进行身份验证和加密通信。
# https://172.17.18.1:2379/metrics:指定 etcd 的监控指标地址。这是一个 HTTPS 地址,使用指定的证书和密钥进行安全通信。
#etcd 端口号是2379 编写的时候 给我们提供了一个接口 叫metrics
# -k:表示忽略 SSL 证书验证,这是一个不安全的做法,仅在测试或特定环境下使用。
# 该命令的目的是从 etcd 集群中获取监控指标,以便进行性能分析和故障排除。请确保您具有正确的证书和密钥文件,并且已配置正确的 etcd 监控端点地址(https://172.17.18.1:2379/metrics)。如果一切正确,运行此命令应该返回 etcd 的监控指标数据。
输出的内容太多了 省略
为什么prometheus能够监控它,node export 也是 能够获取数据 监控到 就是因为 服务本身提供了 接口 都是以metrics 结尾的接口
上面那条命令输出的每一行就是各种各样的监控项 我们取一部分看下
curl -s --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key https://172.17.18.1:2379/metrics -k | tail
# TYPE process_virtual_memory_max_bytes gauge #
process_virtual_memory_max_bytes -1 #表示进程的虚拟内存最大字节数。在此示例中,值为 -1,表示未设置虚拟内存的限制。
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
# TYPE promhttp_metric_handler_requests_in_flight gauge
promhttp_metric_handler_requests_in_flight 1 #表示当前处理的 scrape 请求数量,这是一个仪表盘上的实时监控。
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
# TYPE promhttp_metric_handler_requests_total counter
promhttp_metric_handler_requests_total{code="200"} 1 #状态码为200 的两个
promhttp_metric_handler_requests_total{code="500"} 0
promhttp_metric_handler_requests_total{code="503"} 0 #状态码为503 的 0个
#表示总的 scrape 请求数量,按 HTTP 状态代码分类。在这里,code="200" 表示成功的请求次数为 1,而 code="500" 和 code="503" 分别表示 500 和 503 HTTP 状态代码的请求次数为 0。
这里面就是我们去看下etcd里面产生的数据,我们怎么把这些数据拿到prometheus里面呢?
首先我们需要去创建 给etcd服务本身提供监控的一个组件
暴漏个端口号给prometheus端口号,通过service暴漏,目前prometheus访问不了etcd,之前说k8s只有apiServer能够访问etcd,所以我们需要给etcd本身暴露个访问接口出来通过service
Endpoints
写一个
service 要把某个集群外服务发布到k8s集群里面里面来 需要通过externalname的方式
定义一个endpoint 然后把endpoints和一个service名称关联 因为默认情况 我们直接创建一个service 他就直接自动创建endpoint 组件 、
把集群外的资源发布到k8s进来 首先用endpoint的方式做成资源对象 有多少个节点就写多少个ip
如果etcd不是跑在k8s集群里面的,如果prometheus想监控集群之外的其他服务,比如mysql,就可以通过做一个service 给映射进来,把集群之外的某一个服务映射到集群里面来,因为prometheus访问不到集群外面的组件,需要把集群之外的服务暴漏到集群之内来,第一件事就要运行一个service 把集群之外的服务映射到集群之内来
apiVersion: v1
kind: Endpoints
metadata:
name: etcd-prom
namespace: kube-system #和下面的svc名字必须一样
labels: #标签选择器 后面要引用
app: etcd-prom
subsets:
- addresses:
- ip: 172.17.18.1
ports:
- port: 2379
name: https-metrics #需要定义pod名字 这里定义了name svc也得需要定义 后面需要引用
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
namespace: kube-system
name: etcd-prom
labels: #标签 没必要 写不写无所谓
app: etcd-prom #标签选择器 后面要引用
spec:
type: ClusterIP
ports:
- port: 2379
name: https-metrics
protocol: TCP
targetPort: 2379
#不能写selector 标签选择器 是因为 没有deployment给我们 关联的deployment 所以不用写 写了就不对了
这样写是因为 etcd在生产上是把etcd运行在k8s集群之外的
我们现在通过cluster ip 去访问ETCD
root@k8s-master1:/apps/prometheus# kubectl get svc -n kube-system etcd-prom
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
etcd-prom ClusterIP 10.104.25.120 <none> 2379/TCP 4m21s
我们访问一下 通过curl
root@k8s-master1:/apps/prometheus# curl -s --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key https://10.104.25.120:2379/metrics -k
输出
# TYPE process_virtual_memory_max_bytes gauge
process_virtual_memory_max_bytes -1
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
# TYPE promhttp_metric_handler_requests_in_flight gauge
promhttp_metric_handler_requests_in_flight 1
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
# TYPE promhttp_metric_handler_requests_total counter
promhttp_metric_handler_requests_total{code="200"} 4
promhttp_metric_handler_requests_total{code="500"} 0
promhttp_metric_handler_requests_total{code="503"} 0
#取末尾 有这种输出就代表成功了
然后我们需要把这两个证书和私钥做成tls 类型的secret 给映射到k8s集群里面来 我们必须需要证书和私钥才能够去访问到etcd
root@k8s-master1:~# cd /etc/kubernetes/pki/etcd
root@k8s-master1:/etc/kubernetes/pki/etcd# kubectl create secret generic etcd-ssl --from-file=./ca.crt --from-file=./server.crt --from-file=./server.key -n monitoring
secret/etcd-ssl created
#类型通用 generic 名字为 etcd-ssl 名称空间为monitoring
查看一下
root@k8s-master1:/etc/kubernetes/pki/etcd# kubectl get secrets -n monitoring etcd-ssl
NAME TYPE DATA AGE
etcd-ssl Opaque 2 72s
然后去将证书挂载prometheus容器,因为prometheus是operator部署的 只需要修改prometheus的资源即可
就是把上面创建的secrets 加到prometheus里面去
有个资源对象就叫prometheus 直接去修改prometheus就行
这个类型 prometheus之前是没有的 之前讲k8s 默认是没有的 这个prometheus 是通过operator创建的时候 最初创建了 operator运行的pod 这个pod 本身是crd 自定义 资源对象 它在k8s集群里面给我们创建了一个prometheus的类型 产生了个k8s的资源对象
然后产生的资源对象就叫k8s
root@k8s-master1:~# kubectl edit prometheus -n monitoring k8s
我们去查看怎么加
root@k8s-master1:/apps/prometheus# kubectl explain prometheus.spec.secrets #他的位置就在spec下面
KIND: Prometheus
VERSION: monitoring.coreos.com/v1
FIELD: secrets <[]string> #是个列表
DESCRIPTION:
Secrets is a list of Secrets in the same namespace as the Prometheus
object, which shall be mounted into the Prometheus Pods. The Secrets are
mounted into /etc/prometheus/secrets/<secret-name>.
所以我们只有在spec下面加 secrets就可以 了
root@k8s-master1:~# kubectl edit prometheus -n monitoring k8s
generation: 1
labels:
app.kubernetes.io/component: prometheus
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 2.26.0
prometheus: k8s
name: k8s
namespace: monitoring
resourceVersion: "186041"
uid: e2c820be-d704-44aa-a56b-37e009a1f079
spec:
secrets: #加到spec下面就像
- etcd-ssl # #### ##
alerting:
alertmanagers:
查询一下
root@k8s-master1:~# kubectl get pods -n monitoring -l app=prometheus
NAME READY STATUS RESTARTS AGE
prometheus-k8s-0 2/2 Running 1 11s
prometheus-k8s-1 2/2 Running 1 25s
看一下证书挂载的位置
root@k8s-master1:~# kubectl exec -n monitoring prometheus-k8s-0 -- ls /etc/prometheus/secrets/etcd-ssl
Defaulted container "prometheus" out of: prometheus, config-reloader
server.crt
server.key
这样证书和私钥就挂载好了
第一步我们把集群之外的某个服务给映射进来集群里面来了,把etcd通过service的方式 endpoint 的方式映射到集群里来
第二步 我们访问etcd本身的时候需要用到证书 把原有的证书做成secrets的方式 映射到集群里面去
secrets映射进来后需要把secret给我们prometheus 让prometheus有这个证书
上面这个路径我们需要知道,因为我们监控etcd的时候需要让prometheus去读这个证书
下面开始创建etcd 的service Monitor 的监控组件
从集群里面添加service Monitor Monitor是监控的意思 就是个service 监控
就是个pod
创建
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: etcd #名字
namespace: monitoring
labels: #标签
app: etcd
spec:
jobLabel: k8s-app #这个是任务标签
endpoints: #我们刚才给etcd创建的endpoint
- interval: 30s # 监控间隔时间 30秒 每隔30秒去获取一次数据
port: https-metrics # 这个 port 对应 Service.spec.ports.name 这个是上面定义的pod名称 也就是上面写的svc和endpoint一样
scheme: https #协议
tlsConfig: #打进来的etcd证书
caFile: /etc/prometheus/secrets/etcd-ssl/ca.crt #目录
certFile: /etc/prometheus/secrets/etcd-ssl/server.crt
keyFile: /etc/prometheus/secrets/etcd-ssl/server.key
insecureSkipVerify: true #关闭证书校验
selector: #标签选择器 和service 的labels 也就是上面写的svc和endpoint一样
matchLabels:
app: etcd-prom # 跟 svc 的 lables 保持一致 才能关联上 他并不是通过ip去寻找的 他是通过名称 去关联到对应service来的
namespaceSelector: #名称空间选择器
matchNames:
- kube-system #名称空间
创建
root@k8s-master1:/apps/prometheus# kubectl apply -f service-monitor.yaml
servicemonitor.monitoring.coreos.com/etcd created
再看web界面就有了 etcd 为up 就说明监控项添加到prometheus里面了
切换grafana里面 加个etcd的dashboard
流程都是一样的在k8s里面监控
服务本身提供了 /metrics ,Prometheus 可以通过该接口采集到数据;
这是云原生服务提供的
如果非云原生服务 就比如 虚拟机安装的nginx 他没有/metrics接口
云原生:
软件应用在开发的时候就支持云环境的的软件,通常叫云原生,云原生有很多特性,它的组件可以运行在k8s里面,除了这种方式以外还公布了/metrics接口
还是去这个里面去找
最下面有个dashboards 点进去,里面有各种各样的dashboards
https://grafana.com/grafana/dashboards/?plcmt=footer
刚才安装了个node-export的监控插件 监控k8s集群的
直接搜索 etcd
上次用的是 ID的方式 这次我们复制链接
https://grafana.com/grafana/dashboards/3070-etcd/
然后切换 grafana 的ui 添加就可以
这里的name 可以自定义
就成功了
service-monitor 方式就创建好了
这个很重要!!
编写方式通常和上面类似,https的就提供证书,如果不是https的就不需要提供证书,只需要提供service证书就可以了
不过一般来说 都是htts 的
下章节写非云原生的服务监控