Kubernetes(k8s)部署Promehteus监控
一、概述
Prometheus是一个开源监控系统,生态包括了很多组件,它们中的一些是可选的:
- 主服务Prometheus Server负责抓取和存储时间序列数据
- 客户库负责检测应用程序代码
- 支持短生命周期的PUSH网关
- 基于Rails/SQL仪表盘构建器的GUI
- 多种导出工具,可以支持Prometheus存储数据转化为HAProxy、StatsD、Graphite等工具所需要的数据存储格式
- 警告管理器
- 命令行查询工具
- 其他各种支撑工具
Prometheus Operator的本职就是一组用户自定义的CRD资源以及Controller的实现,Prometheus Operator负责监听这些自定义资源的变化,并且根据这些资源的定义自动化的完成如Prometheus Server自身以及配置的自动化管理工作。以下是Prometheus Operator的架构图:
Prometheus Operator 是CoreOS的一个开源项目,用来增强Prometheus在Kubernetes中的管理运维能力。利用Kubernetes的自定义资源定义 (Custom Resource Definition)的特性,实现声明式管理运维Prometheus监控告警系统。
kube-prometheus 为基于 Prometheus 和 Prometheus Operator 的完整集群监控堆栈提供示例配置。这包括部署多个 Prometheus 和 Alertmanager 实例、指标导出器(例如用于收集节点指标的 node_exporter)、抓取将 Prometheus 链接到各种指标端点的目标配置,以及用于通知集群中潜在问题的示例警报规则。
两个项目的关系:前者只包含了Prometheus Operator,后者既包含了Operator,又包含了Prometheus相关组件的部署及常用的Prometheus自定义监控,具体包含下面的组件
- The Prometheus Operator:创建CRD自定义的资源对象
Highly available Prometheus:创建高可用的Prometheus
Highly available Alertmanager:创建高可用的告警组件
Prometheus node-exporter:创建主机的监控组件
Prometheus Adapter for Kubernetes Metrics APIs:创建自定义监控的指标工具(例如可以通过nginx的request来进行应用的自动伸缩)
kube-state-metrics:监控k8s相关资源对象的状态指标
Grafana:进行图像展示
二、安装kube-prometheus
1. 项目地址
在GitHub中下载,地址:https://gitcode.net/mirrors/coreos/kube-prometheus?utm_source=csdn_github_accelerator
可以通过git clone,如果服务器网络不通也可以直接下载好源代码在上传服务器
下载要看清楚版本,分支不同对应k8s版本不一样
由于服务器上git 不下来,我直接在网站上下载了zip包
把包中的manifests文件上传到服务器上,里面都是yaml文件。
2. 修改yaml文件镜像源
把这几个文件的image地址都修改成下面的地址,源地址不一定能拉的下镜像
[root@k8s-master1 manifests]# grep -rn 'image: ' *
alertmanager-alertmanager.yaml:13: image: quay.mirrors.ustc.edu.cn/prometheus/alertmanager:v0.23.0
blackboxExporter-deployment.yaml:32: image: quay.mirrors.ustc.edu.cn/prometheus/blackbox-exporter:v0.19.0
blackboxExporter-deployment.yaml:54: image: jimmidyson/configmap-reload:v0.5.0
blackboxExporter-deployment.yaml:77: image: quay.mirrors.ustc.edu.cn/brancz/kube-rbac-proxy:v0.11.0
grafana-deployment.yaml:32: image: grafana/grafana:8.3.3
kubeStateMetrics-deployment.yaml:34: image: cnych/kube-state-metrics:v2.3.0
kubeStateMetrics-deployment.yaml:50: image: quay.mirrors.ustc.edu.cn/brancz/kube-rbac-proxy:v0.11.0
kubeStateMetrics-deployment.yaml:71: image: quay.mirrors.ustc.edu.cn/brancz/kube-rbac-proxy:v0.11.0
nodeExporter-daemonset.yaml:37: image: quay.mirrors.ustc.edu.cn/prometheus/node-exporter:v1.3.1
nodeExporter-daemonset.yaml:65: image: quay.mirrors.ustc.edu.cn/brancz/kube-rbac-proxy:v0.11.0
prometheusAdapter-deployment.yaml:39: image: cnych/prometheus-adapter:v0.9.1
prometheusOperator-deployment.yaml:32: image: quay.mirrors.ustc.edu.cn/prometheus-operator/prometheus-operator:v0.53.1
prometheusOperator-deployment.yaml:51: image: quay.mirrors.ustc.edu.cn/brancz/kube-rbac-proxy:v0.11.0
prometheus-prometheus.yaml:21: image: quay.mirrors.ustc.edu.cn/prometheus/prometheus:v2.32.1
3. 修改yaml文件svc,暴露服务端口
这三个svc分别是告警,grafana,prometheus的web页面服务,暴露端口方便在外部访问
[root@k8s-master1 manifests]# grep -rn 'NodePort' *
alertmanager-service.yaml:13: type: NodePort
grafana-service.yaml:12: type: NodePort
prometheus-service.yaml:13: type: NodePort
每个svc都添加type:NodePort,和对应的端口,端口自定义不重复即可
4. 安装部署
在manifests目录下执行
#在一步要使用create,使用apply安装过程中会提示 Too long: must have at most 262144 bytes
#这会创建一个名为 monitoring 的命名空间,以及相关的 CRD 资源对象声明
[root@k8s-master1 manifests]# kubectl create -f setup/
#安装服务
[root@k8s-master1 manifests]# kubectl apply -f .
安装需要等一会,需要下载镜像
看到所有pod都running即部署完成
[root@k8s-master1 ~]# kubectl get pod -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 2/2 Running 4 (17m ago) 16h
alertmanager-main-1 2/2 Running 0 86s
alertmanager-main-2 2/2 Running 0 89s
blackbox-exporter-5f4d9ff7f4-f9t8j 3/3 Running 6 (17m ago) 16h
grafana-78d8cfccff-5vjcc 1/1 Running 2 (17m ago) 16h
kube-state-metrics-5fc765d7b9-skwtl 3/3 Running 6 (17m ago) 16h
node-exporter-48qvw 2/2 Running 4 (66m ago) 24h
node-exporter-tgrcr 2/2 Running 56 (13m ago) 24h
node-exporter-vqchr 2/2 Running 8 (17m ago) 24h
prometheus-adapter-7c55854c56-2s4ll 1/1 Running 2 (17m ago) 16h
prometheus-adapter-7c55854c56-sfn2g 1/1 Running 2 (17m ago) 16h
prometheus-k8s-0 2/2 Running 0 89s
prometheus-k8s-1 2/2 Running 0 85s
prometheus-operator-67bcf4bb4f-ntsvw 2/2 Running 4 (17m ago) 16h
查询svc
[root@k8s-master1 ~]# kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager-main NodePort 10.103.39.12 <none> 9093:30082/TCP,8080:30280/TCP 24h
alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 24h
blackbox-exporter ClusterIP 10.100.135.40 <none> 9115/TCP,19115/TCP 24h
grafana NodePort 10.103.204.230 <none> 3000:30081/TCP 24h
kube-state-metrics ClusterIP None <none> 8443/TCP,9443/TCP 24h
node-exporter ClusterIP None <none> 9100/TCP 24h
prometheus-adapter ClusterIP 10.101.197.199 <none> 443/TCP 24h
prometheus-k8s NodePort 10.111.219.237 <none> 9090:30080/TCP,8080:31486/TCP 24h
prometheus-operated ClusterIP None <none> 9090/TCP 24h
prometheus-operator ClusterIP None <none> 8443/TCP 24h
5. 页面访问
promethus server页面
grafana页面,默认密码admin/admin
告警页面
6. 登录grafana配置监控
在设置中选择配置
默认就已经带有k8s的监控,可以直接使用也可以点击add data source手动配置
配置完成后,点击test测试
在主页上,点击导入import,导入监控模板
315是其中一个监控模板id,可以手动去grafana官网下载需要的模板再导入。这里直接使用315测试监控效果,点击load
自定义name,promethus选择刚才配置的,点击import
页面监控数据
7. 配置告警
配置邮箱告警,修改下告警配置yaml文件。修改前记得把原有的告警配置delete
[root@k8s-master1 alter]# kubectl delete -f alertmanager-secret.yaml
修改yaml
[root@k8s-master1 alter]# cat alertmanager-secret.yaml
apiVersion: v1
data: {}
kind: Secret
metadata:
name: alertmanager-main
namespace: monitoring
stringData:
alertmanager.yaml: |-
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: 'xxx@qq.com' # 发件人邮箱
smtp_auth_username: 'xxx@qq.com' # 发件人邮箱
smtp_auth_password: 'oeikjdxxxxwzbgaj' # QQ授权码
smtp_hello: 'qq.com'
smtp_require_tls: false
route:
group_by: ['alertname']
group_interval: 5m
group_wait: 30s
receiver: default-receiver
repeat_interval: 12h
routes:
- receiver: 'lms-saas'
match_re:
namespace: ^(lms-saas|lms-standard).*$ # 根据namespace进行区分报警
receivers:
- name: 'default-receiver'
email_configs:
- to: 'xxx@qq.com' # 收件人邮箱,设置多个收件人
send_resolved: true
- to: 'xxx@qq.com'
send_resolved: true
- name: 'lms-saas' # 跟上面定义的名字必须一样
email_configs:
- to: 'xxx@qq.com' # 收件人邮箱,也可以设置多个
send_resolved: true
- to: 'xxx@qq.com'
send_resolved: true
type: Opaque
重新配置告警
[root@k8s-master1 alter]# kubectl apply -f alertmanager-secret.yaml
测试告警,删掉一个pod可以正常收到告警邮件