Cloud Platforms Go ★ 166

reza-gholizade/k8s-mcp-server

Kubernetes Model Context Protocol (MCP) sunucusu; API kaynak keşfi, kaynak yönetimi, pod logları, metrikler ve olayları içeren standartlaştırılmış bir arayüz aracılığıyla Kubernetes kümelerine etkileşim kurmak için araçlar sunar.

Claude Desktop config.json'a ekle

{
  "mcpServers": {
    "reza-gholizade-k8s-mcp-server": {
      "command": "node",
      "args": [
        "~/.mcp/k8s-mcp-server/index.js"
      ]
    }
  }
}

Kubernetes MCP Sunucusu

Kubernetes kümelerine standartlaştırılmış bir arayüz üzerinden etkileşim kurma araçları sağlayan bir Kubernetes Model Context Protocol (MCP) sunucusu.

Barındırılan dağıtım

Fronteir AI üzerinde barındırılan bir dağıtım mevcuttur.

Özellikler

  • API Kaynağı Keşfi: Kubernetes kümenizde mevcut olan tüm API kaynaklarını alın.
  • Kaynak Listeleme: İsteğe bağlı ad alanı ve etiket filtrelemesi ile herhangi bir türde kaynakları listeleyin.
  • Kaynak Detayları: Belirli Kubernetes kaynakları hakkında detaylı bilgi alın.
  • Kaynak Açıklaması: Kubernetes kaynakları hakkında kapsamlı açıklamalar alın, kubectl describe benzeri.
  • Pod Günlükleri: Belirli podlardan günlükleri alın (isteğe bağlı olarak belirli bir kapsayıcıdan, ya da belirtilmemişse tüm kapsayıcılardan).
  • Node Metrikleri: Belirli düğümler için kaynak kullanım metriklerini alın.
  • Pod Metrikleri: Belirli podlar için CPU ve Bellek metriklerini alın.
  • Olay Listeleme: Bir ad alanı içinde veya belirli bir kaynak için olayları listeleyin.
  • Kaynak Oluşturma/Güncelleme: YAML veya JSON manifestinden yeni Kubernetes kaynakları oluşturun veya mevcut olanları güncelleyin.
  • Kaynak Silme: Kubernetes kümesinde sağlanan ad alanı ve türe göre bir kaynağı siler.
  • Standartlaştırılmış Arayüz: Tutarlı araç etkileşimi için MCP protokolünü kullanır.
  • Esnek Yapılandırma: Farklı Kubernetes içerikleri ve kaynak kapsamlarını destekler.
  • Çoklu Modlar: CLI araçları için stdio modu, web uygulamaları için sse modu veya streamable-http modu, ve kümedeki değişiklikleri devre dışı bırakmak için --readonly modu kullanın.
  • Güvenlik: Docker kapsayıcılarında arttırılmış güvenlik için root olmayan kullanıcı olarak çalışır.

Ön Koşullar

  • Go 1.23 veya daha yeni
  • Kubernetes kümesine erişim
  • kubectl uygun küme erişimi ile yapılandırılmış

Kurulum

  1. Depoyu klonlayın:

    git clone https://github.com/reza-gholizade/k8s-mcp-server.git
    cd k8s-mcp-server
    
  2. Bağımlılıkları yükleyin:

    go mod download
    
  3. Sunucuyu derleyin:

    go build -o k8s-mcp-server main.go
    

Kullanım

Sunucuyu Başlatma

Sunucu üç modda çalışabilir, komut satırı bayrakları veya ortam değişkenleri aracılığıyla yapılandırılabilir.

Stdio Modu (CLI entegrasyonları için)

Bu mod standart girdi/çıktı kullanarak iletişim kurar.

./k8s-mcp-server --mode stdio

Veya ortam değişkenleri kullanarak:

SERVER_MODE=stdio ./k8s-mcp-server

SSE Modu (web uygulamaları için)

Bu mod Server-Sent Events desteği ile bir HTTP sunucusu başlatır.

Varsayılan (8080 portu):

./k8s-mcp-server --mode sse

Port belirtin:

./k8s-mcp-server --mode sse --port 9090

Veya ortam değişkenleri kullanarak:

SERVER_MODE=sse SERVER_PORT=9090 ./k8s-mcp-server

Streamable-HTTP Modu (web uygulamaları için)

Bu mod, MCP özelliklerine uygun olarak streamable-http taşıma desteği ile bir HTTP sunucusu başlatır.

Varsayılan (8080 portu):

./k8s-mcp-server --mode streamable-http

Port belirtin:

