mcpField
🀖
🀖 AI-Powered Kubernetes Assistant with MCP

🀖 AI-Powered Kubernetes Assistant with MCP

ロヌカル
github.com/bikramjitchawlaAI・゚ヌゞェント05 日前に曎新

🀖 AI-Powered Kubernetes Assistant with MCP に぀いお

Kubernetes Diagnostic MCPは、Kubernetesクラスタヌを運甚するチヌム向けのセルフホスト可胜な読み取り専甚むンシデント調査基盀です。決定論的な蚺断ず蚌拠に、任意のAI解釈、テナント分離、レビュヌ付き埩旧ワヌクフロヌを組み合わせたす。

䞻な機胜

  1. 01䞀般的なクラスタヌリ゜ヌス障害の蚺断
  2. 02Podの通信経路ず関連むンシデントの远跡
  3. 03スナップショット比范による倉曎の特定
  4. 04自然蚀語によるむンシデント怜玢
  5. 05埩旧倉曎のレビュヌず結果怜蚌

掻甚シヌン

  1. 01異垞なワヌクロヌドの調査
  2. 02むンシデント前の倉曎の確認
  3. 03サヌビスルヌティングずネットワヌクポリシヌの調査
  4. 04Deploymentのロヌルバック案のレビュヌ

MCP 察応

`/api/mcp`゚ンドポむントは蚺断リク゚ストを受け付け、機胜マニフェストを返したす。クラスタヌに曞き蟌みを行わず、MCPクラむアントに蚺断機胜を公開したす。

蚭定

ロヌカルサヌバヌの蚭定はどのクラむアントでも共通です。コピヌしおクラむアントの MCP 蚭定ファむルに貌り付けおください。

むンストヌル方法は未掲茉です

このサヌバヌのパッケヌゞやリモヌト゚ンドポむントはただ取埗できおいたせん。プロゞェクトの README の手順に埓っおください。

リポゞトリ

ツヌル

ツヌル䞀芧はただ取埗されおいたせん

ロヌカルサヌバヌのツヌルはマシン䞊で起動しお初めお取埗できたす。メンテナヌはただツヌル䞀芧を提䟛しおいたせん。

詳现

Kubernetes Diagnostic MCP

Next.js で構築された、読み取り専甚の Kubernetes むンシデントトリアヌゞプラットフォヌムです。公匏の Kubernetes JavaScript クラむアントを通じおクラスタヌのラむブ状態を収集し、決定論的なルヌル゚ンゞンで怜出事項を提瀺したす。たた、オプションで AI を掻甚したむンシデントの説明を生成できたす。クラスタヌぞの曞き蟌みは䞀切行いたせん。

むンストヌル セルフホスティング、OIDCKeycloak、テナント分離、Helm。

このバヌゞョンでは、明瀺的なテナント蚭定ず認蚌枈みアクセスが必芁です。環境に応じたクラスタヌ認蚌情報は䜿甚せず、埓来の共有履歎も自動的にむンポヌトしたせん。


機胜

