Zpět na domů

Nasazení MCP serverů v Kubernetes: architektura a JWT

Článek popisuje migraci MCP serverů z lokálního spuštění k centralizované infrastruktuře v Kubernetes. Jsou zváženy vzory sidecar-proxování, nastavení JWT autentizace přes Envoy a správa tajemství pomocí Vault.

Jak nasadit MCP servery v Kubernetes pro celý tým
Advertisement 728x90

# Centralizované nasazení MCP serverů v Kubernetes: architektura, autentizace a správa tajemství

Lokální spuštění MCP serverů prostřednictvím balíčkových manažerů nebo kontejnerů se rychle stává úzkým místem při škálování AI infrastruktury na tým. Rozptýlené runtime prostředí, nekontrolované šíření přihlašovacích údajů a absence jediné vstupní body blokují bezpečnou integraci jazykových modelů do firemního okruhu. V tomto článku je rozebrán praktický postup migrace od izolovaných instancí k centralizované architektuře v Kubernetes s využitím sidecar proxy, validace JWT a orchestrace tajemství.

Evoluce architektury: od lokálních procesů k kontejnerizaci

Na počáteční fázi zavádění Model Context Protocol stačí použít připravené remote endpointy od dodavatelů. Konfigurace se omezí na zadání URL v klientské aplikaci, zatímco autentizaci a škálování přebírá poskytovatel. Při připojování interních systémů (Kubernetes, Grafana, databáze) však vzniká potřeba spouštět servery samostatně.

Standardní přístup přes lokální volání npx, uvx nebo kompilovaných binárních souborů vytváří problém se správou závislostí. Každá integrace vyžaduje samostatné runtime prostředí, což vede ke konfliktům verzí a zkomplikuje onboarding nových zaměstnanců. Navíc ukládání tokenů přístupu k produkčním prostředím do lokálních konfiguračních souborů porušuje základní principy informační bezpečnosti.

Google AdInline article slot

Kontejnerizace řeší problém izolace prostředí. Spuštění každého MCP serveru v samostatném kontejneru s prohlašováním proměnných prostředí umožňuje standardizovat nasazení na úrovni jedné pracovní stanice. Příklad konfigurace pro izolované spuštění:

{
  "mcpServers": {
    "grafana": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-e", "GRAFANA_URL",
        "-e", "GRAFANA_SERVICE_ACCOUNT_TOKEN",
        "grafana/mcp-grafana",
        "-t", "stdio"
      ],
      "env": {
        "GRAFANA_URL": "https://grafana.example.com",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<token>"
      }
    }
  }
}

Navzdory zlepšení izolace lokální Docker nevyřešuje úkol kolektivního přístupu. Automatizované pipeline, CI/CD systémy a netechničtí specialisté nemohou efektivně interagovat s rozptýlenými kontejnery. Vzniká potřeba přesunout MCP servery do společné infrastruktury s centralizovanou správou životního cyklu.

Orchestrace v Kubernetes: proxy a univerzální nasazení

Přesun MCP serverů do klastru vyžaduje řešení architektoní nekompatibility: většina serverů pracuje přes stdio, zatímco síťová interakce v Kubernetes je založena na HTTP a HTTPS. K odstranění tohoto rozporu se používá sidecar pattern s využitím MCP Gateway. Proxy kontejner přijímá příchozí HTTP požadavky (Streamable HTTP nebo SSE), převádí je do standardního vstupního proudu cílového procesu a vrací odpověď zpět do sítě.

Google AdInline article slot

Protože MCP servery v režimu Streamable HTTP jsou stateless služby, ideálně se hodí pro horizontální škálování přes HPA. Aby se zabránilo duplikování manifestů pro každou integraci, je vhodné použít univerzální Helm chart, který podporuje dva režimy provozu:

  • proxy — spuštění sidecar kontejneru pro převod HTTP na stdio.
  • native — přímé vystavení služeb, které již podporují HTTP transport.

Konfigurace nasazení přes values.yaml umožňuje flexibilní správu síťových nastavení, prohlašování tajemství a směrování:

