K8S+Prometheus+Consul+alertWebhook实现全链路服务自动发现与监控、告警配置实战

系列文章目录

k8s服务注册到consul
prometheus监控标签


文章目录

  • 系列文章目录
  • 前言
  • 一、环境
  • 二、Prometheus部署
    • 1.下载
    • 2.部署
    • 3.验证
  • 三、kube-prometheus添加自定义监控项
    • 1.准备yaml文件
    • 2.创建新的secret并应用到prometheus
    • 3.将yaml文件应用到集群
    • 4.重启prometheus-k8s pod
    • 5.访问Prometheus-ui
  • 四、k8s中实践基于consul的服务发现
    • 1.示例nginx.yaml
    • 2.创建nginx pod
    • 3.检查Prometheus Targets中是否产生了对应的job_name
  • 五、告警链路启动
    • 1.修改alertmanager-secret.yaml文件
    • 2.启动alertWebhook pod
    • 3.测试能否收到告警
  • 总结


前言

在云原生技术蓬勃发展的今天,Kubernetes(K8S)已成为容器编排领域的事实标准,而监控作为保障系统稳定性和可观测性的核心环节,其重要性不言而喻。Prometheus 凭借其强大的时序数据采集能力和灵活的查询语言(PromQL),成为云原生监控体系的基石。然而,在动态变化的 K8S 环境中,传统静态配置的服务发现方式往往难以适应频繁的服务扩缩容和实例迁移。如何实现监控目标的自动化发现与动态管理,成为提升运维效率的关键挑战。

为此,服务发现技术应运而生。Consul 作为一款成熟的服务网格与分布式服务发现工具,能够实时感知 K8S 集群中服务的注册与健康状态,并与 Prometheus 无缝集成,为监控系统注入动态感知能力。这种组合不仅简化了配置复杂度,更让监控体系具备了“自愈”和“自适应”的云原生特性。

本文将以 实战为导向,深入剖析 K8S 环境下 Prometheus 与 Consul 的集成全流程、同时接入自研alertwebhook告警工具,涵盖以下核心内容:1、环境架构解析:从零搭建 K8S 集群,部署 Prometheus 与 Consul 的标准化方案;2、动态服务发现:通过 Consul 自动注册服务实例,实现 Prometheus 抓取目标的动态感知;3、配置优化实践:揭秘 Relabel 规则、抓取策略与告警规则的进阶调优技巧;4、故障排查指南:针对服务发现失效、指标抓取异常等场景,提供高效排查思路。5、告警通道配置:实现钉钉、邮箱、企业微信三个告警通知渠道。

整体架构图如下所示
在这里插入图片描述

一、环境

一套最小配置的k8s1.28集群
pod自动注册到consul <具体可看顶部文章>
在这里插入图片描述

二、Prometheus部署

1.下载

代码如下(示例):

[root@k8s-master ~]# git clone https://github.com/prometheus-operator/kube-prometheus.git
[root@k8s-master ~]# cd kube-prometheus

2.部署

[root@k8s-master ~]# kubectl apply --server-side -f manifests/setup
[root@k8s-master ~]# until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done
[root@k8s-master ~]# kubectl apply -f manifests/

3.验证