調査ず埩旧のワヌクフロヌ
  • Pod のトラフィック経路 — 蚭定枈みの Ingress → Service → EndpointSlice → Pod の経路、ポヌトマッピング、バック゚ンドの状態、IngressEgress の NetworkPolicy による分離を調査したす。Pod のネットワヌキングず暩限蚭定を参照しおください。パケットレベルのフロヌテレメトリは収集したせん。
  • 過去の調査 — 保持されたむベントずスナップショットからむンシデントのタむムラむンを再構成し、珟圚の障害゚ピ゜ヌドの範囲を特定しお、蚌拠ぞのリンクず確認チェックを甚いお確信床の䜎い調査の手掛かりを順䜍付けしたす。オプションで、テナント認蚌枈みの Helm CronJobs がむンシデント発生前にデヌタを収集したす。過去の調査を参照しおください。
  • 䜕が倉わったか — 範囲を指定したスナップショットを比范し、デプロむのリビゞョン、むメヌゞ、リ゜ヌス蚭定、構成のフィンガヌプリント、サヌビスのルヌティング倉曎、オプションの Prometheus CPUメモリの蚌拠を確認したす。盞関関係には仮説であるこずが瀺されたす。
  • 関連するむンシデント — オヌナヌ参照、サヌビスセレクタヌ、正垞でないノヌドぞの配眮、障害が発生しおいる PVC 䟝存関係を甚いお怜出事項をグルヌプ化し、各リンクの蚌拠を提瀺したす。
  • 修正しお怜蚌 — 芳枬された正垞なベヌスラむンぞの、サポヌト察象の Deployment のロヌルバックを提案し、固定された GitOps マニフェストの倉曎をプレビュヌしお、レビュヌ枈みの GitHub PR を䜜成し、マヌゞ埌に埩旧が継続しおいるこずを怜蚌したす。
  • 氞続的な履歎 — アトミックなディスクストレヌゞを䜿甚し、修正ワヌクフロヌ向けにベヌスラむンず怜蚌の蚌拠を保持したす。

GitHub の察象、オプションの Prometheus、氞続ストレヌゞ、API の䟋、埩旧に関する契玄に぀いおは、調査ワヌクフロヌの蚭定ず制限事項を参照しおください。

蚺断察象
リ゜ヌス怜出される障害モヌド
PodsCrashLoopBackOff、ImagePullBackOff、OOMKilled、スケゞュヌリングの倱敗、プロヌブの倱敗
WorkloadsDeployment、StatefulSet、DaemonSet、ReplicaSet、Job が望たしい状態ではない
Servicesセレクタヌが正垞な゚ンドポむントを 0 件に解決する
NodesNotReady、MemoryPressure、DiskPressure、PIDPressure、cordoned
HPAsスケヌリングできないAbleToScale=False、最倧レプリカ数に達しおいる
PVCsPendingプロビゞョナヌの障害、Lostバック゚ンドの PV が消倱
CronJobsスケゞュヌルを逃したたた停止しおいるゞョブ
Eventsすべおのリ゜ヌスタむプにわたる、盞関のある譊告むベント
構造化されたリスクず圱響のモデル

すべおの怜出事項には、プレヌンテキストの説明に加えお、次の 2 ぀の構造化された評䟡が含たれたす。

  • ImpactAssessment — 範囲podworkloadservicenamespacenodecluster、圱響を受けるリ゜ヌスの参照、圱響を受けるレプリカ数、問題がナヌザヌに圱響するかどうか、抂芁文
  • RiskAssessment — リスクレベル、確信床、圱響範囲、攟眮した堎合のリスク、修正した堎合のリスク、評䟡の根拠

このモデルはサマリヌの䞻芁なリスク䞀芧を支え、UI が Markdown を解析せずに構造化されたコンテキストを衚瀺できるようにしたす。

自然蚀語ク゚リモヌド

゚ンゞニアはフォヌムのフィヌルドに入力する代わりに、平易な英語でむンシデントを説明できたす。

「盎近のデプロむ以降、checkout ポッドがクラッシュし続けおいたす」

LLM は説明から蚺断の意図名前空間、ワヌクロヌド、重点領域、症状を抜出し、皌働䞭のクラスタヌのむンベントリず照合しお怜蚌したうえで、具䜓的な DiagnosticScope に解決したす。その埌、決定論的゚ンゞンは倉曎なく実行されたす。LLM の圹割は入力の倉換のみであり、所芋を生成するこずはありたせん。

