Traefik SRE 之使用 Prometheus 进行监控报警
当我们使用 Traefik 作为 Kubernetes 的 Ingress 控制器的时候,我们自然也非常有必要对其进行监控。本文我们将探讨如何使用 Prometheus 和 Grafana 从 Traefik 提供的 metrics 指标中进行监控报警。
安装
首先你需要一个可以访问的 Kubernetes 集群。
部署 Traefik
这里我们使用更加简单的 Helm 方式来安装部署 Traefik。首先使用以下命令将 Traefik 添加到 Helm 的仓库中:
$ helm repo add traefik https://helm.traefik.io/
$ helm repo update
然后我们可以在 kube-system 命名空间下来部署最新版本的 Traefik,在我们这个示例中,我们还需要确保在集群中启用了 Prometheus 指标,可以通过给 Helm 传递 --metrics.prometheus=true
标志来实现,这里我们将所有配置都放置到下面的 traefik-values.yaml 文件中:
# traefik-values.yaml
# 简单使用 hostPort 模式
ports:
web:
port: 8000
hostPort: 80
websecure:
port: 8443
hostPort: 443
service:
enabled: false
# 不暴露 dashboard
ingressRoute:
dashboard:
enabled: false
# 开启 prometheus 监控指标
additionalArguments:
- --api.debug=true
- --metrics.prometheus=true
# kubeadm 安装的集群默认情况下master是有污点,需要容忍这个污点才可以部署
# 这里我们将 traefik 固定在 master 节点
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Equal"
effect: "NoSchedule"
nodeSelector:
kubernetes.io/hostname: "master1"
直接使用如下所示的命令安装:
$ helm install traefik traefik/traefik -n kube-system -f ./traefik-values.yaml
NAME: traefik
LAST DEPLOYED: Mon Apr 5 11:49:22 2021
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
由于我们默认没有为 Traefik 的 Dashboard 创建 IngressRoute 对象,这里我们使用 port-forward 来临时访问即可,当然首先需要为 Traefik Dashboard 创建一个 Service:
# traefik-dashboard-service.yaml
apiVersion: v1
kind: Service
metadata:
name: traefik-dashboard
namespace: kube-system
labels:
app.kubernetes.io/instance: traefik
app.kubernetes.io/name: traefik-dashboard
spec:
type: ClusterIP
ports:
- name: traefik
port: 9000
targetPort: traefik
protocol: TCP
selector:
app.kubernetes.io/instance: traefik
app.kubernetes.io/name: traefik
直接创建,然后使用端口转发来访问:
$ kubectl apply -f traefik-dashboard-service.yaml
$ kubectl port-forward service/traefik-dashboard 9000:9000 -n kube-system
Forwarding from 127.0.0.1:9000 -> 9000
Forwarding from [::1]:9000 -> 9000
接下来我们就可以通过浏览器 http://localhost:9000/dashboard/(注意 URL 中的尾部斜杠,这是必须的)访问 Traefik Dashboard 了,现在应该可以看到在仪表板的 Features 部分启用了 Prometheus 指标。
此外我们还可以访问 http://localhost:9000/metrics 端点来查看 Traefik 提供的一些 metrics 指标:
部署 Prometheus Stack
Prometheus 完整的工具链由许多组件组成,如果要完全手动去安装配置需要较长时间,感兴趣的朋友可以参考前面我们的文章相关介绍。同样这里我们直接使用 Prometheus 的 Helm Charts 来部署:
$ helm repo add prometheus-community https://github.com/prometheus-community/helm-charts
$ helm repo update
上述资源库提供了许多 Chart,要查看完整的列表,你可以使用搜索命令:
$ helm search repo prometheus-community
这里我们需要安装的是 kube-prometheus-stack 这个 Chart,它会部署所需要的相关组件:
$ helm install prometheus-stack prometheus-community/kube-prometheus-stack
NAME: prometheus-stack
LAST DEPLOYED: Mon Apr 5 12:25:22 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
kubectl --namespace default get pods -l "release=prometheus-stack"
Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
配置 Traefik 监控
Prometheus Operator 提供了 ServiceMonitor 这个 CRD 来配置监控指标的采集,这里我们定义一个如下所示的对象:
# traefik-service-monitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: traefik
namespace: default
labels:
app: traefik
release: prometheus-stack
spec:
jobLabel: traefik-metrics
selector:
matchLabels:
app.kubernetes.io/instance: traefik
app.kubernetes.io/name: traefik-dashboard
namespaceSelector:
matchNames:
- kube-system
endpoints:
- port: traefik
path: /metrics
根据上面的配置,Prometheus 将获取 traefik-dashboard 服务的 /metrics 端点。主要注意的是 traefik-dashboard 服务是在 kube-system 命名空间中创建的,而 ServiceMonitor 则部署在默认的 default 命名空间中,所以这里面我们使用了 namespaceSelector 进行命名空间匹配。
$ kubectl apply -f traefik-service-monitor.yaml
接下来我们可以来验证一下 Prometheus 是否已经开始抓取 Traefik 的指标了。
配置 Traefik 报警
接下来我们还可以添加一个报警规则,当条件匹配的时候会触发报警,同样 Prometheus Operator 也提供了一个名为 PrometheusRule 的 CRD 对象来配置报警规则:
# traefik-rules.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
annotations:
meta.helm.sh/release-name: prometheus-stack
meta.helm.sh/release-namespace: default
labels:
app: kube-prometheus-stack
release: prometheus-stack
name: traefik-alert-rules
namespace: default
spec:
groups:
- name: Traefik
rules:
- alert: TooManyRequest
expr: avg(traefik_entrypoint_open_connections{job="traefik-dashboard",namespace="kube-system"}) > 5
for: 1m
labels:
severity: critical
这里我们定义了一个规则:如果1分钟内有超过5个 open connections 机会触发一个 TooManyRequest 报警,直接创建这个对象即可:
$ kubectl apply -f traefik-rules.yaml
创建完成后正常在 Promethues 的 Dashboard 下的 Status > Rules 页面就可以看到对应的报警规则:
Grafana 配置
前面使用 kube-prometheus-stack 这个 Helm Chart 部署的时候就已经部署上了 Grafana,接下来我们可以为 Traefik 的监控指标配置一个 Dashboard,同样首先我们使用端口转发的方式来访问 Grafana:
$ kubectl port-forward service/rometheus-stack-grafana 10080:80
然后访问 Grafana GUI(http://localhost:10080)时,它会要求输入登录名和密码,默认的登录用户名是 admin,密码是 prom-operator,密码可以从名为 prometheus-operator-grafana 的 Kubernetes Secret 对象中获取。
当然我们可以自己为 Traefik 自定义一个 Dashboard,也可以从 Grafana 的官方社区中导入一个合适的即可,点击左侧导航栏上的四方形图标,导航到 Dashboards > Manage,即可添加仪表盘。
点击右上角的 Import 按钮,输入 11462 作为 Dashboard 的 ID,对应用户 timoreymann 贡献的 Traefik 2 仪表盘。
点击 Load 后,你应该看到导入的仪表盘的相关信息。
在最下面有一个下拉菜单,选择 Prometheus 数据源,然后点击 Import,即可生成如下所示的 Dashboard。
测试
现在,Traefik 已经开始工作了,并且指标也被 Prometheus 和 Grafana 获取到了,接下来我们需要使用一个应用程序来测试。这里我们部署 HTTPBin 服务,它提供了许多端点,可用于模拟不同类型的用户流量。对应的资源清单文件如下所示:
# httpbin.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin
labels:
app: httpbin
spec:
replicas: 1
selector:
matchLabels:
app: httpbin
template:
metadata:
labels:
app: httpbin
spec:
containers:
- image: kennethreitz/httpbin
name: httpbin
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: httpbin
spec:
ports:
- name: http
port: 8000
targetPort: 80
selector:
app: httpbin
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: httpbin
spec:
entryPoints:
- web
routes:
- match: Host(`httpbin.local`)
kind: Rule
services:
- name: httpbin
port: 8000
直接创建上面的资源清单:
$ kubectl apply -f httpbin.yaml
deployment.apps/httpbin created
service/httpbin created
ingressroute.traefik.containo.us/httpbin created
httpbin 路由会匹配 httpbin.local 的主机名,然后将请求转发给 httpbin Service:
$ curl -I http://192.168.31.75 -H "host:httpbin.local"
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Content-Length: 9593
Content-Type: text/html; charset=utf-8
Date: Mon, 05 Apr 2021 05:43:16 GMT
Server: gunicorn/19.9.0
我们这里部署的 Traefik 使用的是 hostPort 模式,固定到 master 节点上面的,这里的 IP 地址 192.168.31.75 就是 master 节点的 IP 地址。
接下来我们使用 ab 来访问 HTTPBin 服务模拟一些流量,这些请求会产生对应的指标,执行以下脚本:
$ ab -c 5 -n 10000 -m PATCH -H "host:httpbin.local" -H "accept: application/json" http://192.168.31.75/patch
$ ab -c 5 -n 10000 -m GET -H "host:httpbin.local" -H "accept: application/json" http://192.168.31.75/get
$ ab -c 5 -n 10000 -m POST -H "host:httpbin.local" -H "accept: application/json" http://192.168.31.75/post
正常一段时间后再去查看 Grafana 的 Dashboard 可以看到显示了更多的信息:
包括:正常运行的时间、平均响应时间、请求总数、基于 HTTP 方法和服务的请求计数等。
最后,当我们测试应用流量时,Prometheus 可能会触发报警,之前创建的 TooManyRequest 报警将显示在 Alertmanager 仪表板上,然后可以自己根据需要配置接收报警信息的 Receiver 即可。
$ kubectl port-forward service/prometheus-stack-kube-prom-alertmanager 9093:9093
Forwarding from 127.0.0.1:9093 -> 9093
总结
在本文中,我们已经看到了将 Traefik 连接到 Prometheus 和 Grafana 以从 Traefik 指标中创建可视化的过程是非常简单的。当熟悉这些工具后,我们也可以根据实际需求创建一些 Dashboard,暴露你的环境的一些关键数据。
实际操作
k8s版本:1.20.12
traefik版本:2.4.8
已经安装好k8s和traefik了,Prometheus ,Alertmanager 和Grafana采用传统方式进行安装的
按照上面文章的讲述,traefik开启Prometheus监控需要加参数:--metrics.prometheus=true
,有两种办法,yaml文件或使用kubeapi
yaml文件
使用kubeapi
通过浏览器访问traefik的dashboard, http://www.daniel.com/dashboard/(注意 URL 中的尾部斜杠,这是必须的)访问 Traefik Dashboard 了,现在应该可以看到在仪表板的 Features 部分启用了 Prometheus 指标。
浏览器访问traefik的dashboard,查看文章:https://www.cnblogs.com/sanduzxcvbnm/p/15741429.html
此外我们还可以访问 http://www.daniel.com/metrics 端点来查看 Traefik 提供的一些 metrics 指标:
访问报错404
使用地址 http://www.daniel.com:18443/metrics 就可以
刚才的404,可以查看接口信息获取http://www.daniel.com/api/rawdata
可以看到默认的PathPrefix(/metrics
)用的entryPoints是traefik,而不是web,因此才需要加上端口号
想使用域名不加端口号的形式进行访问,可以使用其他域名新加一条
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
labels:
app.kubernetes.io/name: traefik
kubernetes.io/ingress.class: traefik
name: traefik-dashboard
namespace: kube-system
resourceVersion: '2897779'
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`www.daniel.com`) && PathPrefix(`/dashboard`) || PathPrefix(`/api`)
services:
- kind: TraefikService
name: api@internal
# 以下内容是新加的
- kind: Rule
match: Host(`www.aaa.com`) && PathPrefix(`/metric`)
services:
- kind: TraefikService
name: prometheus@internal
部署 Prometheus ,略过
使用Prometheus 配置 Traefik 监控,收集数据,配置文件增加如下内容:
k8s集群安装有traefik的节点都写上,这里仍使用端口号进行获取数据
- job_name: 'traefik'
static_configs:
- targets: ['192.168.2.163:18443','192.168.2.164:18443','192.168.2.165:18443','192.168.2.167:18443']
Grafana 配置
先添加Prometheus数据源,然后再输入 11462 作为 Dashboard 的 ID
一堆报错的,换了多个模板,还是报错,应该是从Prometheus获取数据的时候有问题,或者是模板有点老的缘故,这个问题先暂时放下,以后再解决
Traefik SRE 之使用 Prometheus 进行监控报警的更多相关文章
- Prometheus 系统监控方案 一
最近一直在折腾时序类型的数据库,经过一段时间项目应用,觉得十分不错.而Prometheus又是刚刚推出不久的开源方案,中文资料较少,所以打算写一系列应用的实践过程分享一下. Prometheus 是什 ...
- 使用Prometheus+Grafana监控MySQL实践
一.介绍Prometheus Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的.随着发展,越来越多公司和组织接受采 ...
- prometheus statsd 监控
Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的.随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们 ...
- cAdvisor+Prometheus+Grafana监控docker
cAdvisor+Prometheus+Grafana监控docker 一.cAdvisor(需要监控的主机都要安装) 官方地址:https://github.com/google/cadvisor ...
- 从零开始搭建Prometheus自动监控报警系统
从零搭建Prometheus监控报警系统 什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开 ...
- 基于Docker+Prometheus+Grafana监控SpringBoot健康信息
在微服务体系当中,监控是必不可少的.当系统环境超过指定的阀值以后,需要提醒指定的运维人员或开发人员进行有效的防范,从而降低系统宕机的风险.在CNCF云计算平台中,Prometheus+Grafana是 ...
- [转帖]Prometheus+Grafana监控Kubernetes
原博客的位置: https://blog.csdn.net/shenhonglei1234/article/details/80503353 感谢原作者 这里记录一下自己试验过程中遇到的问题: . 自 ...
- Prometheus Operator 监控Kubernetes
Prometheus Operator 监控Kubernetes 1. Prometheus的基本架构 Prometheus是一个开源的完整监控解决方案,涵盖数据采集.查询.告警.展示整个监控流程 ...
- kubernetes(k8s) Prometheus+grafana监控告警安装部署
主机数据收集 主机数据的采集是集群监控的基础:外部模块收集各个主机采集到的数据分析就能对整个集群完成监控和告警等功能.一般主机数据采集和对外提供数据使用cAdvisor 和node-exporter等 ...
随机推荐
- Python图像处理丨图像腐蚀与图像膨胀
摘要:本篇文章主要讲解Python调用OpenCV实现图像腐蚀和图像膨胀的算法. 本文分享自华为云社区<[Python图像处理] 八.图像腐蚀与图像膨胀>,作者: eastmount . ...
- WCF全局捕获日志
/// <summary> /// WCF服务端异常处理器 /// </summary> public class WCF_ExceptionHandler : IErrorH ...
- 任何快速查询IP归属地
最近公司项目需要做一个IP归属地查询的功能,想着如果用现成的API就可以大大提高开发效率,所以在网上的API商店搜索了一番,发现了 APISpace,它里面的IP归属地API非常符合我的开发需求. ...
- 大事件回顾 | Eolink 5月重要动态速览!
在春天和夏天中间悄然而至的 5 月刚刚过去,及时求变,在呼啸而过的时代中保持竞争力的 Eolink 最近又有哪些大动作呢?下面我们梳理了5月以来 Eolink 的重要动态,给大家提供阅览. 01 ** ...
- 编程技巧│超实用 nginx 中常见的配置合集
目录 封禁 IP 仅开放内网 负载均衡 列出文件列表 路由转发 开启 gzip 压缩 解决跨域 资源防盗链 Keepalived 提高吞吐量 HTTP 强制跳转 HTTPS 封禁 IP 通过 deny ...
- led跑马灯多种方法(移位法,位拼接法,调用模块法,位移及位拼接语法,testbench的理解,源文件的存储路径,计数器的个数,调用模块的方式)
跟着教程写了几种方法,才发现自己写的虽然能实现,但比较繁琐.教程有三种方法: 1.移位法,每次左移一位,相比我自己写的,优点是不用把每一种情况都写出来.但是需要考虑左移到最后一位时需要自己再写个赋值语 ...
- LGV 引理
(其实是贺的:https://www.luogu.com.cn/paste/whl2joo4) 目录 LGV 引理 不相交路径计数 例题 Luogu6657. [模板]LGV 引理 CF348D Tu ...
- GreatSQL重磅特性,InnoDB并行并行查询优化测试
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1 ...
- 重构、插件化、性能提升 20 倍,Apache DolphinScheduler 2.0 alpha 发布亮点太多!
点击上方 蓝字关注我们 社区的小伙伴们,好消息!经过 100 多位社区贡献者近 10 个月的共同努力,我们很高兴地宣布 Apache DolphinScheduler 2.0 alpha 发布.这是 ...
- flutter系列之:flutter架构什么的,看完这篇文章就全懂了
目录 简介 Flutter的架构图 embedder engine Flutter framework Widgets Widgets的可扩展性 Widgets的状态管理 渲染和布局 总结 简介 Fl ...