部署成功后,结果如下(如果部署失败,可手动想办法更换镜像地址
在这里插入图片描述

三、kube-prometheus添加自定义监控项

1.准备yaml文件

代码如下(示例):

[root@k8s-master prometheus]# cat prometheus-additional.yaml - job_name: 'consul-k8s' #自定义scrape_interval: 10sconsul_sd_configs:- server: 'consul-server.middleware.svc.cluster.local:8500' #consul节点的ip和svc暴露出的端口token: "9bfbe81f-2648-4673-af14-d13e0a170050" #consul的acl tokenrelabel_configs:# 1. 保留包含 "container" 标签的服务- source_labels: [__meta_consul_tags]regex: .*container.*action: keep# 2. 设置抓取地址为服务的 ip:port- source_labels: [__meta_consul_service_address]target_label: __address__replacement: "$1:9113" #9113是nginx-exporter的端口,如果有修改自行替换# 3. 其他标签映射(具体的consul标签根据自己的实际环境替换,如果你使用的是顶部文章中的consul注册工具,可以不用修改)#具体可看顶部文章prometheus监控标签进行学习理解- source_labels: [__meta_consul_service_address]target_label: ip- source_labels: [__meta_consul_service_metadata_podPort]target_label: port- source_labels: [__meta_consul_service_metadata_project]target_label: project- source_labels: [__meta_consul_service_metadata_monitorType]target_label: monitorType- source_labels: [__meta_consul_service_metadata_hostNode]target_label: hostNode

2.创建新的secret并应用到prometheus

# 创建secret
[root@k8s-master prometheus]# kubectl create secret generic additional-scrape-configs -n monitoring --from-file=prometheus-additional.yaml --dry-run=client -o yaml > ./additional-scrape-configs.yaml# 应用到prometheus
[root@k8s-master prometheus]# kubectl apply -f additional-scrape-configs.yaml -n monitoring[root@k8s-master prometheus]# kubectl get secrets -n monitoring 
NAME                           TYPE     DATA   AGE
additional-scrape-configs      Opaque   1      3h18m

3.将yaml文件应用到集群

添加以下配置到文件中

[root@k8s-master prometheus]# vim manifests/prometheus-prometheus.yaml
......additionalScrapeConfigs:name: additional-scrape-configs #必须跟上述secret名称一致key: prometheus-additional.yaml.......#应用变更到K8S生效
[root@k8s-master prometheus]# kubectl apply -f manifests/prometheus-prometheus.yaml -n monitoring

在这里插入图片描述

4.重启prometheus-k8s pod

[root@k8s-master prometheus]# kubectl rollout restart -n monitoring statefulset prometheus-k8s

5.访问Prometheus-ui

查看prometheus的target列表即可,或者prometheus–> Status–>Configuration 中可以搜到job_name为canal的配置信息
在这里插入图片描述

四、k8s中实践基于consul的服务发现

准备一个nginx.yaml,结合consul的自动注册镜像,将其注册到consul,然后结合所配置的consul服务发现进行pod监控
在这里插入图片描述

1.示例nginx.yaml

通过配置nginx自带的stub_status模块和nginx-exporter暴露的9113端口,实现对nginx进行监控,使其Prometheus能从http://pod Ip:9113/metrics获取到监控数据

[root@k8s-master consul]# cat nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:labels:run: nginxname: nginxnamespace: middleware
spec:replicas: 1selector:matchLabels:run: nginxstrategy:rollingUpdate:maxSurge: 1maxUnavailable: 0type: RollingUpdatetemplate:metadata:labels:run: nginxspec:tolerations:- key: "node-role.kubernetes.io/control-plane"operator: "Exists"effect: "NoSchedule"initContainers:- name: service-registrarimage: harbor.jdicity.local/registry/pod_registry:v14env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIP- name: CONSUL_IPvalueFrom:configMapKeyRef:name: global-configkey: CONSUL_IP- name: ACL_TOKENvalueFrom:secretKeyRef:name: acl-tokenkey: ACL_TOKEN- name: NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeNamevolumeMounts:- mountPath: /shared-bin  # 共享卷挂载到 initContainername: shared-bincommand: ["sh", "-c"]args:- |cp /usr/local/bin/consulctl /shared-bin/ &&/usr/local/bin/consulctl register \"$CONSUL_IP" \"$ACL_TOKEN" \"80" \"容器监控" \"k8s"containers:- image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:stableenv:- name: CONSUL_IP  # 必须显式声明valueFrom:configMapKeyRef:name: global-configkey: CONSUL_IP- name: ACL_TOKEN  # 必须显式声明valueFrom:secretKeyRef:name: acl-tokenkey: ACL_TOKEN- name: CONSUL_NODE_NAMEvalue: "consul-0"- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.namelifecycle:preStop:exec:command: ["sh", "-c", "/usr/local/bin/consulctl deregister $CONSUL_IP $ACL_TOKEN 80 $CONSUL_NODE_NAME"]imagePullPolicy: IfNotPresentname: nginxvolumeMounts:- mountPath: /usr/local/bin/consulctl  # 挂载到 minio 容器的 PATH 目录name: shared-binsubPath: consulctl- name: nginx-configmountPath: /etc/nginx/nginx.confsubPath: nginx.conflivenessProbe:httpGet:path: /port: 80initialDelaySeconds: 3periodSeconds: 3ports:- containerPort: 80- name: nginx-exporter  # 容器名称image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx/nginx-prometheus-exporter:1.3.0args:- "--nginx.scrape-uri=http://localhost:80/stub_status"  # ? 使用新参数格式ports:- containerPort: 9113restartPolicy: AlwaysterminationGracePeriodSeconds: 30volumes:- name: shared-bin  # 共享卷emptyDir: {}- name: nginx-configconfigMap:name: nginx-config

configmap文件

[root@k8s-master consul]# cat nginx-config.yaml 
# nginx-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-confignamespace: middleware
data:nginx.conf: |user  nginx;worker_processes  auto;error_log  /var/log/nginx/error.log notice;pid        /var/run/nginx.pid;events {worker_connections  1024;}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;server {listen 80;location /stub_status {stub_status;allow 127.0.0.1;deny all;}location / {root   /usr/share/nginx/html;index  index.html index.htm;}}}