./k8s-mcp-server --mode streamable-http --port 9090

Veya ortam değişkenleri kullanarak:

SERVER_MODE=streamable-http SERVER_PORT=9090 ./k8s-mcp-server

Sunucu http://localhost:8080/mcp adresinde kullanılabilir olacaktır (veya belirttiğiniz port).

Mod belirtilmezse, varsayılan olarak 8080 portunda SSE olarak ayarlanır.

Kubernetes Kimlik Doğrulaması

Sunucu birden fazla kimlik doğrulama yöntemini destekler ve aşağıdaki öncelik sırasında denenirler:

1. Ortam Değişkeninden Kubeconfig İçeriği

KUBECONFIG_DATA ortam değişkeni aracılığıyla kubeconfig dosyasının tamamını sağlayabilirsiniz:

export KUBECONFIG_DATA="$(cat ~/.kube/config)"
./k8s-mcp-server

Bu, dosyaları monte etmekten kaçınmak istediğinizde veya dosya erişiminin kısıtlı olduğu ortamlarda çalışırken kullanışlıdır.

2. API Sunucusu URL'si ve Token'ı

Kubernetes API sunucusu URL'si ve bearer token kullanarak kimlik doğrulaması yapabilirsiniz:

export KUBERNETES_SERVER="https://kubernetes.example.com:6443"
export KUBERNETES_TOKEN="your-bearer-token-here"
./k8s-mcp-server

TLS yapılandırması için isteğe bağlı ortam değişkenleri:

  • KUBERNETES_CA_CERT: CA sertifikası içeriği (base64 kodlanmış veya PEM formatı)
  • KUBERNETES_CA_CERT_PATH: CA sertifikası dosyasının yolu
  • KUBERNETES_INSECURE: TLS doğrulamasını atlamak için "true" olarak ayarlayın (üretim için önerilmez)

CA sertifikası ile örnek:

export KUBERNETES_SERVER="https://kubernetes.example.com:6443"
export KUBERNETES_TOKEN="your-bearer-token-here"
export KUBERNETES_CA_CERT_PATH="/path/to/ca.crt"
./k8s-mcp-server

3. Küme İçi Kimlik Doğrulaması (Service Account)

Kubernetes kümesi içinde çalışırken, sunucu /var/run/secrets/kubernetes.io/serviceaccount/token adresinden hizmet hesabı token'ını otomatik olarak algılar ve kullanır. Bu, sunucuyu bir pod olarak küme içinde çalıştırmak için önerilen yöntemdir.

