Skip to main content
Glama
Krishna1704M

mcp-k8s-context-server

by Krishna1704M

MCP K8s Context Server

FastMCP サーバー。Kubernetes を LLM が利用可能な読み取り専用ツール群として公開し、さらにポッドの健全性分析とリソース傾向追跡のための分析レイヤーを提供します。


機能

ツール

説明

list_pods(namespace)

名前空間内のポッドを、フェーズと再起動情報とともに一覧表示

get_pod_status(pod_name, namespace)

ポッドの詳細なステータス、状態、コンテナの状態を取得

get_pod_logs(pod_name, namespace, tail_lines)

最近のポッドログを末尾から取得

get_deployment_manifest(deployment_name, namespace)

デプロイメントの完全な仕様を JSON として取得

analyze_pod_health(namespace, hours)

分析: ログをスキャンし、エラーパターンを検出し、異常なポッドをランク付け

get_resource_trends(deployment_name, namespace)

分析: Metrics API からの CPU/メモリを、履歴 SQLite 永続化とともに取得


Related MCP server: Kubernetes Read Only MCP Server

プロジェクト構造

mcp-k8s-context-server/
├── k8s_mcp_server.py        # FastMCP server (all tools)
├── requirements.txt         # Python dependencies
├── Dockerfile               # Container image definition
├── k8s/
│   ├── serviceaccount.yaml  # ServiceAccount + Namespace
│   ├── role.yaml            # Least-privilege ClusterRole (read-only)
│   ├── rolebinding.yaml     # ClusterRoleBinding
│   └── deployment.yaml      # Deployment + Service
└── .github/
    └── workflows/
        └── ci.yml           # Build + kubeconform validation

ローカル開発

# Create and activate a virtual environment
python -m venv .venv && source .venv/bin/activate

# Install dependencies
pip install -r requirements.txt

# Run with local kubeconfig (falls back automatically from in-cluster config)
python k8s_mcp_server.py

クラスター内デプロイ (minikube)

前提条件

# Install minikube, kubectl, docker
minikube version   # >= 1.32
kubectl version    # >= 1.28
docker version     # >= 24

ステップ 1 — minikube を起動

minikube start --cpus=2 --memory=4096

ステップ 2 — metrics-server を有効化 (get_resource_trends に必要)

minikube addons enable metrics-server

ステップ 3 — イメージをビルドして minikube にロード

# Build locally
docker build -t mcp-k8s-server:latest .

# Load into minikube's image registry (no registry push needed)
minikube image load mcp-k8s-server:latest

# Verify the image is available
minikube image ls | grep mcp-k8s-server

ステップ 4 — Kubernetes マニフェストを適用

# Apply in dependency order: SA → Role → Binding → Deployment
kubectl apply -f k8s/serviceaccount.yaml
kubectl apply -f k8s/role.yaml
kubectl apply -f k8s/rolebinding.yaml
kubectl apply -f k8s/deployment.yaml

ステップ 5 — Pod が実行中であることを確認

kubectl get pods -n mcp-system
# Expected:
# NAME                              READY   STATUS    RESTARTS   AGE
# mcp-k8s-server-xxxxxxxxx-xxxxx   1/1     Running   0          30s

kubectl logs -n mcp-system deploy/mcp-k8s-server
# Expected: "Using in-cluster Kubernetes config (ServiceAccount token)"

ステップ 6 — クラスター内で読み取り専用ツールをテスト

# Port-forward to access the server from your laptop
kubectl port-forward -n mcp-system svc/mcp-k8s-server 8000:8000 &

# Create a test pod to query
kubectl run nginx-test --image=nginx --restart=Never

# Test list_pods
curl -s http://localhost:8000/tools/list_pods \
  -H 'Content-Type: application/json' \
  -d '{"namespace":"default"}' | jq .

# Test get_pod_logs
curl -s http://localhost:8000/tools/get_pod_logs \
  -H 'Content-Type: application/json' \
  -d '{"pod_name":"nginx-test","namespace":"default","tail_lines":20}' | jq .

# Test analyze_pod_health
curl -s http://localhost:8000/tools/analyze_pod_health \
  -H 'Content-Type: application/json' \
  -d '{"namespace":"default","hours":1}' | jq .

