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 中的 HITL 批准 —— 在您批准或拒绝后,决策会以内联方式确认(包含决策者信息),并且按钮会被移除,因此该操作无法被重复触发:

## 架构
```
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, 人机交互, 偏差过滤, 子域名突变, 自动化运维, 请求拦截, 轻量级, 逆向工具