惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyberwarzone
Cyberwarzone
V
Vulnerabilities – Threatpost
T
Tenable Blog
Forbes - Security
Forbes - Security
Simon Willison's Weblog
Simon Willison's Weblog
AWS News Blog
AWS News Blog
G
GRAHAM CLULEY
Know Your Adversary
Know Your Adversary
S
Securelist
C
Cybersecurity and Infrastructure Security Agency CISA
Project Zero
Project Zero
C
CXSECURITY Database RSS Feed - CXSecurity.com
V
Visual Studio Blog
WordPress大学
WordPress大学
Latest news
Latest news
K
Kaspersky official blog
T
Tailwind CSS Blog
T
Threat Research - Cisco Blogs
B
Blog RSS Feed
C
Cisco Blogs
博客园 - 聂微东
Martin Fowler
Martin Fowler
T
The Blog of Author Tim Ferriss
小众软件
小众软件
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
L
LINUX DO - 热门话题
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
P
Proofpoint News Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Privacy International News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
S
SegmentFault 最新的问题
Security Latest
Security Latest
Y
Y Combinator Blog
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
P
Privacy & Cybersecurity Law Blog
L
LINUX DO - 最新话题
月光博客
月光博客
The GitHub Blog
The GitHub Blog
博客园 - 三生石上(FineUI控件)
S
Security Affairs
P
Proofpoint News Feed
D
DataBreaches.Net
有赞技术团队
有赞技术团队
云风的 BLOG
云风的 BLOG

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19) 使用 Velero 备份 Kubernetes 集群 Kubernetes Cheat Sheet 开发 Tips(18) 如何构建一个 Java 工程 开发 Tips(17) KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses 基于 Kubernetes 和 Jenkins 搭建自动化测试系统 在 Kubernetes 上动态创建 Jenkins Slave 使用 Jenkins 进行服务拨测 开发 Tips(16) Kubernetes 签发 Ingress 证书及日常故障运维 Kubernetes 中 Deployment 的基本操作 Kubernetes 中的证书 如何使用 KubeBuilder 开发一个 Operator Kubernetes 1.6.0 安装问题汇总 镜像管理工具 -- Harbor 开发 Tips(15) Docker 如何拉取镜像 开发 Tips(14) 使用 Helm 安装 harbor 开发 Tips(13) 使用 S2I 构建云原生应用 在 Kubernetes 中使用 emptyDir、hostPath、localVolume 开发 Tips(12) 开发 Tips(11) 代码质量分析工具 SonarQube 使用 Kubeadm 安装 Kubernetes 集群 一起来学 Go --(4)常用函数 Kubernetes 中的 Ceph Kubernetes 之 Volumes Kubernetes 之 Labels、Selectors 开发 Tips(10) 开源正在重构商业模式 Kubernetes 之网络 Kubernetes 之 API 使用 Helm 和 Operator 快速部署 Prometheus Kubernetes 复杂有状态应用管理框架 -- Operator Kubernetes 的包管理器 -- Helm 一起来学 Go --(3)Go Modules 如何一步一步地优化博客方案 kubectl 实用指南 Kubernetes 中的基本概念 搭建远程 Kubernetes 开发环境 大公司和小公司的 ToB 思路 开发 Tips(9) Go 入门指南 一起来学 Go --(2)数据与逻辑结构 如何预防 Web 富文本中的 XSS 攻击 django-xss-cleaner 云工作时代 一起来学 Go --(1)背景与特点 SaaS 开发团队的不同阶段 你不知道的 Git 使用技巧 输出既服务 微服务设计 继续奔跑 开发 Tips(8) 从账户安全到二次验证 Django 性能之数据库查询优化 Django 性能之分库分表 敏捷开发之研发流程 打造一致性的团队 开发 Tips(7) Pytest 进阶学习之 Mock PaaS 部署之 buildpack Go 开发配置 领域输出才是 PaaS 的核心竞争力 Pytest 入门学习 开发 Tips(6) 如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程
你也可以这样落地 AI Agent - 运维事件篇
微信公众号 · 2026-01-14 · via 陈少文的网站

1. 为什么是运维事件

  • 更小的入侵性

Metrics、Log 维度的观测数据,运维团队通常都有所沉淀。运维事件可以是一个新的切入点,在不影响现有系统稳定性的情况下,引入新的运维能力。

  • 更适合自动化

Metrics 表征的是系统状态,Log 表征的是具体代码行为,而 Event 表征的是组件的变化。