ステップ 7 — RBAC が書き込み操作をブロックすることを証明

ServiceAccount には 書き込み動詞がありません。これを確認するには:

# Exec into the pod and try to delete another pod using the SA token
MCP_POD=$(kubectl get pod -n mcp-system -l app=mcp-k8s-server -o jsonpath='{.items[0].metadata.name}')

kubectl exec -n mcp-system $MCP_POD -- \
  kubectl delete pod nginx-test --namespace=default \
  --token=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) \
  --server=https://kubernetes.default.svc \
  --certificate-authority=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

期待される出力:

Error from server (Forbidden): pods "nginx-test" is forbidden:
  User "system:serviceaccount:mcp-system:mcp-server-sa" cannot delete
  resource "pods" in API group "" in the namespace "default"

API サーバーからのこの 403 Forbidden 応答は、RBAC スコープが機能していることの生の証拠です — ServiceAccount はリソースを読み取ることはできますが、変更することはできません。


RBAC 最小権限設計

哲学

必要なものだけを許可し、それ以外は明示的に拒否する。

MCP サーバーは 可観測性ツール です — オペレーターと AI システムが何が起こっているかを理解するためにクラスターの状態を読み取ります。リソースを作成、変更、または削除する正当な理由はありません。

許可されるもの

リソース

動詞

理由

pods

get, list, watch

list_pods, get_pod_status, analyze_pod_health

pods/log

get, list, watch

get_pod_logs, analyze_pod_health

deployments

get, list, watch

get_deployment_manifest, get_resource_trends

metrics.k8s.io/pods

get, list

get_resource_trends (Metrics API)

明示的に許可されないもの

動詞

除外理由

create

どのツールもリソースを作成しない

update / patch

どのツールもリソースを変更しない

delete / deletecollection

誤用された場合に壊滅的。読み取りツールには不要

escalate / bind

権限昇格を防止

つまり、侵害された MCP サーバーは、ポッドを削除したり、デプロイメントをゼロにスケールダウンしたり、シークレットを変更したり、実行中のワークロードに影響を与えることは できません。侵害された MCP サーバーの爆発半径は、情報の 読み取り に限定され、情報の破壊には及びません。


分析レイヤー

analyze_pod_health

  1. 名前空間内のすべてのポッドを一覧表示します。

  2. ポッドごとに最大 500 行のログを取得します。

  3. 既知の障害インジケーターのカタログとパターンマッチングを行います:

    • OOMKilled, CrashLoopBackOff

    • Python/Java 例外 (Traceback, RuntimeError など)

    • Panic, SIGSEGV/SIGKILL, 接続エラー, Permission denied

    • Liveness/Readiness プローブの失敗

  4. ポッドごとに ヘルススコア を計算します (低いほど悪い)。

  5. エラー頻度カウントとともに、最も悪いものから順にポッドを返します。

  6. 結果を SQLite に永続化し、履歴分析を可能にします。

  1. Deployment 仕様からポッドセレクターを解決します。

  2. ポッド仕様からリソース 制限 を読み取ります。

  3. Kubernetes Metrics API (metrics.k8s.io/v1beta1) にライブの CPU/メモリを問い合わせます。

  4. CPU とメモリの両方について、平均、ピーク、および制限に対する割合を計算します。

  5. 各スナップショットを mcp_analytics.db に 永続化 し、呼び出しをまたいで傾向が蓄積されるようにします。

metrics-server アドオンが必要: minikube addons enable metrics-server


CI / 継続的インテグレーション

GitHub Actions ワークフロー (.github/workflows/ci.yml) は、プッシュと PR のたびに実行されます:

  1. Docker Build — イメージをプッシュせずにビルドします (Dockerfile + 依存関係を検証)。

  2. kubeconform — すべての k8s/*.yaml マニフェストを Kubernetes 1.29 スキーマに対して厳格モードで検証します。

  3. ruff — k8s_mcp_server.py を Python エラーとスタイルについて lint します。


環境変数

変数

デフォルト

説明

MCP_DB_PATH

mcp_analytics.db

SQLite 分析データベースへのパス


ライセンス

MIT

Related MCP Connectors

Related MCP Servers