Skip to main content
Glama
hanumanthvendra

finops-copilot

클러스터를 적정 규모로 조정하는 AI — 그리고 프로덕션을 망가뜨리지 않게 하는 플랫폼

문제: "AI가 우리 인프라를 건드리게 하는 것"은 자신만만한 모델이 새벽 3시에 프로덕션을 레플리카 1개로 스케일링하게 만드는 좋은 방법입니다. 에이전틱 운영에서 흥미로운 엔지니어링은 모델이 아니라 가드레일입니다. 해결책: AI에게 MCP를 통해 클러스터에 대한 타입이 지정되고 경계가 있는 인터페이스를 제공하고, 안전 로직을 모델이 우회할 수 없는 서버 측에 둡니다. AI는 무엇을 변경할지 결정하고, 플랫폼은 무엇이 허용되는지 결정합니다. 직접 요청하더라도 나머지는 거부합니다.

Model Context Protocol (MCP) 서버는 라이브 Kubernetes 클러스터 위에 5가지 FinOps 도구를 노출합니다. Claude(또는 Claude Desktop 등 모든 MCP 클라이언트)는 이를 사용해 과도하게 프로비저닝된 워크로드를 찾고 적정 규모 조정을 제안합니다. 모든 변경(mutating) 호출은 어떤 일이 발생하기 전에 정책에 따라 검사되며 기본적으로 dry-run으로 동작합니다. 보호된 prod 네임스페이스, 리소스 하한선, 과도한 삭감 같은 안전하지 않은 변경은 서버가 거부하고 감사 로그에 기록합니다.

전적으로 노트북에서 실행됩니다. 의도적으로 낭비가 심한 워크로드가 심어진 kind 클러스터, 약 ~120줄짜리 MCP 서버, 그리고 기본적으로 오프라인으로 실행되는 코파일럿 드라이버(결정적 mock이라 API 키 없이도 CI에서도 동작) 또는 ANTHROPIC_API_KEY가 설정된 경우 실제 Claude로 실행되는 드라이버로 구성됩니다.


기능

   Claude / MCP client
          │  calls typed tools
          ▼
   ┌─────────────── MCP server (finops-copilot) ───────────────┐
   │  list_namespaces  list_workloads  estimate_cost           │
   │  recommend_rightsizing        get_audit_log               │
   │                                                           │
   │  apply_rightsizing(…, dry_run=True)                       │
   │        │                                                  │
   │        ▼   ┌─────────── policy.py (guardrails) ────────┐  │
   │     every  │ protected namespaces? resource floors?    │  │
   │     apply ─┤ max single-step cut?  → REFUSE + audit    │  │
   │            └───────────────────────────────────────────┘  │
   └────────────────────────┬──────────────────────────────────┘
                            │ kubectl (read specs / patch)
                            ▼
                  kind cluster: staging (waste) · prod (protected)

구성 요소

중요한 이유

여기서의 동작 방식

MCP, raw kubectl이 아님

AI는 타입이 지정되고 감사 가능한 액션을 얻지, 열린 셸을 얻지 않음

스키마가 있는 5가지 도구; 서버만이 클러스터에 접근함

서버 측 가드레일

모델이 프롬프트로 우회할 수 없는 안전

apply_rightsizing은 모든 요청을 먼저 policy.py에 통과시킵니다. 거부는 거부입니다.

기본 dry-run

안전한 것이 기본인 것

apply_rightsizing(dry_run=True)는 diff와 절감액을 보여줍니다. 실제 적용은 옵트인입니다.

모든 것 감사

"AI가 무엇을 하려 했는가"에 대한 답이 있음

허용, 거부, dry-run 등 모든 적용은 클라이언트가 읽을 수 있는 감사 로그에 추가됩니다.


Related MCP server: kube-lint-mcp

실행하기

make up            # kind cluster seeded with waste + Python env (MCP deps)
make demo          # the copilot finds & cuts waste — OFFLINE, no API key needed
make demo-claude   # real Claude drives the same MCP tools (needs ANTHROPIC_API_KEY)
make test          # unit-test the guardrail policy (no cluster needed)
make down          # delete the cluster