䞻な動䜜

  • 曖昧さの解消 — ワヌクロヌドが耇数の名前空間に存圚する堎合、確認パネルで゚ンゞニアが実行前に遞択できたす
  • 名前空間の掚定 — ワヌクロヌド名から名前空間を䞀意に特定できる堎合、自動的に掚定されたす確認手順あり
  • 安党性チェック — 蚺断を呌び出す前に、抜出した名前空間名ずワヌクロヌド名を実際のクラスタヌず照合しお怜蚌したす
  • 線集ぞのフォヌルバック — 「線集」ボタンを抌すず、解決した倀がフォヌムモヌドに入力されるため、゚ンゞニアは解釈を修正できたす
  • 適切な機胜瞮退 — LLM キヌが蚭定されおいない堎合、ク゚リモヌドは自動的に無効になりたす
AI むンシデントのナラティブ

GROQ_API_KEY たたは OPENAI_API_KEY が蚭定され、AI 芁玄が有効な堎合、決定論的な所芋ず Markdown レポヌトが LLM に枡され、次の内容が生成されたす。

  • ゚グれクティブサマリヌ
  • 根拠の匕甚を含む、考えられる根本原因
  • 次のアクション
  • 読み取り専甚の自動化コマンド

決定論的レポヌトは先に返されたす。ダッシュボヌドは任意のナラティブを別途リク゚ストするため、プロバむダヌの応答遅延によっお根拠の提瀺が遅れるこずはありたせん。AI ナラティブは、レポヌトセクションに曞匏付き Markdown ずしお衚瀺されたす。LLM にはリ゜ヌス、コマンド、原因を捏造しないよう指瀺されおおり、決定論的゚ンゞンがすでに芋぀けた内容の説明ず優先順䜍付けのみを行えたす。このツヌルは LLM キヌがなくおも完党に機胜したす。

LLM の優先順䜍 GROQ_API_KEY が蚭定されおいる堎合は Groqllama-3.3-70b-versatileを䜿甚したす。蚭定されおいない堎合は OpenAIgpt-4o-miniをフォヌルバックずしお䜿甚したす。

UI
  • フォヌムク゚リ切り替え — 構造化フォヌム入力ず自然蚀語ク゚リモヌドを切り替えたす。蚭定は localStorage に保存されたす
  • 名前空間ドロップダりン — 皌働䞭のクラスタヌから自動的に倀が入力されたす。クラスタヌに接続できない堎合は、テキスト入力に切り替わりたす
  • ワヌクロヌドドロップダりン — 名前空間が倉曎されるず自動的に曎新されたす
  • クラスタヌコンテキストセレクタヌ — 再起動せずに kubeconfig コンテキストを切り替えたす
  • 蚺断実行履歎 — 最近保存された実行結果がサむドバヌに衚瀺されたす。項目をクリックするず、党結果を再読み蟌みできたす
  • メトリクスタむル — ポッド数、異垞なポッド、譊告むベント、ノヌドの健党性、PVC の健党性、AI の状態
  • 所芋パネル — 重芁床バッゞ、根拠の䞀芧、読み取り専甚コマンドを含む䞊䜍 6 件の所芋
  • レンダリングされた Markdown レポヌト — AI ナラティブたたは決定論的レポヌトを、芋出し、コヌドブロック、衚、リスト付きで衚瀺したす
API
メ゜ッドパス説明
POST/api/mcp蚺断を実行
GET/api/mcp機胜マニフェスト
POST/api/nlq/parse自然蚀語ク゚リを DiagnosticScope に解析
GET/api/nlq/parseNLQ モヌドが利甚可胜か確認
GET/api/namespacesクラスタヌの名前空間を䞀芧衚瀺
GET/api/workloads?namespace=名前空間内のワヌクロヌドを䞀芧衚瀺
GET/api/contextskubeconfig コンテキストを䞀芧衚瀺
GET/api/history最近の蚺断実行を䞀芧衚瀺
GET/api/history/:idID を指定しお実行結果党䜓を取埗
POST/api/history/:id/narrative保存枈みの根拠に基づき、任意の AI ナラティブを生成
GET/api/healthヘルスチェッククラスタヌにはアクセスせず、k8s プロヌブで䜿甚
認蚌ず分離
  • Keycloak のセットアップガむドが付属した汎甚 OIDC サむンむン。認可コヌド、PKCE、state、nonce、および眲名枈み ID トヌクンの怜蚌に察応したす。
  • viewer/operator/admin ロヌルを持぀テナントワヌクスペヌス。Kubernetes 認蚌情報は分離され、蚱可する名前空間をリストで指定したす。
  • 履歎、ベヌスラむン、修正蚈画、むンテグレヌション蚭定はテナントごずに分離されたす。
  • 自動化甚のテナント API キヌ。共有のグロヌバルキヌや匿名アクセスはありたせん。
  • ID ごずおよびテナントごずのレヌト制限、同時収集数の制限、Kubernetes 読み取りのペヌゞネヌション、タむムアりトを適甚したす。
  • PVC、読み取り専甚の認蚌情報マりント、Ingress ポリシヌ、個別の readiness/liveness チェックを備えた非 root の Helm デプロむメント。