Örnek Dağıtım:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: k8s-mcp-server-sa
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: k8s-mcp-server-role
rules:
  - apiGroups: [""]
    resources: ["*"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  - apiGroups: ["apps"]
    resources: ["*"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  # Kullanım durumunuz için gerekli olduğu kadar kural ekleyin
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: k8s-mcp-server-rb
subjects:
  - kind: ServiceAccount
    name: k8s-mcp-server-sa
    namespace: default
roleRef:
  kind: ClusterRole
  name: k8s-mcp-server-role
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-mcp-server
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8s-mcp-server
  template:
    metadata:
      labels:
        app: k8s-mcp-server
    spec:
      serviceAccountName: k8s-mcp-server-sa
      containers:
        - name: k8s-mcp-server
          image: ginnux/k8s-mcp-server:latest
          ports:
            - containerPort: 8080
          env:
            - name: SERVER_MODE
              value: "sse"
            - name: SERVER_PORT
              value: "8080"

4. Kubeconfig Dosya Yolu (Varsayılan)

Yukarıdaki yöntemlerden hiçbiri mevcut değilse, sunucu bir kubeconfig dosyasını kullanmaya döner:

  • --kubeconfig bayrağı (eğer uygulanmışsa) veya KUBECONFIG ortam değişkeni aracılığıyla sağlanan yolu kullanır
  • Hiçbiri belirtilmemişse ~/.kube/config dosyasına döner
# Varsayılan ~/.kube/config kullanın
./k8s-mcp-server

# Özel kubeconfig yolunu kullanın
export KUBECONFIG=/path/to/your/kubeconfig
./k8s-mcp-server

Not: Sunucu mevcut ortam değişkenlerine ve dosya sistemi temelinde hangi kimlik doğrulama yönteminin kullanılacağını otomatik olarak algılar. Kimlik doğrulama yöntemini açıkça yapılandırmanız gerekmez - yukarıda listelenen öncelik sırasına göre ilk kullanılabilir yöntemi kullanacaktır.

Salt Okunur Modu

Sunucu, tüm yazma işlemlerini devre dışı bırakan ve Kubernetes kümenizi değişiklik riski olmadan keşfetme ve izleme konusunda daha güvenli bir yol sağlayan salt okunur bir modu destekler.

--read-only bayrağı ile salt okunur modu etkinleştirin:

./k8s-mcp-server --read-only

Salt okunur modu herhangi bir sunucu modunda birleştirebilirsiniz:

# stdio modu ile salt okunur
./k8s-mcp-server --mode stdio --read-only

# SSE modu ile salt okunur
./k8s-mcp-server --mode sse --read-only

# streamable-http modu ile salt okunur
./k8s-mcp-server --mode streamable-http --read-only

Salt okunur modu etkinleştirildiğinde, aşağıdaki araçlar devre dışı bırakılır:

  • createResource (Kubernetes kaynağı oluşturma/güncellemeler)
  • helmInstall (Helm grafik yüklemeleri)
  • helmUpgrade (Helm grafik yükseltmeleri)
  • helmUninstall (Helm grafik kaldırmaları)
  • helmRollback (Helm sürümü geri almaları)
  • helmRepoAdd (Helm depo eklemeleri)

Kaynakları listeleme, günlükleri alma, metrikleri görüntüleme ve Helm sürümlerini inceleme dahil diğer tüm salt okunur işlemler kullanılabilir kalır.

Araç Kategori Bayrakları

Bu bayrakları kullanarak araç kategorilerini seçici olarak devre dışı bırakabilirsiniz:

Kubernetes Araçlarını Devre Dışı Bırakın:

./k8s-mcp-server --no-k8s

Helm Araçlarını Devre Dışı Bırakın:

./k8s-mcp-server --no-helm

Diğer bayraklarla birleştirin:

# Yalnızca Kubernetes araçları ile salt okunur modu (Helm yok)
./k8s-mcp-server --read-only --no-helm

# Yalnızca Helm araçları ile salt okunur modu (Kubernetes yok)
./k8s-mcp-server --read-only --no-k8s

# Yalnızca Kubernetes araçları ile SSE modu
./k8s-mcp-server --mode sse --no-helm

Not: Her ikisi birlikte --no-k8s ve --no-helm kullanamazsınız, çünkü bu kullanılabilir araç olmadığını sonuçlandırır. Her iki bayrak sağlanırsa sunucu bir hatayla çıkacaktır.

--no-k8s etkinleştirildiğinde, tüm Kubernetes araçları devre dışı bırakılır:

  • getAPIResources, listResources, getResource, describeResource
  • getPodsLogs, getNodeMetrics, getPodMetrics, getEvents
  • createResource (salt okunur modda değilse)

--no-helm etkinleştirildiğinde, tüm Helm araçları devre dışı bırakılır:

  • helmList, helmGet, helmHistory, helmRepoList
  • helmInstall, helmUpgrade, helmUninstall, helmRollback, helmRepoAdd (salt okunur modda değilse)

Docker İmajını Kullanma

Sunucuyu Docker Hub'dan önceden derlenen Docker imajını kullanarak da çalıştırabilirsiniz.

  1. İmajı çekin:

    docker pull ginnux/k8s-mcp-server:latest
    

    latest yerine belirli bir sürüm etiketi (örneğin, 1.0.0) yazabilirsiniz.

  2. Konteyner'i çalıştırın:

    Not: Sunucu birden fazla kimlik doğrulama yöntemini destekler. Kubeconfig dosyasını monte edebilir (aşağıda gösterildiği gibi) veya kimlik doğrulaması için ortam değişkenlerini kullanabilirsiniz (Kubernetes Kimlik Doğrulaması bölümüne bakın).

    • SSE Modu (imajın varsayılan davranışı):

      docker run -p 8080:8080 -v ~/.kube/config:/home/appuser/.kube/config:ro ginnux/k8s-mcp-server:latest
      

      Bu, konteynerün 8080 portunu ana makinenizdeki 8080 portuna eşler ve Kubernetes yapılandırmanızı salt okunur olarak root olmayan kullanıcının giriş dizinine monte eder. Sunucu http://localhost:8080 adresinde kullanılabilir olacaktır. İmaj varsayılan olarak 8080 portunda sse modu ile çalışır.

    • Streamable-HTTP Modu:

      docker run -p 8080:8080 -v ~/.kube/config:/home/appuser/.kube/config:ro ginnux/k8s-mcp-server:latest --mode streamable-http
      

      Bu, sunucuyu streamable-http modunda çalıştırır. Sunucu http://localhost:8080/mcp adresinde kullanılabilir olacaktır.

    • Stdio Modu:

      docker run -i --rm -v ~/.kube/config:/home/appuser/.kube/config:ro ginnux/k8s-mcp-server:latest --mode stdio
      

      -i bayrağı etkileşimli stdio iletişimi için önemlidir. --rm çıkıştan sonra konteyner'i temizler.

    • SSE Modu için Özel Port:

      docker run -p 9090:9090 -v ~/.kube/config:/home/appuser/.kube/config:ro ginnux/k8s-mcp-server:latest --mode sse --port 9090
      
    • Streamable-HTTP Modu için Özel Port:

      docker run -p 9090:9090 -v ~/.kube/config:/home/appuser/.kube/config:ro ginnux/k8s-mcp-server:latest --mode streamable-http --port 9090
      
    • Alternatif: Tüm .kube dizinini monte edin:

      docker run -p 8080:8080 -v ~/.kube:/home/appuser/.kube:ro ginnux/k8s-mcp-server:latest
      
    • Kimlik doğrulaması için ortam değişkenleri kullanma (dosya monte etme gerekmez):

      # Ortam değişkeninden kubeconfig içeriği kullanma
      docker run -p 8080:8080 \
        -e KUBECONFIG_DATA="$(cat ~/.kube/config)" \
        ginnux/k8s-mcp-server:latest
      
      # Veya API sunucusu URL'si ve token kullanma
      docker run -p 8080:8080 \
        -e KUBERNETES_SERVER="https://kubernetes.example.com:6443" \
        -e KUBERNETES_TOKEN="your-token-here" \
        -e KUBERNETES_CA_CERT_PATH="/path/to/ca.crt" \
        -v /path/to/ca.crt:/path/to/ca.crt:ro \
        ginnux/k8s-mcp-server:latest
      

Docker Compose ile Kullanma

Bir docker-compose.yml dosyası oluşturun:

Seçenek 1: Kubeconfig dosyası kullanma (geleneksel yöntem):

version: '3.8'
services:
  k8s-mcp-server:
    image: ginnux/k8s-mcp-server:latest # Veya belirli bir sürüm
    container_name: k8s-mcp-server
    ports:
      - "8080:8080" # Host:Container, farklı bir SERVER_PORT kullanıyorsanız ayarlayın
    volumes:
      - ~/.kube:/home/appuser/.kube:ro # Kubeconfig'i root olmayan kullanıcı ev dizinine salt okunur olarak monte edin
    environment:
      - KUBECONFIG=/home/appuser/.kube/config
      - SERVER_MODE=sse # 'stdio', 'sse' veya 'streamable-http' olabilir
      - SERVER_PORT=8080 # SSE/streamable-http modları için port
    # command: ["--read-only"] # Salt okunur modu etkinleştirmek için bu satırı açın
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s

Seçenek 2: Ortam değişkenleri kullanma (dosya monte etme yok):

version: '3.8'
services:
  k8s-mcp-server:
    image: ginnux/k8s-mcp-server:latest
    container_name: k8s-mcp-server
    ports:
      - "8080:8080"
    environment:
      - KUBECONFIG_DATA=${KUBECONFIG_DATA} # Bunu .env dosyasında veya shell'de ayarlayın
      # Veya API sunucusu ve token kullanın:
      # - KUBERNETES_SERVER=https://kubernetes.example.com:6443
      # - KUBERNETES_TOKEN=${KUBERNETES_TOKEN}
      - SERVER_MODE=sse
      - SERVER_PORT=8080
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s

Not: Salt okunur modu etkinleştirmek için, Seçenek 1'de gösterildiği gibi command geçersiz kılmasını kullanın. Stdio modu için, 'ports'u ayarlamanız, 'stdin_open: true' ve 'tty: true' eklemeniz ve potansiyel olarak komutu geçersiz kılmanız gerekebilir.

Sonra başlatın:

docker compose up -d

Günlükleri görmek için: docker compose logs -f k8s-mcp-server.

Güvenlik Hususları

Docker imajı, arttırılmış güvenlik için root olmayan bir kullanıcı (appuser UID 1001 ile) olarak çalışır:

  • Uygulama ikilisi /usr/local/bin/k8s-mcp-server adresinde bulunur
  • Kubeconfig, /home/appuser/.kube/config adresine monte edilmelidir
  • Konteyner durumunu izlemek için sistem durumu kontrolleri etkindir
  • Konteyner, minimal bağımlılıklar içerir (yalnızca ca-certificates ve curl)

API Çağrıları Yapma (SSE/Streamable-HTTP Modu)

Sunucu SSE veya streamable-http modunda çalışırken, HTTP endpoint'ine JSON-RPC çağrıları yapabilirsiniz:

curl -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getAPIResources",
    "arguments": {
      "includeNamespaceScoped": true,
      "includeClusterScoped": true
    }
  }
}' http://localhost:8080/

