raxitlabs-free/sre-agent

GitHub: raxitlabs-free/sre-agent

基于 LangChain 的 Kubernetes SRE 自主代理,通过多维度并行审计集群健康状态,并在人工批准后自动执行修复操作。

Stars: 0 | Forks: 0

# SRE Bot 一个自主的 Kubernetes SRE agent。它会监控集群健康状况、诊断问题并应用修复——在任何写操作之前都需要人工批准。 ## 功能 - **自主健康审计** —— 由专门的 subagent 并行分析 pod、扩缩容、资源、日志、安全性、可靠性、配置规范以及批处理任务 - **Human-in-the-loop (HITL)** —— 每个写操作(重启、扩缩容、修补、删除)都会暂停以等待明确批准。在 Slack 中批准或拒绝会以内联方式确认决策(由谁决定以及结果),并移除按钮,从而避免操作被重复触发 - **Slack 集成** —— 通过 Socket Mode 发送警报、健康报告和 HITL 批准/拒绝按钮(无需公共 ingress)。在频道中提及该 bot,它会在该话题内回复 - **快速交互式健康检查** —— “执行健康检查”的提及由与调度程序相同的受限路径处理(直接读取集群 + 单次结构化输出调用),因此它能在几秒钟内返回,并且永远不会触及 agent 的递归限制——这与将其通过完整 orchestrator 路由不同 - **自定义资源支持** —— change-executor 可以创建、更新和删除 CRD 实例,因此它可以移除 operator 的顶层自定义资源(例如 `lgps.apps.langchain.ai`),而不是与 operator 的调谐循环对抗 - **模型网关支持** —— 通过设置 `ANTHROPIC_BASE_URL`,将 Claude 调用路由通过 LangChain/LangSmith 模型网关;如果未设置,则直接调用 Anthropic - **定时监控** —— 在可配置的间隔下进行周期性集群健康检查。调度程序通过 Kubernetes client 直接收集集群状态(无需消耗 LLM token),然后进行一次结构化输出调用来总结发现 - **结构化发现** —— 健康分析返回类型化的 `HealthReport`(参见 `schemas.py`)而不是自由文本,因此 Slack 渲染时会读取类型化的字段,而不是解析 markdown - **两种接口** —— CLI 用于交互式使用,FastAPI + Web UI 用于集群内部署 - **LangSmith 追踪** —— 对每次 agent 运行提供完全的可观测性,并附带评估数据集和在线评估器 ## 示例输出 显示集群审计(包含严重和警告发现)的 Slack 健康报告: ![Slack 健康报告](https://static.pigsec.cn/wp-content/uploads/repos/cas/0a/0a91c0a677b8bc94fbd07421b69dc27e9ccd2760e1805e0d1a86d8052f2e4580.png) ![Slack 健康报告 2](https://raw.githubusercontent.com/raxitlabs-free/sre-agent/main/docs/slack_health_2.png) Slack 中的 HITL 批准 —— 在您批准或拒绝后,决策会以内联方式确认(包含决策者信息),并且按钮会被移除,因此该操作无法被重复触发: ![Slack HITL 批准确认](https://raw.githubusercontent.com/raxitlabs-free/sre-agent/main/docs/confirmation.png) ## 架构 ``` main.py / api.py └── SRE orchestrator (agent.py) ├── pod-inspector (read-only) — pod health, crashes, logs ├── scaling-analyzer (read-only) — HPA, replicas, node capacity ├── performance-analyzer (read-only) — CPU/memory right-sizing ├── log-analyzer (read-only) — error detection in logs ├── security-auditor (read-only) — RBAC, privileged pods, NetworkPolicies, image tags ├── reliability-auditor (read-only) — PDBs, probes, endpoints, single-replica SPOFs ├── job-inspector (read-only) — Jobs, CronJobs, failures, missed schedules ├── config-auditor (read-only) — resource limits, PV hygiene, selector mismatches └── change-executor (write ops — all require HITL approval) ``` 主 agent 只有读取工具。所有写操作都被委托给 `change-executor`,它被配置为在每次写工具调用之前中断。 ## 快速开始 ### 前置条件 - Python 3.12+ - 已配置并指向您的集群的 `kubectl`(用于本地开发) - Anthropic API key - LangSmith API key(用于追踪) - 带有 Bot 和 App 级别 token 的 Slack 应用(可选,用于 Slack 通知) ### 本地开发 ``` pip install -r requirements.txt cp .env.example .env # 在 .env 中填写你的 keys python main.py # CLI mode python api.py # API + web UI at http://localhost:8080 ``` ### 环境变量 | 变量 | 必需 | 描述 | | -------- | -------- | ----------- | | `ANTHROPIC_API_KEY` | 是 | Claude API key。通过网关路由时(参见 `ANTHROPIC_BASE_URL`),将其设置为您的网关 key | | `ANTHROPIC_BASE_URL` | 否 | 通过模型网关路由 Claude 调用,例如 `https://gateway.smith.langchain.com/anthropic`;未设置 = 直接调用 Anthropic | | `LANGSMITH_API_KEY` | 是 | LangSmith 追踪 key | | `LANGSMITH_TRACING` | 是 | 设置为 `true` 以启用追踪 | | `LANGSMITH_PROJECT` | 否 | 项目名称(默认:`sre-agent`) | | `LANGSMITH_WORKSPACE_ID` | 否 | 将 trace 路由到特定的 LangSmith workspace | | `SLACK_BOT_TOKEN` | 否 | `xoxb-...` bot token | | `SLACK_APP_TOKEN` | 否 | `xapp-...` Socket Mode token | | `SLACK_CHANNEL` | 否 | 用于警报的频道(默认:`#sre-alerts`) | | `MONITOR_INTERVAL_MINUTES` | 否 | 健康检查频率(默认:`30`) | | `MONITORING_ENABLED` | 否 | 设置为 `true` 以启用定时检查(默认:`false`) | | `DEFAULT_NAMESPACES` | 否 | 要监控的、以逗号分隔的 namespace(默认:自动发现) | | `PROMETHEUS_URL` | 否 | 用于获取更丰富指标的 Prometheus endpoint | | `API_PORT` | 否 | API 服务器的端口(默认:`8080`) | ## 部署到 Kubernetes 包含的 `deploy.sh` 一步即可处理构建、ECR 推送和 EKS 应用: ``` ./deploy.sh # tags as :latest ./deploy.sh v1.2.0 # optional: tag with a version ``` 或者手动操作: ``` # 1. 向 ECR 进行身份验证(tokens 每 12 小时过期) aws ecr get-login-password --region us-east-1 \ | docker login --username AWS --password-stdin .dkr.ecr.us-east-1.amazonaws.com # 2. 构建并推送(--push 避免了单独的 docker push 步骤) docker buildx build --platform linux/amd64 \ -t your-registry/sre-agent:latest --push . # 更新 k8s/deployment.yaml 中的 image # 3. 创建 secrets 文件(切勿提交此文件) # data: 下的值必须进行 base64 编码;stringData: 接受纯文本 echo -n "sk-ant-..." | base64 # ANTHROPIC_API_KEY echo -n "lsv2_..." | base64 # LANGSMITH_API_KEY echo -n "xoxb-..." | base64 # SLACK_BOT_TOKEN echo -n "xapp-..." | base64 # SLACK_APP_TOKEN # 将值粘贴到 k8s/secret.yaml 中 # 4. Apply kubectl apply -k k8s/ # 5. 访问 UI kubectl port-forward svc/sre-agent 8080:80 -n sre-agent # 打开 http://localhost:8080 ``` ### RBAC 包含的清单(manifest)授予: - 对集群范围内所有资源的**读取**权限(`ClusterRole: sre-agent-reader`) - 对集群范围内所有 namespace 的**写入**(patch/update/delete)权限(`ClusterRole: sre-agent-writer`) 无论 RBAC 如何设置,所有写操作仍然受 HITL 把控。 ## 停止 bot | 模式 | 如何停止 | | ---- | ----------- | | CLI (`main.py`) | `Ctrl+C` | | API (`api.py`) | `Ctrl+C` 或 `kill ` | | 集群内 | `kubectl scale deployment sre-agent -n sre-agent --replicas=0` | | 删除所有内容 | `kubectl delete -k k8s/` | ## 项目结构 ``` agent.py Main SRE orchestrator api.py FastAPI server (SSE streaming, HITL endpoints, web UI) main.py CLI entry point config.py Env-based configuration schemas.py Pydantic models (Finding, HealthReport) — structured-output contract scheduler.py Periodic health check scheduler (structured HealthReport via tool-use) slack_notifier.py Slack Block Kit messages and HITL action handling (send_structured_report renders typed findings directly) deploy.sh Build, push to ECR, and deploy to EKS tools/ kubernetes_read.py Read-only kubectl tools kubernetes_write.py Write tools (all require HITL approval), including kubectl_scale_bulk and kubectl_delete_resources_bulk for batching multiple resources into a single approval, and kubectl_delete_custom_resource for deleting CRD instances (operator-owned resources) kubernetes_security.py RBAC, pod security, NetworkPolicy, image tag tools kubernetes_reliability.py PDB, probe, endpoint, single-replica tools kubernetes_hygiene.py Resource limits, PV, selector mismatch tools kubernetes_batch.py Job and CronJob tools helm.py Helm release inspection and upgrade/rollback tools k8s_client.py In-cluster vs local kubectl detection slack.py Slack notification tool for the agent subagents/ pod_inspector.py scaling_analyzer.py performance_analyzer.py log_analyzer.py security_auditor.py reliability_auditor.py job_inspector.py config_auditor.py change_executor.py Only subagent with write tools k8s/ Kustomize manifests for cluster deployment evals/ create_dataset.py Script to upload eval examples to LangSmith sre-agent-k8s-eval.jsonl Pre-built JSONL dataset (upload directly via LangSmith UI) evaluators.py Online evaluators upload_online_evals.py Script to register online evaluators ``` ## 安全说明 - `k8s/secret.yaml` 位于 `.gitignore` 中 —— 切勿提交它 - 容器以非 root 用户(`uid 1000`)身份运行 - 如果您怀疑密钥已泄露,请立即通过相应的提供商后台轮换它们
标签:LangChain, SRE, 人机交互, 偏差过滤, 子域名突变, 自动化运维, 请求拦截, 轻量级, 逆向工具