Prometheus特点
多维数据模型
PromSQL:一种灵活的查询语言,可以利用多维数据完成复杂的查询
不依赖分布式存储,单个服务器节点可直接工作
基于HTTP的pull方式采集时间序列数据
推送时间序列数据通过PushGateway组件支持
通过服务发现或静态配置发现目标
多种图形模式及仪表盘支持
Grafana特点
支持 Graphite、zabbix、InfluxDB、Prometheus、OpenTSDB、Elasticsearch 等作为数据源
插件丰富,功能灵活
Zabbix,open-Falcon,Premetheus+Grafana 监控对比
监控方案 | 告警 | 特点 | 适用 |
Zabbix | Yes | 大量定制工作 | 大部分的互联网公司 |
open-falcon(小米研发) | Yes | 功能模块分解比较细,显得更复杂 | 系统和应用监控 |
Prometheus+Grafana | Yes | 扩展性好 | 容器、应用、主机全方位监控 |
Prometheus 组件
Prometheus 结构
Prometheus Server:用于收集指标和存储时间序列数据,并提供查询接口
Retrieval TSDB(时序性数据库) HTTPserver
client Library:客户端库(例如 Go,Python,Java 等),为需要监控的服务产生相应的/metrics 并暴露给 Prometheus Server。目前已经有很多软件原生就支持Prometheus 并提供/metrics,可以直接使用。对于像操作系统已经不提供/metrics, 可以使用 exporter,或者自己开发 exporter 来提供/metrics 服务
push gateway:主要用于临时性的 jobs。由于这类 jobs 存在时间较短,可能在Prometheus 来 pull 之前就消失了。Jobs 定时将指标 push 到 push gateway,再由 Prometheus Server 从 Push gateway 上 pull。这种方式主要用于服务层面的metrics
exporter:用于暴露已有的第三方服务的 metrics 给 Prometheus
alertmanager:从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对应的接受方式,发出报警。常见的接收方式有:电子邮件, pagerduty,OpsGenie, webhook 等
Web UI:Prometheus 内置一个简单的 Web 控制台,可以查询指标,查看配置信息或者 Service Discovery 等,实际工作中,查看指标或者创建仪表盘通常使用 Grafana,Prometheus 作为 Grafana 的数据源
在k8s中部署Prometheus(本次使用的以1.20版本的k8s为例部署)
Kubeadm 安装Prometheus 环境
主机名 | IP 地址 | 操作系统 | 主要软件 |
k8s-master | 192.168.9.206 | CentOS 7.3 x86_64 | Prometheus,Grafana |
k8s-node01 | 192.168.9.207 | CentOS 7.3 x86_64 | node_exporter |
k8s-node02 | 192.168.9.208 | CentOS 7.3 x86_64 | NFS,node_exporter |
实验要求
通过 Kubeadm 实现快速部署 Prometheus+Grafana 监控系统。完成对 K8s 资源监控并使用 Grafana 展示。完成对 K8s Node 节点基础资源监控并用 Grafana 展示
在部署完成后可能会有状态不对 例如下图
解决方法 打开配置文件
[root@master ~]# vi /etc/kubernetes/manifests/kube-scheduler.yaml
[root@master ~]# vi /etc/kubernetes/manifests/kube-controller-manager.yaml
修改为下图所示 两个配置文件都是如此
部署Prometheus
1.上传文件
2. 安装unzip
yum -y install unzip
unzip Prometheus.zip
cd Prometheus
3.使用命令查询
grep 192.168.9. *.yaml
4.执行命令替换自己的IP
# 修改为自己的IP
sed -i 's/192.168.9.208/192.168.27.154/g' alertmanager-pvc.yaml
sed -i 's/192.168.9.208/192.168.27.154/g' grafana.yaml
sed -i 's/192.168.9.207/192.168.27.153/g' prometheus-configmap.yaml
sed -i 's/192.168.9.208/192.168.27.154/g' prometheus-configmap.yaml
sed -i 's/192.168.9.208/192.168.27.154/g' prometheus-statefulset.yaml#192.168.27.154 为规划的nfs节点的IP(即node2节点的IP)
#192.168.27.153 为规划的node1节点的IPgrep 192.168. *.yaml#过滤IP是否修改正确
切换node2节点部署nfs服务
yum install nfs-utils -ymkdir -p /data/file/prometheus-data
# rw 读写
# sync 同时将数据写入到内存与硬盘中,保证不丢失数据
# insecure 允许客户端从大于1024的tcp/ip端口连接服务器
# no_subtree_check 即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率
# no_root_squash当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员
echo "/data/file 192.168.27.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)" > /etc/exports# 启动服务
systemctl start nfs
systemctl start rpcbind
systemctl enable nfs
systemctl enable rpcbind
剩余节点也要安装nfs
yum install nfs-utils -y
所有节点执行镜像加速
cat > /etc/docker/daemon.json << EOF
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://cf-workers-docker-io-8jv.pages.dev"]
}
EOF
systemctl daemon-reload
systemctl restart docker
切回master节点
kubectl apply -f prometheus-rbac.yaml
kubectl apply -f prometheus-configmap.yaml
kubectl apply -f prometheus-statefulset.yaml
kubectl apply -f prometheus-service.yamlkubectl get pod -n kube-system
查看端口,查看web界面
kubectl get svc -n kube-system
在node节点开启服务
#推送服务到node节点
scp -r node/ 192.168.27.153:/root
scp -r node/ 192.168.27.154:/root
切换node节点
cd node/
sh node_exporter.sh
回到web界面 target页面的node节点的状态就变成up
部署Grafana
切换nfs节点(即为node2节点)
# 此步骤nfs节点创建
mkdir -p /data/file/grafana-data
chmod -R 777 /data/file/grafana-data
修改Granfana的yaml文件
vi grafana.yaml
imagePullPolicy: "IfNotPresent"
执行yaml文件
kubectl apply -f grafana.yaml
浏览器访问 http://192.168.27.152:30007/
创建数据源
导入数据源
实现Prometheus报警
浏览器搜索 http://192.168.27.154:30090/
切换到master节点修改yaml文件
vi prometheus-statefulset.yaml
- name: prometheus-rulesmountPath: /etc/config/rules
添加如图位置
kubectl apply -f prometheus-rules.yaml
kubectl apply -f prometheus-statefulset.yaml
kubectl get pod -n kube-system
等待加载成功后刷新页面 规则就应用上了
配置网络通信
vi prometheus-configmap.yaml
alerting:alertmanagers:- static_configs:- targets: ["alertmanager:80"]
#这段加到配置文件最后就行了
#执行yaml文件
kubectl apply -f prometheus-configmap.yaml
kubectl apply -f prometheus-statefulset.yaml#修改邮箱报警信息
vi alertmanager-configmap.yaml
网易邮箱授权码
在node2节点执行
# 此步骤node2节点创建
mkdir /data/file/alertmanager-data/
chmod -R 777 /data/file/alertmanager-data/
切换master节点
# master节点执行
kubectl apply -f alertmanager-configmap.yaml
kubectl apply -f alertmanager-pvc.yaml
kubectl apply -f alertmanager-deployment.yaml
kubectl apply -f alertmanager-service.yamlkubectl get pod -n kube-system
等待加载完毕
验证报警邮件
在Prometheus页面 在node1几点停止服务
systemctl stop node_exporter
等待类似如图信息
回到网易邮箱就可以看见邮箱信息