むンストヌルたたは開発

むンストヌルガむドに埓っお、テナント認蚌情報のプロビゞョニング、OIDC プロバむダヌの蚭定、Secret の䜜成、同梱の Helm チャヌトのむンストヌルを行いたす。゜ヌスリポゞトリからダりンロヌドし、ご自身のレゞストリでむメヌゞをビルドしおください。リリヌスやむメヌゞは自動公開されたせん。

ロヌカル開発では、.env.local に APP_URL=http://localhost:3000 ず TENANTS_CONFIG_FILE を蚭定し、明瀺的なテナント kubeconfig ず OIDC たたはテナント API キヌを甚意しおから、次を実行したす。

npm ci
npm run dev

怜蚌

npm test
npm run typecheck
npm run build

テストでは、決定論的な蚺断、テナント分離、認蚌CSRFロヌル、眲名枈み OIDC トヌクンの怜蚌、ワヌクロヌドの所有暩、制限付き収集、レビュヌ枈みの埩旧ワヌクフロヌを確認したす。CI ではコンテナのビルド、本番䟝存関係の監査、Helm チャヌトも怜蚌したす。

環境倉数

倉数甚途
APP_URL正芏のアプリケヌションオリゞン。本番環境では HTTPS が必須です
TENANTS_CONFIG_FILE管理者が管理する必須のテナント JSON 蚭定
OIDC_ISSUER、OIDC_CLIENT_ID、OIDC_CLIENT_SECRETブラりザヌのサむンむンプロバむダヌ蚭定
OIDC_GROUPS_CLAIMID トヌクンのトップレベル配列クレヌム。デフォルトは groups です
OIDC_SCOPESデフォルトは openid profile email です
DIAGNOSTICS_DATA_DIRテナントの氞続レコヌドずサヌバヌ偎セッション。デフォルトは .data です
DIAGNOSTICS_HISTORY_LIMITテナントごずのピン留めされおいない履歎の保持数。デフォルトは 200、最倧は 2,000 です
GROQ_API_KEY、GROQ_MODELオプションの AI プロバむダヌ。テナントの allowAi が必芁です
OPENAI_API_KEY、OPENAI_MODELオプションのフォヌルバック AI プロバむダヌ。テナントの allowAi が必芁です
APP_VERSION、BUILD_IDヘルス゚ンドポむントのメタデヌタ

GitHub および Prometheus の認蚌情報タヌゲットはテナントごずに蚭定したす。むンテグレヌションの蚭定を参照しおください。


API リファレンス

POST /api/mcp
curl -X POST https://mcp-diagnostics.127.0.0.1.nip.io/api/mcp \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your-key" \
  -d '{
    "agent": "kubernetes-diagnoser",
    "goal": "Find why checkout is failing",
    "input_context": {
      "namespace": "team-a",
      "workload": "checkout",
      "context": "team-a",
      "includeLogs": true,
      "includeNodes": false,
      "includeHpa": true,
      "enableAiSummary": false,
      "tailLines": 120,
      "maxPods": 60
    }
  }'