2.创建nginx pod

[root@k8s-master consul]# kubectl apply -f nginx-config.yaml 
[root@k8s-master consul]# kubectl apply -f nginx.yaml 

等待pod初始化容器启动后,会将其注册到consul,然后Prometheus通过配置的consul服务发现进行pod监控

3.检查Prometheus Targets中是否产生了对应的job_name

在这里插入图片描述
至此,Prometheus已能成功采集到对应的监控指标数据

五、告警链路启动

alertwebhook源码地址: https://gitee.com/wd_ops/alertmanager-webhook_v2
包含了源码、镜像构建、启动alertwebhook的yaml文件、告警实现架构图,再此不过多描述
在这里插入图片描述

1.修改alertmanager-secret.yaml文件

自己写的alertWebHook工具,实现了基于邮件、钉钉、企业微信三种方式的告警发送渠道

[root@k8s-master manifests]# cat alertmanager-secret.yaml 
apiVersion: v1
kind: Secret
metadata:name: alertmanager-mainnamespace: monitoring
stringData:alertmanager.yaml: |-global:resolve_timeout: 5mroute:group_by: ['alertname']group_interval: 10sgroup_wait: 10sreceiver: 'webhook'repeat_interval: 5mreceivers:- name: 'webhook'webhook_configs:- "url": "http://alertmanager-webhook.monitoring.svc.cluster.local:19093/api/v1/wechat"- "url": "http://alertmanager-webhook.monitoring.svc.cluster.local:19093/api/v1/email"- "url": "http://alertmanager-webhook.monitoring.svc.cluster.local:19093/api/v1/dingding"
type: Opaque[root@k8s-master manifests]# kubectl apply -f alertmanager-secret.yaml

2.启动alertWebhook pod

关于下方的邮件、钉钉、企业微信的key、secret等密钥自行百度官网文档获取,不过多描述

[root@k8s-master YamlTest]# cat alertWebhook.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: alertmanager-webhooknamespace: monitoring  # 建议根据实际需求选择命名空间labels:app: alertmanager-webhook
spec:replicas: 1selector:matchLabels:app: alertmanager-webhooktemplate:metadata:labels:app: alertmanager-webhookspec:containers:- name: webhookimage: harbor.jdicity.local/registry/alertmanager-webhook:v4.0imagePullPolicy: IfNotPresentports:- containerPort: 19093protocol: TCPresources:requests:memory: "256Mi"cpu: "50m"limits:memory: "512Mi"cpu: "100m"volumeMounts:- name: logsmountPath: /export/alertmanagerWebhook/logs- name: configmountPath: /export/alertmanagerWebhook/settings.yamlsubPath: settings.yamlvolumes:- name: logsemptyDir: {}- name: configconfigMap:name: alertmanager-webhook-config---
# 配置文件通过ConfigMap管理(推荐)
apiVersion: v1
kind: ConfigMap
metadata:name: alertmanager-webhook-confignamespace: monitoring
data:settings.yaml: |DingDing:enabled: falsedingdingKey: "9zzzzc39"signSecret: "SEzzzff859a7b"chatId: "chat3zz737e49beb9"atMobiles: - "14778987659"- "17657896784"QyWeChat:enabled: trueqywechatKey: "4249406zz305"corpID: "ww4zzz7b"corpSecret: "mM23zOozwEZM"atMobiles: - "14778987659"Email:enabled: truesmtp_host: "smtp.163.com"smtp_port: 25smtp_from: "rzzxd@163.com"smtp_password: "UzzH"smtp_to: "1zz030@qq.com"Redis:redisServer: "redis-master.redis.svc.cluster.local"mode: "master-slave"          # single/master-slave/clusterredisPort: "6379"            # 主节点端口redisPassword: "G0LzzW"requirePassword: true# 主从模式配置slaveNodes:- "redis-slave.redis.svc.cluster.local:6379"# 集群模式配置clusterNodes:- "192.168.75.128:7001"- "192.168.75.128:7002"- "192.168.75.128:7003"System:projectName: "测试项目"prometheus_addr: "prometheus-k8s.monitoring.svc.cluster.local:9090"host: 0.0.0.0port: 19093env: releaselogFileDir: /export/alertmanagerWebhook/logs/logFilePath: alertmanager-webhook.loglogMaxSize: 100logMaxBackup: 5logMaxDay: 30
---
# 新增 Service 配置
apiVersion: v1
kind: Service
metadata:name: alertmanager-webhooknamespace: monitoringlabels:app: alertmanager-webhook
spec:type: ClusterIP  # 默认类型,集群内访问selector:app: alertmanager-webhook  # 必须与 Deployment 的 Pod 标签匹配ports:- name: httpport: 19093      # Service 暴露的端口targetPort: 19093  # 对应容器的 containerPortprotocol: TCP