make demo는 실제 MCP 서버 위에서 결정적 mock 코파일럿을 실행합니다. Claude 경로와 동일한 도구, 동일한 가드레일을 사용하므로 키 없이도 CI에서도 동작합니다. make demo-claude는 mock 대신 Claude가 도구를 에이전트 방식으로 구동하게 합니다(공식 Anthropic SDK + 해당 MCP 도구 러너).

데모가 증명하는 것 (실제 출력)

네 개의 워크로드(3개는 심하게 과잉 프로비저닝, 1개는 정상)가 심어진 staging 네임스페이스와 보호된 prod를 대상으로:

  1. 낭비를 찾아냅니다. staging은 현재 요청 기준으로 ~$138/월의 비용이 듭니다. 도구는 CPU 사용률 1–4%에 머무는 세 워크로드를 플래그하고 CPU + 레플리카 삭감을 제안합니다 — 예상 절감액 ~$102/월 (73%).

  2. 먼저 dry-run을 수행합니다. 모든 변경은 정확한 diff와 월별 절감액을 보여주는 dry-run입니다. 명시적인 non-dry-run 호출 없이는 아무것도 적용되지 않습니다.

  3. 플랫폼이 prod를 거부합니다. prod도 줄여 달라는 요청에 서버는 거부합니다 — namespace 'prod' is protected. AI가 요청했지만 가드레일이 거부했습니다. dry-run조차도 변경이 없습니다.

  4. 플랫폼이 과도한 삭감을 거부합니다. CPU 요청을 10m으로 줄여 달라는 요청에 서버는 거부합니다 — 하한선 미만이고, 한 번에 90% 이상 삭감이기 때문입니다.

  5. 모든 작업이 기록됩니다. 감사 추적에는 다섯 가지 시도(세 건의 dry-run, 두 건의 거부)와 그 사유가 모두 표시됩니다.

AI가 낭비를 찾고 삭감을 제안했습니다. 플랫폼이 무엇이 허용되는지 결정했습니다. 이 역할 분담이 바로 핵심입니다.


Claude Desktop에서 사용하기 (실제 MCP)

이것은 실제 MCP 서버입니다 — 어떤 MCP 클라이언트든 연결할 수 있습니다. Claude Desktop에서는 claude_desktop_config.json에 추가하세요:

{
  "mcpServers": {
    "finops": {
      "command": "/path/to/mcp-finops-copilot/.venv/bin/python",
      "args": ["-m", "finops.server"],
      "env": { "FINOPS_CTX": "kind-mcp-finops" }
    }
  }
}

그런 다음 Claude에게 물어보세요: "내 staging 네임스페이스 비용은 얼마이고, 안전하게 적정 규모로 조정할 수 있는 것은 무엇인가요?"


프로덕션에 어떻게 매핑되나

데모

프로덕션

kind, pause 워크로드

실제 Deployments가 있는 EKS / AKS / GKE

시드된 주석(annotation)의 사용률

Prometheus / metrics-server (kube.py 읽기만 변경됨)

policy.py 하한선 + 보호된 네임스페이스

조직의 가드레일 — RBAC 범위, PodDisruptionBudgets, 변경 창

인메모리 감사 로그

감사 싱크(stdout → Loki, 이벤트 테이블 등)

예시용 비용 요율

제공업체의 실제 vCPU/GB당 가격

구성

finops/policy.py     the guardrail layer — pure, unit-tested (make test)
finops/cost.py       cost model + right-sizing heuristic
finops/kube.py       kubectl read/patch helpers
finops/server.py     the MCP server: 5 tools, dry-run-by-default, audited
copilot/mock_agent.py   deterministic offline copilot (CI-safe)
copilot/llm_agent.py    real Claude via the Anthropic SDK's MCP tool-runner
copilot/driver.py       picks mock vs Claude by ANTHROPIC_API_KEY
k8s/                 staging (seeded waste) + prod (protected)

MIT 라이선스. 노트북에서 실행 가능하고 NDA에 안전한 작은 데모로, 하나의 날카로운 아이디어를 증명합니다: 에이전틱 운영은 가드레일 문제입니다. AI에게 실제 액션을 주되, '아니요'라고 말하는 쪽은 플랫폼으로 만드세요.

Related MCP Connectors

Related MCP Servers