mode: proxy
proxy:
  image:
    repository: node
    tag: "20-bookworm"
    pullPolicy: IfNotPresent
  gateway:
    package: "@michlyn/mcpgateway"
    stdioCommand: "npx -y @digitalocean/mcp --services apps,droplets,doks,networking"
    outputTransport: streamable-http
    port: 8080
    httpPath: /mcp
vault:
  enabled: true
  role: "mcp"
  path: "kubernetes_dev-fra1-01"
env:
  - name: DIGITALOCEAN_API_TOKEN
    value: vault:devops/data/ai/mcp/digitalocean#token
ingress:
  enabled: true
  className: "internal"
  annotations:
    nginx.ingress.kubernetes.io/proxy-buffering: "off"
    nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"

Integrace s HashiCorp Vault nebo External Secrets Operator zaručuje, že přihlašovací údaje se nedostanou do systému kontroly verzí. Ingress controller nebo Gateway API zajišťuje směrování, zatímco vypnutí bufrizace a zvýšení timeoutů je nutné pro správnou funkci dlouhodobých spojení a streamování dat.

Google AdInline article slot

Bezpečnost a autentizace: JWT, Envoy a správa přístupu

Absence vestavěných mechanismů autentizace v samotném protokolu MCP vyžaduje implementaci ochrany na úrovni infrastrukturního šgateway. Základní autentizace nenabízí dostatečnou úroveň bezpečnosti pro firemní prostředí, proto je optimální volbou validace JWT přes Envoy Gateway. Šgateway kontroluje podpis tokenu, vydavatele a publikum dříve, než požadavek dosáhne podu s MCP serverem.

Generování klíčů a tokenů probíhá standardními kryptografickými nástroji. Veřejný klíč se zabalí do formátu JWKS a umístí do ConfigMap, odkud ho Envoy načte pro ověření:

# Generace RSA klíčů a vytvoření JWT
openssl genrsa -out mcp-jwt-private.pem 4096
openssl rsa -in mcp-jwt-private.pem -pubout -out mcp-jwt-public.pem
KID=$(openssl rand -hex 16)
HEADER=$(echo -n "{\"alg\":\"RS256\",\"typ\":\"JWT\",\"kid\":\"${KID}\"}" | base64 -w0 | tr '+/' '-_' | tr -d '=')
PAYLOAD=$(echo -n "{\"sub\":\"claude-desktop\",\"aud\":\"mcp-servers\",\"iss\":\"https://your-domain.com\",\"iat\":$(date +%s),\"exp\":$(( $(date +%s) + 31536000 ))}" | base64 -w0 | tr '+/' '-_' | tr -d '=')
SIGNATURE=$(echo -n "${HEADER}.${PAYLOAD}" | openssl dgst -sha256 -sign mcp-jwt-private.pem | base64 -w0 | tr '+/' '-_' | tr -d '=')
echo "${HEADER}.${PAYLOAD}.${SIGNATURE}"

Na současné úrovni vývoje protokolu zůstává řada architektoních omezení. Přístup k cílovým systémům probíhá přes jednotné servisní účty, což je přijatelné pro čtení, ale vytváří rizika při zápisech. Protokol nepřenáší kontext koncového uživatele, což blokuje uživatelskou autorizaci a detailní audit volání nástrojů. Logování na úrovni Envoy zachycuje jen síťové metadata, ne parametry volání konkrétních MCP metod.

Co je důležité

  • Lokální spuštění MCP serverů se nesháluje na tým kvůli konfliktům runtime a riziku úniku přihlašovacích údajů.
  • Sidecar pattern s MCP Gateway řeší nekompatibilitu stdio transportu a síťových protokolů Kubernetes.
  • Stateless architektura Streamable HTTP umožňuje použít standardní HPA pro automatické horizontální škálování.
  • Validaci JWT a směrování je třeba vyvést na úroveň API Gateway, protože protokol sám o sobě nemá mechanismy autentizace.
  • Absence přenosu uživatelského kontextu v MCP zatím omezuje možnosti granulární autorizace a end-to-end auditu.

— Editorial Team

Advertisement 728x90

Číst dál