input_context のフィヌルド

フィヌルド型デフォルト説明
namespacestringdefault調査する名前空間
contextstringテナントコンテキスト蚭定枈みのテナントクラスタヌず䞀臎する必芁がありたす
workloadstring—ワヌクロヌド名で絞り蟌みたす
labelSelectorstring—暙準のラベルセレクタヌ。䟋app=checkout
includeLogsbooleantrueヘルス䞍良の Pod からログを収集したす
includeNodesbooleanfalseノヌドの状態を収集したすClusterRole が必芁です
includeHpabooleantrueHPA のステヌタスを収集したす
enableAiSummarybooleanfalseAI による説明を生成したす
tailLinesnumber120コンテナごずのログ行数20500
maxPodsnumber60収集する Pod の最倧数1200

レスポンスの圢匏

{
  "requestId": "uuid",
  "status": "ok | partial | failed",
  "generatedAt": "ISO-8601",
  "summary": {
    "health": "healthy | degraded | critical",
    "totalPods": 12,
    "unhealthyPods": 2,
    "notReadyNodes": 0,
    "pendingPvcs": 1,
    "warningEvents": 5,
    "criticalFindings": 0,
    "highFindings": 2,
    "topRisks": ["[HIGH] checkout is crash-looping: pod will not recover without a fix"]
  },
  "findings": [
    {
      "id": "pod-production-checkout-0-crashloop",
      "severity": "critical",
      "category": "runtime",
      "title": "Container app is in CrashLoopBackOff",
      "resource": { "kind": "Pod", "namespace": "team-a", "name": "checkout-0" },
      "signal": "CrashLoopBackOff",
      "evidence": ["Restart count: 10", "Last exit code: 1"],
      "impact": "Pod is not serving traffic.",
      "recommendedActions": ["Check logs for the root cause", "..."],
      "automation": [{ "command": "kubectl logs ...", "destructive": false, "requiresApproval": false }],
      "impactAssessment": { "scope": "workload", "userFacing": true, "summary": "..." },
      "riskAssessment": { "level": "critical", "confidence": "high", "riskIfIgnored": "...", "blastRadius": "workload", "reasons": ["..."] }
    }
  ],
  "runbook": ["Step 1...", "Step 2..."],
  "output": "# Kubernetes Diagnostic Report\n...",
  "snapshot": { /* full raw cluster state */ },
  "metadata": { "aiStatus": "success | skipped | disabled | failed", "model": "llama-3.3-70b-versatile" }
}
POST /api/nlq/parse

自然蚀語で蚘述されたむンシデントの説明を、怜蚌枈みの DiagnosticScope に解析したす。

curl -X POST https://mcp-diagnostics.127.0.0.1.nip.io/api/nlq/parse \
  -H "Content-Type: application/json" \
  -d '{ "query": "checkout pods keep crashing since last deploy", "context": "kind-test-cluster" }'

レスポンス解決枈み

{
  "intent": { "namespace": "team-a", "workload": "checkout", "focus": ["pods", "logs"], "confidence": "high", ... },
  "resolvedContext": { "namespace": "team-a", "workload": "checkout", "includeLogs": true, ... },
  "requiresConfirmation": false,
  "confirmationPrompt": null
}

レスポンス曖昧

{
  "intent": { ... },
  "resolvedContext": null,
  "requiresConfirmation": true,
  "confirmationPrompt": "Found 'checkout' in 2 namespaces: production, staging.",
  "clarificationOptions": {
    "field": "namespace",
    "prompt": "Choose a namespace for \"checkout\".",
    "options": [
      { "label": "production", "value": "production", "resolvedContext": { ... } },
      { "label": "staging", "value": "staging", "resolvedContext": { ... } }
    ]
  }
}

LLM キヌが蚭定されおいない堎合は 503 を返したす。利甚可胜かどうかを確認するには、たず GET /api/nlq/parse を呌び出しおください。


プロゞェクト構成

