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.pswp.cn/bicheng/77173.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77173.shtml
英文地址,請注明出處:http://en.pswp.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;每按一次單脈沖按鍵產生一次…