3.测试能否收到告警

当前k8s集群存在告警,看是否能收到告警通知
在这里插入图片描述
启动alertWebhook

[root@k8s-master YamlTest]# kubectl apply -f alertWebhook.yaml 
deployment.apps/alertmanager-webhook created
configmap/alertmanager-webhook-config created
service/alertmanager-webhook created

邮件部分日志示例
在这里插入图片描述

钉钉
在这里插入图片描述

企业微信
在这里插入图片描述
邮箱
在这里插入图片描述

该处使用的url网络请求的数据。


总结

至此一套完整的开源的监控注册、监控告警方案成功落地完成!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLO11的车牌识别分析系统

【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】系统数据统计与可视化分析支持 【技术栈】 ①&#xff1a;系统环境&#xff1a;Windows/macOS/Linux ②&#xff1a;开发环境&#xff1a;Python 3.8 ③&#xff1a;技术栈&#x…

每天记录一道Java面试题---day39

GC如何判断对象可以被回收了 回答重点 引用计数法&#xff1a; - 每个对象由一个引用计数属性&#xff0c;新增一个引用时计数器加1&#xff0c;引用释放时计数减1&#xff0c;计数为0时可以回收。可达性分析法&#xff1a; - 从GC Roots开始向下搜索&#xff0c;搜索所走过的…

机器学习(5)——支持向量机

1. 支持向量机&#xff08;SVM&#xff09;是什么&#xff1f; 支持向量机&#xff08;SVM&#xff0c;Support Vector Machine&#xff09;是一种监督学习算法&#xff0c;广泛应用于分类和回归问题&#xff0c;尤其适用于高维数据的分类。其核心思想是寻找最优分类超平面&am…

从零到一:网站设计新手如何快速上手?

从零到一&#xff1a;网站设计新手如何快速上手&#xff1f; 在当今数字化时代&#xff0c;网站已成为企业、个人展示信息、提供服务的重要窗口。对于想要涉足网站设计领域的新手而言&#xff0c;如何快速上手并掌握必要的技能成为首要任务。本文将从基础知识、软件工具、设计…

蓝桥杯2024国B数星星

小明正在一棵树上数星星&#xff0c;这棵树有 n 个结点 1,2,⋯,n。他定义树上的一个子图 G 是一颗星星&#xff0c;当且仅当 G 同时满足&#xff1a; G 是一棵树。G 中存在某个结点&#xff0c;其度数为 ∣VG​∣−1。其中 ∣VG​∣ 表示这个子图含有的结点数。 两颗星星不相…

Django从零搭建卖家中心登陆与注册实战

在电商系统开发中&#xff0c;卖家中心是一个重要的组成部分&#xff0c;而用户注册与登陆则是卖家中心的第一步。本文将详细介绍如何使用Django框架从零开始搭建一个功能完善的卖家注册页面&#xff0c;包括前端界面设计和后端逻辑实现。 一、项目概述 我们将创建一个名为sel…

Opencv使用cuda实现图像处理

main.py import os import cv2 print(fOpenCV: {cv2.__version__} for python installed and working) image cv2.imread(bus.jpg) if image is None:print("无法加载图像1") print(cv2.cuda.getCudaEnabledDeviceCount()) cv2.cuda.setDevice(0) cv2.cuda.printCu…

如何编制实施项目管理章程

本文档概述了一个项目管理系统的实施计划,旨在通过统一的业务规范和技术架构,加强集团公司的业务管控,并规范业务管理。系统建设将遵循集团统一模板,确保各单位项目系统建设的标准化和一致性。 实施范围涵盖投资管理、立项管理、设计管理、进度管理等多个方面,支持项目全生…

B端可视化方案,如何助力企业精准决策,抢占市场先机