Sistem durumunu da kontrol edebilirsiniz:

curl -f http://localhost:8080/

Kullanılabilir Araçlar

1. getAPIResources

Kubernetes kümesindeki tüm kullanılabilir API kaynaklarını alır.

Parametreler:

  • includeNamespaceScoped (boolean, isteğe bağlı): Ad alanı kapsamlı kaynakları dahil edilip edilmeyeceği (varsayılan true).
  • includeClusterScoped (boolean, isteğe bağlı): Küme kapsamlı kaynakları dahil edilip edilmeyeceği (varsayılan true).

Örnek:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getAPIResources",
    "arguments": {
      "includeNamespaceScoped": true,
      "includeClusterScoped": true
    }
  }
}

2. listResources

Belirli kaynak türüne ait tüm örnekleri listeler.

Parametreler:

  • Kind (string, gerekli): Listelenecek kaynağın türü (örneğin, "Pod", "Deployment").
  • namespace (string, isteğe bağlı): Kaynakları listeleyeceğiniz ad alanı. Atlanırsa, ad alanı kapsamlı kaynaklar için tüm ad alanları arasında listeler (RBAC'a tabi).
  • labelSelector (string, isteğe bağlı): Etiket seçicisine göre kaynakları filtreleyin (örneğin, "app=nginx,env=prod").

Örnek:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "listResources",
    "arguments": {
      "Kind": "Pod",
      "namespace": "default",
      "labelSelector": "app=nginx"
    }
  }
}