而变化是稳定性最大的敌人,运维事件能够更好地捕捉到变化,触发自动化能力。

  • 更快的响应速度

Metrics 和 Log 的异常检测机制是定时查询,同时配置一定的阈值、持续时间的检测,告警的发出具有一定延时。

运维事件的异常检测机制是实时监听,watch 到事件之后,立即就能触发自动化能力。

  • 我能提供一点经验

最近两年我一直在探索 AI Agent 在运维领域的应用,已经有一些案例可以参考。我们每天有 100w+ 的运维事件产生,经过各种告警和全自动化处理流程,保障着数十个 AI 集群以及上面 AI 应用的稳定运行。

2. 安装事件组件

  • 安装 Nats
1
2
3
helm repo add nats https://nats-io.github.io/k8s/helm/charts/
helm repo update
helm show values nats/nats
  • 生成 nats-values.yaml
1
2
export adminpassword=mypassword
export apppassword=mypassword
  • 生成 nats-values.yaml

注意修改一下 storageClassName

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
cat <<EOF > nats-values.yaml
config:
  jetstream:
    enabled: true
    fileStore:
      enabled: false
      dir: /data
    memoryStore:
      enabled: true
      maxSize: 1Gi
    pvc:
      enabled: false
      storageClassName: my-sc
  cluster:
    enabled: true
  leafnodes:
    enabled: true
  merge:
    accounts:
      SYS:
        users:
          - user: admin
            password: ${adminpassword}
      APP:
        users:
          - user: app
            password: ${apppassword}
        jetstream: true
    system_account: SYS
container:
  image:
    repository: nats
    tag: 2.10.20-alpine
natsBox:
  container:
    image:
      repository: nats-box
      tag: 0.14.5
reloader:
  enabled: true
  image:
    repository: natsio/nats-server-config-reloader
    tag: 0.15.1
EOF

如果是多集群,可以参考 https://www.chenshaowen.com/ops/zh/nats.html 配置一个主 Nats 集群,其他集群通过 leafnodes 连接到主集群。

  • 安装 Ops
1
2
3
4
5
6
7
8
helm install myops ops/ops
            --version 1.2.0 \
            --namespace ops-system \
            --create-namespace \
            --set controller.env.activeNamespace="ops-system" \
            --set controller.env.defaultRuntimeImage="ubuntu:22.04" \
            --set event.cluster="mycluster" \
            --set event.endpoint="http://app:mypassword@nats-headless.ops-system.svc:4222"

https://github.com/shaowenchen/ops 项目通过 watch 的方式监听 Kubernetes 的全部事件,并将其转换为运维事件,存储到了外部的 Nats 集群。经过指标监控确认,Ops 项目不会对 kube-apiserver 或 etcd 产生性能影响。事件一旦被导出,存储到 Nats 之后,不会对 Kubernetes 产生额外的压力。

3. 事件的格式

3.1 命名空间级别事件格式

1
ops.clusters.{cluster}.namespaces.{namespace}.{resourceType}.{resourceName}.{observation}

其中:

  • {cluster}: 集群名称(从环境变量 EVENT_CLUSTER 获取)
  • {namespace}: Kubernetes 命名空间
  • {resourceType}: 资源类型(如 deployments, pods, configmaps 等)
  • {resourceName}: 资源名称
  • {observation}: 观测类型,可能的值及含义:
    • status: 资源状态信息(如运行状态、健康状态等)
    • events: 事件信息(如 Kubernetes 事件)
    • alerts: 告警信息
    • findings: 主动上报的信息和状态

3.2 节点事件格式

1
ops.clusters.{cluster}.nodes.{nodeName}.{observation}

其中:

  • {cluster}: 集群名称(从环境变量 EVENT_CLUSTER 获取)
  • {nodeName}: 节点名称
  • {observation}: 观测类型,可能的值及含义:
    • events: 事件信息(如 Kubernetes 事件)
    • alerts: 告警信息
    • findings: 主动上报的信息和状态

示例:

1
ops.clusters.mycluster.nodes.mynode.events

3.3 通知类的格式

这种事件数据并不是由 Ops 项目从 Kubernetes 中采集,而是用于收集其他系统的各种通知,转化为可被处理的运维事件。

通知事件主题格式:

1
ops.notifications.providers.{provider}.channels.{channel}.severities.{severity}
  • {provider}: 通知提供商或系统名称(如 ksyun, ai 等)
  • {channel}: 通知渠道类型(如 webhook, email, sms 等)
  • {severity}: 严重程度级别(如 info, warning, error, critical 等)

示例:

