vellankikoti/mcp-bengaluru-demo

GitHub: vellankikoti/mcp-bengaluru-demo

一个面向 Kubernetes 故障响应的 AI Agent 演示平台,核心展示如何在赋予 LLM 自主诊断和修复集群问题能力的同时,通过策略引擎、人工审批和审计轨迹约束其行为边界。

Stars: 0 | Forks: 0

# 死去的 Runbook、危险的 Agent 与拯救我们的安全模型 ## 这是什么 一个生产级别的演示,展示了 AI Agent 如何诊断和修复 Kubernetes 事故——以及为什么赋予它**不受限制的工具访问权限是危险的**。本次演讲包含三幕: 1. **死去的 Runbook** —— 真实的 OOMKill 连锁反应,Runbook 无法处理 2. **危险的 Agent** —— 跳过策略层会发生什么(实时凭据暴露) 3. **安全模型** —— OPA 风格的策略网关、人工审批、范围受限的 token、防篡改审计 该 Agent 使用 FastAPI 构建,通过 SSE 流式传输响应,并完全在本地运行 —— 不需要云基础设施。 ## 架构 ``` Browser UI (SSE stream) │ ▼ FastAPI Agent Server ──► Any LLM (Anthropic / OpenAI / OpenRouter / Groq / Google) │ ├── Policy Engine (OPA-style: ALLOW / DENY / REQUIRE_APPROVAL) │ └── Human Approval Gate (asyncio.Event + 300s timeout) │ ├── MCP Tools ──► Kubernetes API (list_pods, describe_pod, restart_deployment …) │ ──► Prometheus (metrics queries) │ ──► Alertmanager (firing alerts) │ └── draft_postmortem (local generation) │ └── Audit Ledger (append-only, in-memory, shown in UI) ``` **演示集群中的服务:** | 服务 | 角色 | 故障模式 | |---|---|---| | `payment-service` | 支付处理 | `oom`, `error`, `slow`, `error_rate` | | `order-service` | 订单管理 | 依赖于 payment-service | | `notification-service` | 异步通知 | `aggressive_retry` | | `email-gateway` | 邮件发送 (限流) | — | | `auth-service` | 身份验证 | `cert_expiry` | | `traffic-gen` | 合成负载 (常开) | — | ## 前置条件 | 工具 | 版本 | 安装 | |---|---|---| | Docker | running | [docker.com](https://docker.com) | | kind | ≥ 0.23 | `brew install kind` | | kubectl | ≥ 1.29 | `brew install kubectl` | | helm | ≥ 3.14 | `brew install helm` | | Python | ≥ 3.11 | `brew install python@3.11` | 来自以下之一的 API 密钥:**Anthropic**、OpenAI、OpenRouter、Groq 或 Google AI。 ## 快速开始 ``` # 引导 kind 集群 + observability stack(首次约 5 分钟) make up # 验证一切是否健康 make smoke # 安装 Python 依赖 pip install -r agent/requirements.txt # (可选)为默认 Anthropic provider 添加 Anthropic 密钥 echo 'ANTHROPIC_API_KEY=sk-ant-...' > agent/.env # 启动 agent(自动启动 port-forwards) make agent ``` 在浏览器中打开 **http://localhost:8082**。 ## API 密钥配置 Agent 支持多个 AI 提供商。选择以下**任一**方式: ### 选项 A — Anthropic (通过 .env 文件) ``` echo 'ANTHROPIC_API_KEY=sk-ant-...' > agent/.env make agent ``` 启动时将自动加载密钥。 ### 选项 B — 任意提供商 (通过浏览器 UI) 无需密钥即可启动 Agent,然后打开 **http://localhost:8082** 并点击侧边栏中的提供商选项: 1. 点击 **OpenRouter** (或 Anthropic / OpenAI / Groq / Google AI) 2. 粘贴您的 API 密钥 3. 选择一个模型芯片 4. 点击 **Save & Test** **推荐用于会议演示:** 使用 **OpenRouter** 及其模型 **`anthropic/claude-3.5-haiku`** —— 已经过端到端测试,会在单轮对话中调用 `restart_deployment`,成本比 Sonnet 低约 10 倍。 | 提供商 | 密钥前缀 | 测试模型 | 备注 | |---|---|---|---| | Anthropic | `sk-ant-` | `claude-sonnet-4-6` | 最适合 Anthropic 原生 | | OpenRouter | `sk-or-` | `anthropic/claude-3.5-haiku` | **推荐用于演示** | | OpenAI | `sk-` | `gpt-4o` | 可用;gpt-4o-mini 会跳过写入工具 | | Groq | `gsk_` | `llama-3.3-70b-versatile` | 超快,更便宜 | | Google AI | `AIza` | `gemini-2.0-flash` | — | ## 运行演示 ### 第一幕 —— OOM 连锁反应 ``` make inject-oom # payment-service OOMKills in ~30s ``` 在 Agent UI 中输入: Agent 将会(在单轮对话中): 1. 检查警报 → 看到 `PaymentServiceCrashLooping` 2. 列出 Pod → 看到 `CrashLoopBackOff` 3. 描述 Pod → 确认 `OOMKilled` 退出码 137 4. 读取日志 → 看到内存分配逼近限制 5. 查询 Prometheus → 量化错误率 6. 调用 `restart_deployment` → **审批卡片出现在 UI 中** 7. 您点击 **Approve** → 生成范围受限的 token → 在真实集群中触发重启 8. Agent 调用 `draft_postmortem` 并生成结构化的事故报告 ``` make recover # reset all faults after the demo ``` ### 第二幕 —— 危险的 Agent 在侧边栏中切换 **Policy Gates: OFF**(或按 `F4`),然后提问: 当策略被禁用时,`list_secrets` 运行时将没有网关限制 —— 脉动的红色 DANGER MODE 边框会激活,该工具展示了过度授权的 Agent 会是什么样子。 将策略切换回 **ON** 并尝试相同的请求 —— 您会看到一条明确的 `DENY` 以及触发的规则 `k8s.read.secrets`。 ### 第三幕 —— 恢复 + 复盘 在批准重启后,Agent 会在 rollout 仍在进行时自动调用 `draft_postmortem`,并生成一份结构化的、可用于 Wiki 的复盘报告。 ## 其他故障场景 ``` make inject-retry # notification-service retry storm → email-gateway 429s make inject-cascade # ALL incidents at once (full conference mode) make inject-cert # auth-service cert expiry warning make inject-hpa # stuck HPA on order-service (pods Pending) make inject-bad-rollout # bad payment-service rollout (50% errors) make inject-dns # CoreDNS upstream failure (all service discovery broken) make recover # reset all faults make emergency-reset # nuclear reset in 30s ``` ## 回放模式 (离线 / 排练) 预先录制的 SSE 流,无需实时集群或 API 密钥即可回放完整演示。对于隔离网络环境和排练至关重要。 **通过 URL:** ``` http://localhost:8082/?replay=cascade&mode=presentation http://localhost:8082/?replay=dangerous-agent&mode=presentation ``` **通过键盘 (在浏览器中):** - `F5` —— 连锁 OOM 回放 - `F6` —— 危险 Agent 回放 (自动启用危险模式) **通过 UI:** 点击顶部栏的 **Demo** 下拉菜单 → 选择一个回放场景。 速度控制:在排练时附加 `&speed=2` 以 2 倍速播放。 ## 键盘快捷键 | 按键 | 动作 | |-----|--------| | `F2` | 切换演示模式 (暗色主题,大字体) | | `F3` | 切换服务拓扑图 | | `F4` | 切换安全策略 ON / OFF | | `F5` | 运行连锁 OOM 回放 | | `F6` | 运行危险 Agent 回放 | | `F7` | 清空聊天 | ## 演示模式 为舞台演示激活 —— 暗色主题、1.4 倍字体缩放、高对比度颜色: ``` http://localhost:8082/?mode=presentation ``` 或在浏览器中按 `F2`。 ## 端口参考 | 服务 | 端口 | 备注 | |---|---|---| | Agent UI | 8082 | `make agent` | | Prometheus | 9092 | kind-mcp-demo (由 `make agent` 自动端口转发) | | Alertmanager | 9093 | kind-mcp-demo (自动端口转发) | | Grafana | 3002 | kind-mcp-demo,登录凭证: `admin` / `admin` | ## 策略引擎 每个工具调用在执行前都会由 `agent/policy.py` 进行评估: | 工具 | 决策 | 规则 | |---|---|---| | `list_pods`, `get_pod_logs`, `describe_pod` | ALLOW | `k8s.read.pods` | | `prometheus_query`, `prometheus_range`, `get_alerts` | ALLOW | `observability.*` | | `get_events`, `get_deployments`, `get_node_status`, `get_hpa_status` | ALLOW | `k8s.read.*` | | `draft_postmortem` | ALLOW | `docs.postmortem.write` | | `list_secrets` | **DENY** | `k8s.read.secrets` | | `restart_deployment` | REQUIRE_APPROVAL | `k8s.write.deployments` | | `scale_deployment` | REQUIRE_APPROVAL | `k8s.write.deployments` | 当 **Policy Gates: OFF** (危险模式) 时,所有工具都会返回 ALLOW —— 这就是“危险 Agent”的演示状态。 审批网关超时:**300 秒** (5 分钟) —— 为现场观众问答留有充足时间。 ## 项目结构 ``` . ├── agent/ # FastAPI agent server │ ├── server.py # SSE streaming, approval gate, audit log │ ├── tools.py # Kubernetes + Prometheus + postmortem tools │ ├── policy.py # OPA-style policy engine │ ├── requirements.txt # Python dependencies │ ├── frontend/index.html # Single-file UI (no build step) │ ├── demo-recordings/ # Pre-recorded SSE streams for replay mode │ │ ├── cascade.jsonl # OOM cascade scenario (42 events) │ │ └── dangerous-agent.jsonl │ └── start.sh # Start script (auto port-forwards) ├── services/ # Microservice source code (Python FastAPI) │ ├── payment-service/ │ ├── order-service/ │ ├── notification-service/ │ ├── email-gateway/ │ ├── auth-service/ │ └── traffic-gen/ ├── cluster/ # kind cluster config + RBAC manifests ├── observability/ # Prometheus rules + Alertmanager config ├── demo/ # Bootstrap, inject, recovery scripts │ ├── bootstrap.sh │ ├── inject-incident.sh │ ├── smoke-test.sh │ └── setup-tmux.sh └── Makefile ``` ## 故障排除 **"Frontend not found"** 请始终使用 `make agent`,它会从正确的目录运行 `agent/start.sh`。 **端口转发在会话间失效** `make agent` 在启动时会自动重启它们。如果它们在演示过程中失效,请在新的终端中运行 `make agent`。 **"No API key configured"** 创建 `agent/.env` 并加入 `ANTHROPIC_API_KEY=sk-ant-...`,或者在浏览器 UI 侧边栏的提供商选项下输入密钥。 **OpenRouter 密钥无效** 在浏览器 UI 中输入 —— 选择 OpenRouter 提供商选项后,将其粘贴到 **API Key** 字段中。`.env` 文件仅用于读取 `ANTHROPIC_API_KEY`。 **`make smoke` 在 payment-service 上失败** 如果您运行了 `make inject-oom`,这是预期行为。请先运行 `make recover`。 **端口 9090 与 Docker Desktop 冲突** Docker Desktop 将端口 9090 用于其自带的 Prometheus。此演示使用 **9092** 作为 kind-mcp-demo 的 Prometheus。`make agent` 会自动处理此问题。 **Agent 能诊断但没有调用 `restart_deployment`** 通过 OpenRouter 使用 **`anthropic/claude-3.5-haiku`** —— 已测试能够在单轮中调用写入工具。像 `gpt-4o-mini` 这样的模型倾向于以文本形式描述建议,而不是自主调用工具。 **重启后 kind 集群丢失** ``` make down # remove stale state if needed make up # fresh bootstrap (~5 min) ``` ## 演讲 **标题:** 死去的 Runbook、危险的 Agent 与拯救我们的安全模型 **活动:** MCP Dev Summit Bengaluru 2026 **时长:** 20–22 分钟 核心论点:没有策略层的工具访问是一种负担,而不是功能。每一次写入操作都需要评估爆炸半径、设置人工网关、使用范围受限的 token 并保留审计轨迹 —— 不是因为 AI 具有恶意,而是因为爆炸半径并不在意意图。
标签:AIOps, AI智能体, Alertmanager, Anthropic, AV绕过, CIS基准, DLL 劫持, Docker, FastAPI, JSONLines, Kind, Kubernetes运维, LLM, MCP, Modbus, OOMKill, OPA策略引擎, OpenAI, Server-Sent Events, SRE, SSE, Unmanaged PE, Web截图, 人工审批, 作用域令牌, 偏差过滤, 内存规避, 后端开发, 大语言模型, 子域名突变, 安全模型, 安全网关, 安全防御评估, 审计日志, 容器安全, 故障排查, 本地部署, 权限最小化, 模块化设计, 模型上下文协议, 混沌工程, 站点可靠性工程, 策略即代码, 策略网关, 级联故障, 聊天机器人安全, 自动化修复, 自定义请求头, 请求拦截, 逆向工具, 防篡改审计, 零信任