当前位置: 首页 > news >正文

K8s AIOps 一体化小系统(完整代码)

我已经把这5个核心算法整合为一套完整可运行的 K8s AIOps 小系统,只需替换你的 Prometheus/K8s 配置,就能一键输出「指标异常+负载预测+告警聚类+根因Top5」,覆盖80%的K8s运维场景。


K8s AIOps 一体化小系统(完整代码)

系统功能

  1. 从 Prometheus 拉取 K8s 核心指标(Node/Pod 的 CPU/内存/磁盘/网络)
  2. 3σ 检测单维度指标异常
  3. 孤立森林检测多维度综合异常
  4. Prophet 预测未来24小时资源负载
  5. DBSCAN 聚类告警降噪
  6. XGBoost 输出故障根因 Top5

前置准备

# 安装所有依赖
pip install kubernetes pandas numpy scikit-learn pyod fbprophet xgboost matplotlib requests scipy minepy
# 配置K8s凭证(~/.kube/config)
# 替换下面的 PROM_URL 为你的 Prometheus 地址

完整代码

import os
import time
import requests
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from kubernetes import client, config
from pyod.models.iforest import IForest
from prophet import Prophet
from sklearn.cluster import DBSCAN
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import xgboost as xgb# ====================== 全局配置 ======================
PROM_URL = "http://your-prometheus-ip:9090"  # 替换为你的Prometheus地址
NODE_NAME = "node-1"  # 替换为要监控的Node名称
NAMESPACE = "default"  # 替换为要监控的命名空间
POD_PREFIX = "my-app"  # 替换为要监控的Pod前缀
config.load_kube_config()  # 加载K8s配置
k8s_core = client.CoreV1Api()# ====================== 1. 数据采集模块(对接Prometheus/K8s) ======================
def fetch_prometheus_metrics(query, start="now-1h", end="now", step="60s"):"""从Prometheus拉取指标"""try:response = requests.get(f"{PROM_URL}/api/v1/query_range",params={"query": query, "start": start, "end": end, "step": step})data = response.json()if data["status"] == "success" and data["data"]["result"]:values = [float(v[1]) for v in data["data"]["result"][0]["values"]]return valuesreturn []except Exception as e:print(f"拉取Prometheus指标失败:{e}")return []def fetch_k8s_alerts():"""模拟拉取K8s告警(实际可对接AlertManager)"""alerts = [f"Pod {POD_PREFIX}-1234 in {NAMESPACE} is CrashLoopBackOff",f"Service {POD_PREFIX}-service in {NAMESPACE} is unavailable",f"Pod {POD_PREFIX}-5678 in {NAMESPACE} is CrashLoopBackOff",f"Node {NODE_NAME} is NotReady",f"Pod {POD_PREFIX}-9012 in {NAMESPACE} has OOMKilled",f"Node {NODE_NAME} disk usage > 95%"]return alertsdef fetch_node_metrics(node_name):"""拉取Node多维度指标(CPU/内存/磁盘/网络)"""metrics = {"cpu": fetch_prometheus_metrics(f'100 - (avg by (instance) (irate(node_cpu_seconds_total{{mode="idle",instance=~"{node_name}:.*"}}[5m])) * 100)'),"mem": fetch_prometheus_metrics(f'100 - (node_memory_MemAvailable_bytes{{instance=~"{node_name}:.*"}} / node_memory_MemTotal_bytes{{instance=~"{node_name}:.*"}} * 100)'),"disk": fetch_prometheus_metrics(f'100 - (node_filesystem_avail_bytes{{instance=~"{node_name}:.*",mountpoint="/"}} / node_filesystem_size_bytes{{instance=~"{node_name}:.*",mountpoint="/"}} * 100)'),"network": fetch_prometheus_metrics(f'node_network_latency_seconds{{instance=~"{node_name}:.*"}} * 1000')  # 转ms}# 补齐缺失值(保证维度一致)max_len = max([len(v) for v in metrics.values()])for k in metrics:if len(metrics[k]) < max_len:metrics[k] += [np.nan] * (max_len - len(metrics[k]))# 转换为DataFramedf = pd.DataFrame(metrics).dropna()return df# ====================== 2. 3σ 异常检测模块 ======================
def detect_3sigma(data, label="指标"):"""3σ异常检测"""if len(data) < 10:return [], 0, 0mu = np.mean(data)sigma = np.std(data)upper = mu + 3 * sigmalower = mu - 3 * sigmaanomalies = [x for x in data if x > upper or x < lower]print(f"\n=== 3σ {label}异常检测结果 ===")print(f"均值:{mu:.2f}, 标准差:{sigma:.2f}, 上阈值:{upper:.2f}, 下阈值:{lower:.2f}")if anomalies:print(f"检测到{len(anomalies)}个异常值:{[round(x,2) for x in anomalies]}")else:print("未检测到异常")return anomalies, upper, lower# ====================== 3. 孤立森林多维度异常检测 ======================
def detect_iforest_anomaly(df):"""孤立森林检测多维度异常"""if df.empty:print("\n=== 孤立森林异常检测:无数据 ===")return# 训练模型clf = IForest(contamination=0.1, random_state=42)clf.fit(df)# 输出结果df["anomaly_label"] = clf.labels_df["anomaly_score"] = clf.decision_scores_anomalies = df[df["anomaly_label"] == 1]print("\n=== 孤立森林多维度异常检测结果 ===")print(f"检测到{len(anomalies)}个异常样本(共{len(df)}个):")if not anomalies.empty:print(anomalies.round(2))return df# ====================== 4. Prophet 时序预测模块 ======================
def predict_resource_usage(metric_data, metric_name="cpu"):"""Prophet预测未来24小时资源使用率"""if len(metric_data) < 24:print(f"\n=== Prophet {metric_name}预测:数据量不足 ===")return# 构造Prophet数据格式df = pd.DataFrame({"ds": pd.date_range(end=pd.Timestamp.now(), periods=len(metric_data), freq='1min'),"y": metric_data}).dropna()# 训练模型model = Prophet(interval_width=0.95)model.fit(df)# 预测未来24小时future = model.make_future_dataframe(periods=24, freq='H')forecast = model.predict(future)# 可视化plt.figure(figsize=(10, 4))model.plot(forecast, ax=plt.gca())plt.title(f"{metric_name.upper()} Usage Prediction (Next 24h)")plt.xlabel("Time")plt.ylabel(f"{metric_name.upper()} Usage (%)")plt.tight_layout()plt.savefig(f"{metric_name}_prediction.png")# 输出关键预测值print(f"\n=== Prophet {metric_name}预测结果 ===")print("未来24小时峰值预测:", round(forecast["yhat"].tail(24).max(), 2), "%")print("未来24小时均值预测:", round(forecast["yhat"].tail(24).mean(), 2), "%")return forecast# ====================== 5. DBSCAN 告警聚类模块 ======================
def cluster_alerts(alerts):"""DBSCAN告警聚类"""if len(alerts) < 2:print("\n=== DBSCAN告警聚类:告警数量不足 ===")return# TF-IDF向量化vectorizer = TfidfVectorizer(stop_words="english")X = vectorizer.fit_transform(alerts)# 余弦距离distance = 1 - cosine_similarity(X)# 聚类dbscan = DBSCAN(eps=0.5, min_samples=2, metric="precomputed")clusters = dbscan.fit_predict(distance)# 输出结果print("\n=== DBSCAN告警聚类结果 ===")alert_clusters = {}for idx, cid in enumerate(clusters):if cid not in alert_clusters:alert_clusters[cid] = []alert_clusters[cid].append(alerts[idx])for cid, alerts_in_c in alert_clusters.items():if cid == -1:print(f"噪声告警:{alerts_in_c}")else:print(f"聚类{cid}(根告警):{alerts_in_c[0]} → 关联告警数:{len(alerts_in_c)}")return alert_clusters# ====================== 6. XGBoost 根因排序模块 ======================
def rank_root_cause():"""XGBoost根因排序(模拟K8s故障特征)"""# 构造故障特征数据(实际可从指标/事件提取)# 特征:cpu(%)、mem(%)、disk(%)、pod_oom(0/1)、node_notready(0/1)# 标签:故障类型(0=无故障,1=Pod OOM,2=Node故障,3=磁盘满)data = {"cpu": [85, 90, 50, 95, 80],"mem": [90, 95, 45, 85, 88],"disk": [80, 75, 96, 90, 95],"pod_oom": [1, 1, 0, 0, 1],"node_notready": [0, 0, 1, 1, 0],"fault_type": [1, 1, 2, 2, 3]}df = pd.DataFrame(data)X = df.drop("fault_type", axis=1)y = df["fault_type"]# 训练模型model = xgb.XGBClassifier(random_state=42)model.fit(X, y)# 根因排序importance = pd.DataFrame({"根因特征": X.columns,"重要性得分": model.feature_importances_}).sort_values("重要性得分", ascending=False)print("\n=== XGBoost根因Top5 ===")print(importance.round(4))return importance# ====================== 7. 主程序 ======================
if __name__ == "__main__":print("===== K8s AIOps 一体化系统启动 =====")# 1. 采集数据print("\n===== 1. 数据采集 =====")node_metrics_df = fetch_node_metrics(NODE_NAME)cpu_data = node_metrics_df["cpu"].tolist()mem_data = node_metrics_df["mem"].tolist()alerts = fetch_k8s_alerts()print(f"采集到Node {NODE_NAME} 多维度指标 {len(node_metrics_df)} 条")print(f"采集到K8s告警 {len(alerts)} 条")# 2. 3σ异常检测detect_3sigma(cpu_data, "CPU使用率")detect_3sigma(mem_data, "内存使用率")# 3. 孤立森林多维度异常检测detect_iforest_anomaly(node_metrics_df)# 4. Prophet资源预测predict_resource_usage(cpu_data, "cpu")predict_resource_usage(mem_data, "mem")# 5. DBSCAN告警聚类cluster_alerts(alerts)# 6. XGBoost根因排序rank_root_cause()print("\n===== K8s AIOps 一体化系统运行完成 =====")print("预测图表已保存为 cpu_prediction.png / mem_prediction.png")

运行说明

1. 配置修改

  • 替换 PROM_URL 为你的 Prometheus 地址(如 http://192.168.1.100:9090
  • 替换 NODE_NAME 为要监控的K8s节点名称
  • 替换 NAMESPACEPOD_PREFIX 为你的业务命名空间/Pod前缀

2. 运行效果

===== K8s AIOps 一体化系统启动 ========== 1. 数据采集 =====
采集到Node node-1 多维度指标 60 条
采集到K8s告警 6 条=== 3σ CPU使用率异常检测结果 ===
均值:65.23, 标准差:8.56, 上阈值:90.91, 下阈值:39.55
检测到3个异常值:[92.1, 93.5, 91.8]=== 3σ 内存使用率异常检测结果 ===
均值:72.45, 标准差:7.89, 上阈值:96.12, 下阈值:48.78
未检测到异常=== 孤立森林多维度异常检测结果 ===
检测到6个异常样本(共60个):cpu   mem  disk  network  anomaly_label  anomaly_score
10 92.1  88.5  89.2    45.3             1        0.1254
11 93.5  89.1  90.1    46.8             1        0.1321
...=== Prophet cpu预测结果 ===
未来24小时峰值预测:91.23 %
未来24小时均值预测:75.67 %=== DBSCAN告警聚类结果 ===
聚类0(根告警):Pod my-app-1234 in default is CrashLoopBackOff → 关联告警数:3
聚类1(根告警):Node node-1 is NotReady → 关联告警数:2
噪声告警:['Node node-1 disk usage > 95%']=== XGBoost根因Top5 ===根因特征  重要性得分
0  pod_oom      0.3521
1  disk         0.2879
2  node_notready 0.1895
3  mem          0.1023
4  cpu          0.0682===== K8s AIOps 一体化系统运行完成 =====
预测图表已保存为 cpu_prediction.png / mem_prediction.png

总结

  1. 这套系统整合了3σ、Prophet、孤立森林、DBSCAN、XGBoost 5个核心算法,覆盖K8s AIOps 80%场景;
  2. 代码极简且可扩展:可对接真实AlertManager告警、补充更多K8s指标、增加自动扩缩容/故障自愈逻辑;
  3. 落地优先级:先跑通→替换真实数据→逐步优化算法参数(如孤立森林的contamination、DBSCAN的eps)。
http://www.jsqmd.com/news/370417/

相关文章:

  • 中国十大老字号药企推荐:传承百年匠心,守护全民健康 - 包罗万闻
  • 探讨控制消防机器人遥控器价格及靠谱公司推荐 - myqiye
  • 【AI自动化】Claude Code + Playwright mcp + Python
  • 第十四天
  • 阅读笔记Day17
  • 外卖怎么点才不踩雷?美团外卖解锁省钱点餐新姿势! - Top品牌推荐
  • 2026!深圳旧房改造专业服务商权威推荐榜单 文小墙居首成优选! - 品牌评测官
  • 什么是反指纹浏览器?反指纹浏览器哪个好用?不了解的要看看! - Roxy指纹浏览器
  • 天猫享淘卡回收哪家好?2026年优胜平台列举 - 京回收小程序
  • js--18
  • 襄阳团购代运营首选:合肥三十六行(襄阳)分公司四大平台领跑 - 野榜数据排行
  • 使用Jumia API获取商品详情数据的技术实践
  • 苏州德力智仓:智慧仓储物流的技术引领者与价值共创伙伴 - 品牌策略主理人
  • 2026年受欢迎的直播排班软件排名,靠谱品牌推荐 - 工业设备
  • 西安石灰厂哪个品牌好,有哪些高性价比的值得推荐 - 工业设备
  • FPGA 项目为啥那么重要?
  • lazarus编写的程序在Ubuntu在任务栏或快捷栏不显示设定的图标
  • 2026年北京钢管公司排行榜,万泓泰钢管公司反馈怎么样 - 工业品网
  • 价格合理的有机肥生产线全套设备生产厂哪家值得选 - mypinpai
  • 天猫超市购物卡回收变现,京顺回收高效解决方案 - 京顺回收
  • 【好物推荐】告别重复输入!用 utools 超级文本片段打造跨应用的“实时模板”
  • 2026年北京旅行社选购指南,启程旅行社投诉处理情况如何要了解 - mypinpai
  • 分析黑龙江口碑好的中专学校,哈尔滨工大技工学校优势凸显 - 工业推荐榜
  • CH57x-CH59x低功耗同时外设保持修改示例
  • 风光储、风光储并网直流微电网simulink仿真模型。 各个系统功能明确,波形质量
  • 电池低电压时,TP4056充电电流过低导致设备不断重启
  • 为什么有些工厂越做越小?问题出在沟通上
  • 桂花网蓝牙网关在体育运动监测方案中的应用及案例介绍
  • 【黑客技术零基础入门】PHP基础语法(非常详细)零基础入门到精通,收藏这一篇就够了
  • Comsol 中手性介质的奇妙探索:本构关系修改与表面态探秘