go-steer/k8s-lookout

GitHub: go-steer/k8s-lookout

k8s-lookout 是为 LLM 故障排除代理设计的 Kubernetes 集群诊断与监控数据面工具,通过确定性的高密度信号输出帮助 AI 代理高效排查集群问题。

Stars: 0 | Forks: 0

# k8s-lookout 面向 Kubernetes/GKE 集群的确定性、高 token 密度监控工具,专为 LLM 驱动的故障排除代理设计 —— 它是 [`core-agent`](https://github.com/go-steer/core-agent) 的数据面配套工具。 一个包含多种调用的单一二进制文件 `lookout`,分为两部分: - **读取路径 (Read-path)** — 代理在调查中途运行的一次性诊断命令 (`bundle`, `health`, `triage …`, `state …`, …)。 每个命令都会输出经过压缩且防止机密泄露的 logfmt/JSON 分析结果,而不是原始的 遥测数据转储,并且始终以明确的摘要行结尾,因此 “集群健康” 绝不会变成模棱两可的沉默。 - **监控路径 (Watch-path)** — `lookout watch`,一个驻留在每个集群中的哨兵,它将 领先指标(状态转换、趋势斜率、到期倒计时)转化为带有预热上下文的逐事件代理会话 —— 在问题发生之前或发生之时将其捕获,而不是在发生之后。 这并非预测性/ML:每一个领先指标都是确定性的算术运算。 完整的规范详见 [`docs/DESIGN.md`](./docs/DESIGN.md);有关 代码树中各文件的位置,请参阅 [仓库架构图](./docs/repo-map.md)。 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/go-steer/k8s-lookout/actions/workflows/ci.yml) [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](./LICENSE) ## 安装说明 **容器镜像** (多架构 amd64 + arm64;distroless static; Sigstore 签名): ``` docker pull ghcr.io/go-steer/lookout:latest # default: GCP-free, runs on any conformant cluster docker pull ghcr.io/go-steer/lookout:latest-gke # same binary + GKE/GCP provider (-tags allproviders) ``` 镜像的 `ENTRYPOINT` 是 `lookout watch`,可以直接替换 兼容 `ghcr.io/go-steer/k8s-event-watcher` 的部署。 使用以下命令验证签名: ``` cosign verify ghcr.io/go-steer/lookout:vX.Y.Z \ --certificate-identity-regexp '^https://github.com/go-steer/k8s-lookout' \ --certificate-oidc-issuer https://token.actions.githubusercontent.com ``` **从源码构建** (Go 1.26+): ``` go install github.com/go-steer/k8s-lookout/cmd/lookout@latest ``` ## 快速入门 — 读取路径 每一个读取命令都会针对你当前的 kubeconfig context 运行,无需 额外部署。只需一次调用即可解答“这个集群有问题吗?”: ``` lookout health ``` ``` kind=health.category severity=info reason=Unavailable message="requires cloud provider metrics (M4); no cloud provider configured" category=control-plane status=unavailable kind=health.category severity=info category=nodes status=healthy kind=health.category severity=warning category=crashloops status=degraded total=8 top="pod.restarts agent-sandbox-system/agent-sandbox-controller-7c69875fcc-n7xms; pod.restarts kube-system/coredns-7d764666f9-g82j9; …" kind=health.category severity=info category=pending status=healthy kind=health.category severity=info category=rollouts status=healthy … kind=pod.restarts severity=warning namespace=kube-system kind_of_object=Pod name=coredns-7d764666f9-g82j9 reason=ExcessiveRestarts fingerprint=sha256:e094a6ee… category=crashloops container=coredns restarts=62 scanned=16 findings=18 elapsed=537ms ``` (针对 kind 集群的真实输出,已缩减。)健康的资源会被 省略;但分类仍会明确给出结果。`lookout bundle --workload=Deployment/prod/api` 是事件发生时的首次调用:它提供 一个关联的快照,而不是 4-5 个独立的读取结果。退出码 0 表示 stdout 上只有 纯粹的 payload;诊断信息仅输出到 stderr。 ## 快速入门 — 哨兵 监控路径通过 [`deploy/`](./deploy/) 在每个集群中进行部署: ``` kubectl apply -f deploy/ ``` 这为哨兵提供了一个专用的 ServiceAccount,以及 最小必要权限的**只读** ClusterRole(它只进行观察;所有 变更操作都通过 core-agent 守护进程自身的权限控制门来执行)。 在 `deploy/51-deployment-watcher.yaml` 中将 `--daemon-url` 指向你的 core-agent 守护进程。DESIGN.md §11 中涵盖了命名空间范围(仅限 Role)和 项目层级(配额来源,`-gke` 镜像)的部署 —— 其 RBAC 范围 未得到满足的信号源在启动时会明确报错, 而绝不会表现为静默的空监控。 想先看看这两部分在真实故障下的表现吗? [`examples/`](./examples/) 建立了一个 kind 集群,将哨兵 连接到一个捕获存根,并提供了演示工作负载和十种注入/验证/还原的 故障场景(`examples/e2e` 运行所有场景) —— 此外还包含了通过 skills 或 MCP 在 代理测试框架中测试 CLI 的配方。 ## 命令界面 | 命令 | 功能描述 | | --- | --- | | `watch` | 驻留哨兵:九种信号源 → 过滤 → 去重 → 风暴关联 → 严重性路由 → 丰富上下文 → 会话注入 | | `mcp` | 将每个读取命令 1:1 作为 MCP 工具提供服务(stdio 或 localhost HTTP) —— 这是 distroless 守护进程调用 lookout 的方式 | | `bundle` | 每次事件的首个调用:脱敏的 spec + 异常对象 + 断裂的边 + 影响范围 + 提炼后的日志,打包为一个 payload | | `health` | 十个类别的集群记分卡,与开放的哨兵分析结果和 triage 状态记录合并 | | `triage delta` | 一次扫描找出所有异常:故障工作负载、长期挂起的 Pending、节点压力、死锁的 PDB、降级的 add-ons、触及上限的配额 | | `triage logs` | 基于模板指纹的日志去重:将约 150k token 的日志压缩至约 350 | | `triage events` | 跨越 owner-reference 树的去重按时间排序的事件时间线 | | `triage top` | 当前时刻 CPU/mem 饱和度与限制的对比 | | `triage radius` | 根据拓扑索引得出工作负载的影响范围;`--at` 用于解答“在事件发生时”的情况 | | `triage changes` | “发生前有什么变化”:rollout、配置更新、扩缩容,范围限制在图邻域内 | | `triage spec` | 专为代理设计的 kubectl describe:经过脱敏、高 token 密度,可通过 `--diff` 与图历史进行对比 | | `triage status` | 读写 §9.4 中的 triage-status 记录,以便后续扫描报告的是经过诊断的实际情况,而不是全新的未知状态 | | `state edges` | 依赖图验证:config/secret 密钥、selector、endpoint、TLS 过期情况 | | `state webhooks` | 因后端失效而处于失败关闭状态的 admission webhooks | | `state wi` † | GKE Workload Identity KSA↔GSA 绑定验证 | | `state volumes` | RWO 多重挂载 / 跨可用区 PV 锁 | | `stab drift` | 通过 managedFields 检测 GitOps 管理器之外的配置漂移 | | `stab drain` | 所有会阻碍节点排空的因素 | | `perf probe` † | 控制面指标包:`apiserver`、`apf`、`etcd`、`startup` | | `cloud stockout\|orphans\|ipspace\|quota` † | GCP 侧读取:可用区资源耗尽、孤立的磁盘/LB、CIDR 利用率、配额余量 | | `net probe` | 从集群内部发起的主动 DNS/TCP/HTTP 检查 | † 需要 cloud provider(`-gke` 镜像 / `-tags gke` 构建)。套件中约 80% 是纯 client-go,可在任何兼容集群上运行; 默认构建不链接任何 GCP SDK。受限于 provider 的命令在原始集群上绝不会 崩溃或撒谎 —— 它们会输出一条明确的分析结果并以 exit 0 退出: ``` kind=cloud.unavailable severity=info reason=CapabilityUnavailable message="cloud quota needs the provider quota capability: no cloud provider configured" capability=quota provider=none scanned=0 findings=1 elapsed=0s unavailable="no cloud provider configured" ``` 代理教育内容位于 [`skills/`](./skills/README.md):`k8s-triage`、 `cluster-health`、`gitops-drift`,以及针对特定症状的 `playbooks/` —— 这些 skills 教授跨命令的决策树,并安装到使用方 部署的 `.agents/skills/` 中。 ## 生态系统 | 仓库 | 角色 | | --- | --- | | [`core-agent`](https://github.com/go-steer/core-agent) | 代理守护进程;lookout 通过 `POST /sessions` + `/inject` 与其通信 | ## 文档 - [`docs/DESIGN.md`](./docs/DESIGN.md) — 完整的规范性说明文档 - [`docs/repo-map.md`](./docs/repo-map.md) — 仓库架构图:布局、数据路径、固定契约 - [`docs/signal-schema-v1.md`](./docs/signal-schema-v1.md) — 固定的舰队汇总网络传输契约 - [`docs/milestones/`](./docs/milestones/) — 各里程碑的退出验证(M0–M5 已完成,v0.6.0) - [`CHANGELOG.md`](./CHANGELOG.md) ## 许可证 Apache 2.0 — 详见 [LICENSE](./LICENSE)。
标签:API集成, EVTX分析, LLM集成, 可观测性, 故障排查, 日志审计, 请求拦截, 运维监控