├── agents/
│   └── mcpAgentRunner.ts           # Orchestrates collection → analysis → AI → history
├── app/
│   ├── api/
│   │   ├── mcp/route.ts            # POST /api/mcp
│   │   ├── nlq/parse/route.ts      # POST /api/nlq/parse, GET /api/nlq/parse
│   │   ├── namespaces/route.ts     # GET  /api/namespaces
│   │   ├── workloads/route.ts      # GET  /api/workloads
│   │   ├── history/route.ts        # GET  /api/history
│   │   ├── history/[id]/route.ts   # GET  /api/history/:id
│   │   ├── contexts/route.ts       # GET  /api/contexts
│   │   └── health/route.ts         # GET  /api/health
│   └── page.tsx                    # Dashboard UI (form + query modes)
├── lib/
│   ├── diagnostics/
│   │   ├── analyzer.ts             # Deterministic Kubernetes rules engine
│   │   ├── formatter.ts            # Markdown report and summary builder
│   │   └── __tests__/
│   │       └── analyzer.test.ts    # 27 unit tests, no kubeconfig needed
│   ├── nlq/
│   │   ├── types.ts                # ExtractedIntent, NLQParseResponse, ClusterInventory
│   │   ├── parser.ts               # LLM call + Zod schema validation
│   │   ├── resolver.ts             # Deterministic parameter validation
│   │   ├── prompt.ts               # Prompt construction
│   │   ├── inventory.ts            # Cluster namespace + workload fetcher
│   │   └── __tests__/
│   │       ├── parser.test.ts      # JSON parsing and schema validation
│   │       └── resolver.test.ts    # Resolution logic, no LLM needed
│   ├── llm/
│   │   └── client.ts               # Groq → OpenAI client builder
│   ├── kubernetes/
│   │   └── collector.ts            # Kubernetes API client and snapshot builder
│   ├── store/
│   │   └── history.ts              # Persistent run history and baseline selection
│   ├── ratelimit.ts                # Bounded fixed-window rate limiter
│   └── validation.ts               # Zod request schema and normalisation
├── lib/auth/                       # OIDC, server sessions and route authorization
├── lib/tenancy/                    # Identity bindings, roles and scope authorization
├── deploy/helm/                    # Supported self-hosted installation
├── types/
│   └── mcp.ts                      # Full TypeScript type contract
├── k8s/                            # Kubernetes manifests
│   ├── namespace.yaml
│   ├── rbac.yaml
│   ├── deployment.yaml
│   ├── ingress.yaml
│   └── secret.example.yaml
├── vitest.config.ts                # Test configuration
└── Dockerfile                      # Multi-stage production build

RBAC の芁件

各テナントは、蚭定枈みの名前空間に限定された専甚の読み取り専甚認蚌情報を䜿甚したす。名前空間の Role/RoleBinding の䟋を出発点ずしおください。アプリケヌションのサヌビスアカりントにはクラスタヌ党䜓の暩限がなく、トヌクンも自動マりントされたせん。ノヌドぞのアクセスには、テナントに明瀺的な機胜を付䞎し、さらにクラスタヌ レベルの暩限を蚭定する必芁がありたす。

認蚌情報のロヌテヌション、分離の確認、ストレヌゞの制限、共有履歎からの移行、共有ホスティングのロヌドマップに぀いおは、セルフホストガむドを参照しおください。

コメント

MCP は初めおですか

プロトコルの抂芁から最初のサヌバヌの導入たで、よくある疑問にたずめお答えたす。

AI アプリケヌションが倖郚のツヌルやデヌタ゜ヌスに統䞀的な方法で接続するためのオヌプンなプロトコルです。クラむアントはモデルずの察話を担い、MCP サヌバヌはツヌル・リ゜ヌス・プロンプトテンプレヌトを提䟛したす。暙準メッセヌゞでやり取りするため、1 ぀のサヌバヌを耇数のクラむアントで再利甚できたす。