3. getResource

Belirli bir kaynak hakkında detaylı bilgiler alır.

Parametreler:

  • kind (string, gerekli): Alınacak kaynağın türü (örneğin, "Pod", "Deployment").
  • name (string, gerekli): Alınacak kaynağın adı.
  • namespace (string, isteğe bağlı): Kaynağın ad alanı (ad alanı kapsamlı kaynaklar için gerekli).

Örnek:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getResource",
    "arguments": {
      "kind": "Pod",
      "name": "nginx-pod",
      "namespace": "default"
    }
  }
}

4. describeResource

Kubernetes kümesinde bir kaynağı açıklar, kubectl describe benzeri.

Parametreler:

  • Kind (string, gerekli): Açıklanacak kaynağın türü (örneğin, "Pod", "Deployment").
  • name (string, gerekli): Açıklanacak kaynağın adı.
  • namespace (string, isteğe bağlı): Kaynağın ad alanı (ad alanı kapsamlı kaynaklar için gerekli).

Örnek:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "describeResource",
    "arguments": {
      "Kind": "Pod",
      "name": "nginx-pod",
      "namespace": "default"
    }
  }
}

5. getPodsLogs

Belirli bir pod'un günlüklerini alır.

Parametreler:

  • Name (string, gerekli): Pod'un adı.
  • namespace (string, gerekli): Pod'un ad alanı.
  • containerName (string, isteğe bağlı): Pod içindeki belirli kapsayıcı adı. Atlanırsa:
    • Pod'un bir kapsayıcısı varsa, günlükleri alınır.
    • Pod'un birden fazla kapsayıcısı varsa, tüm kapsayıcılardan günlükler alınır ve birleştirilir.

Örnek:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getPodsLogs",
    "arguments": {
      "Name": "my-app-pod-12345",
      "namespace": "production",
      "containerName": "main-container"
    }
  }
}

6. getNodeMetrics

Belirli bir düğüm için kaynak kullanım metriklerini alır.

Parametreler:

  • Name (string, gerekli): Düğümün adı.

Örnek:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getNodeMetrics",
    "arguments": {
      "Name": "worker-node-1"
    }
  }
}

7. getPodMetrics

Belirli bir pod için CPU ve Bellek metriklerini alır.

Parametreler:

  • namespace (string, gerekli): Pod'un ad alanı.
  • podName (string, gerekli): Pod'un adı.

Örnek:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getPodMetrics",
    "arguments": {
      "namespace": "default",
      "podName": "my-app-pod-67890"
    }
  }
}

8. getEvents

Belirli bir ad alanı veya kaynak için olayları alır.

Parametreler:

  • namespace (string, isteğe bağlı): Ol

Benzer MCP sunucuları

Daha fazla: Cloud Platforms →