在当今竞争激烈的商业环境中&#xff0c;企业需要快速、准确地做出决策以抢占市场先机。B端可视化方案通过将复杂的企业数据转化为直观的图表和仪表盘&#xff0c;帮助企业管理层和业务人员快速理解数据背后的业务逻辑&#xff0c;从而做出精准决策。本文将深入探讨B端可视化方…

基于FPGA的一维时间序列idct变换verilog实现,包含testbench和matlab辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 DCT离散余弦变换 4.2 IDCT逆离散余弦变换 4.3 树结构实现1024点IDCT的原理 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) matlab仿真结果 FPGA仿真结果 由于FP…

Android基础教程 - 学习完成记录

视频学习教程 视频链接&#xff1a;2022 最新 Android 基础教程&#xff0c;从开发入门到项目实战&#xff0c;看它就够了&#xff0c;更新中_哔哩哔哩_bilibili 学习下来&#xff0c;有遇到很多问题&#xff0c;在 chatgpt、claude 和 Android Studio 插件通义千问的帮助下&…

Web开发-JavaEE应用原生和FastJson反序列化URLDNS链JDBC链Gadget手搓

知识点&#xff1a; 1、安全开发-JavaEE-原生序列化-URLDNS链分析 2、安全开发-JavaEE-FastJson-JdbcRowSetImpl链分析 利用链也叫"gadget chains"&#xff0c;我们通常称为gadget&#xff1a; 1、共同条件&#xff1a;实现Serializable或者Externalizable接口&…

OpenCV操作函数

1、cv2.imread&#xff08;&#xff09; 2、 cv2.imshow&#xff08;&#xff09; 3、 cv2.waitKey&#xff08;&#xff09; 4、cv2.imwrite&#xff08;&#xff09; 5、cv2.selectROI&#xff08;&#xff09; 6、 cv2.VideoCapture() 7、cv2.cvtColor&#xff08;&#xff…

AI编程新纪元:GitHub Copilot、CodeGeeX与VS2022的联合开发实践

引言:AI编程时代的到来 在软件开发领域,我们正站在一个历史性的转折点上。GitHub Copilot、CodeGeeX等AI编程助手的出现,结合Visual Studio 2022的强大功能,正在重塑代码编写的本质。这不仅是工具层面的革新,更是开发范式的根本转变。能够有效利用这些AI工具的开发者将跨…

[特殊字符] MySQL MCP 开发实战:打造智能数据库操作助手

&#x1f4a1; 简介&#xff1a;本文详细介绍如何利用MCP&#xff08;Model-Control-Panel&#xff09;框架开发MySQL数据库操作工具&#xff0c;使AI助手能够直接执行数据库操作。 &#x1f4da; 目录 引言MCP框架简介项目架构设计开发环境搭建核心代码实现错误处理策略运行和…

Dify部署过程中的错误和解决方案汇总

本文仅限于记录Dify部署及使用过程中的BUG和解决方案 1. Dify配置SearXNG时报错&#xff1a; 报错内容&#xff1a; PluginInvokeError: {"args":{},"error_type":"ToolProviderCredentialValidationError","message":"Error 4…

C#中async await异步关键字用法和异步的底层原理

目录 C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结 C#异步编程 一、异步编程基础 异步编程是啥玩意儿 就是让程序在干等着某些耗时操作&#xff08;比如等网络响应、读写文件啥的&#xff09;的时候&#xff0c;能把线程腾出来…

安全教育知识竞赛答题小程序怎么做

以下是制作安全教育知识竞赛答题小程序的一般步骤&#xff1a; 一、准备阶段 注册小程序账号&#xff1a;前往微信公众平台&#xff0c;注册一个小程序账号&#xff0c;主体类型可根据实际情况选择个人或企业等&#xff0c;注册成功后登录获取appid。 下载安装开发工具&#x…

记录待办事项的便签软件有没有推荐的?

在快节奏的现代生活中&#xff0c;我们每天都要处理大量的工作任务和生活琐事&#xff0c;稍有不慎就可能遗漏重要事项。你是否经常遇到这样的情况&#xff1a;明明记得有件事要做&#xff0c;却怎么也想不起来是什么&#xff1b;或者手头同时有好几项任务&#xff0c;却不知道…

实验四 中断实验

一、实验目的 掌握中断服务程序的编写。 二、实验电路 三、实验内容 1&#xff0e;实验用PC机内部的中断控制器8259A&#xff0c;中断源用TPC-ZK实验箱上的单脉冲电路&#xff0c;将单脉冲电路的输出接中断请求信号IRQ&#xff0c;每按一次单脉冲按键产生一次…