1
ops.notifications.providers.ksyun.channels.webhook.severities.critical

4. 事件的处理

4.1 直接触发通知

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
apiVersion: crd.chenshaowen.com/v1
kind: EventHooks
metadata:
  name: nodes-p0
  namespace: ops-system
spec:
  keywords:
    exclude:
    - cn-beijing
    include:
    - NodeNotReady
    - NodeReady
  subject: ops.clusters.*.nodes.*.events
  type: xiezuo
  url: https://x.x.x/api/v1/webhook/send?key=

当集群节点未就绪时,立即就会发出通知,这比 Metrics 告警快了分钟级别的时间。

4.2 触发自动化流程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: crd.chenshaowen.com/v1
kind: EventHooks
metadata:
  name: custom-disable
  namespace: ops-system
spec:
  additional: 'action: cordon-node'
  keywords:
    include:
    - "10005"
  subject: ops.clusters.*.nodes.*.events
  type: webhook
  url: http://x.x.x.x:x/trigger/action?key=

当检测到节点事件中包含 “10005” 时,就会触发自动化流程,执行 “cordon-node” 操作。

4.3 事件的转换

为了方便消费指定特征的事件,我们会将事件先转换为告警事件。异常处理模块,只需要监听告警事件即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
apiVersion: crd.chenshaowen.com/v1
kind: EventHooks
metadata:
  name: convert-clusters-pods-events-to-alerts
  namespace: ops-system
spec:
  keywords:
    include:
      - .*(BackOff|OOMKilled|Evicted|NetworkNotReady|Unhealthy|Error|Failed|ImagePullBackOff).*
    matchMode: ALL
    matchType: REGEX
  subject: ops.clusters.*.namespaces.*.pods.*.events
  type: event
  url: ops.clusters.*.namespaces.*.pods.*.alerts

当检测到 ops.clusters.mycluster.namespaces.mynamespace.pods.myapp.events 中包含 BackOff 时,就会创建一个内容相同的 ops.clusters.mycluster.namespaces.mynamespace.pods.myapp.alerts 事件。

4.4 事件的分析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
apiVersion: crd.chenshaowen.com/v1
kind: EventHooks
metadata:
  name: post-cluster-pod-ops-agent
  namespace: ops-system
spec:
  additional: clusterpodevents
  keywords:
    include:
    - .*(kube-apiserver-|kube-controller-manager-|kube-scheduler-|kube-proxy-|etcd-|calico-|csi-nfs-|fluid-system).*
    matchMode: ANY
    matchType: REGEX
  subject: ops.clusters.*.namespaces.*.pods.*.alerts
  type: webhook
  url: http://x.x.x.x:x/api/push

而你需要做的就是开发一个 /api/push 接口,接收运维事件,并进行分析和处理。

在我们的系统中,这接口已经汇聚了应用、节点、集群三个维度的运维事件,用于系统性的进行分析。

5. 怎么接入事件

5.1 告警事件的接入

https://github.com/shaowenchen/ops 项目中有一个 ops-server 服务,能够推送和消费运维事件。

1
http://myops-server.ops-system.svc:80/api/v1/namespaces/ops-system/events/ops.notifications.providers.aliyun.channels.webhook.severities.info
1
http://myops-server.ops-system.svc:80/api/v1/namespaces/ops-system/events/ops.notifications.providers.ksyun.channels.webhook.severities.info

这是两个云厂的事件存储 Topic,除此我还对接了内部的告警通知系统,逐步完善系统事件的观测能力。

5.2 taskrun 定时任务

https://github.com/shaowenchen/ops 项目支撑定时任务,可以配置 taskrun 来进行一些定制化的脚本检测,并上报为 findings 事件。

1
2
3
4
5
6
7
8
apiVersion: crd.chenshaowen.com/v1
kind: TaskRun
metadata:
  name: alert-hosts-card
  namespace: ops-system
spec:
  crontab: 30 * * * *
  taskRef: alert-hosts-card

ops.clusters.*.namespaces.*.hosts.*.findings 中,就会收到这些事件。

Ops 项目也提供了 web 页面,用于查看这些事件。

6. 总结

2025 年在 AI Agent 运维方向做了一系列的优化,停止迭代之前的 copilot 模式,引入 MCP 统一 Metrics、Log、Event、SOPS 的接入,告警数据的结构化,SOPS 直接触发,SLO 自动分析。

自动化层优化的基石就是运维事件,之前写过一篇 使用事件总线改造运维体系 阐述事件总线在运维体系的重要作用,本篇也算是对事件总线的一次真实落地。