From 4d1cee05ba378d9efcb75f4c7abac3442b4792c8 Mon Sep 17 00:00:00 2001 From: Luis Erlacher Date: Tue, 28 Oct 2025 11:40:25 -0300 Subject: [PATCH] feat(k8s): Add Kubernetes support to service discovery - Add Environment.KUBERNETES mode - Detect via SERVICE_DISCOVERY_MODE env var - Use full DNS URLs from ConfigMap (API_SERVICE_URL, etc.) - Fixes MCP connection issues in Kubernetes cluster Resolves: MCP 'All connection attempts failed' error --- python/src/server/config/service_discovery.py | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/python/src/server/config/service_discovery.py b/python/src/server/config/service_discovery.py index 82b1efd..6d064e4 100644 --- a/python/src/server/config/service_discovery.py +++ b/python/src/server/config/service_discovery.py @@ -16,6 +16,7 @@ class Environment(Enum): """Deployment environment types""" DOCKER_COMPOSE = "docker_compose" + KUBERNETES = "kubernetes" LOCAL = "local" @@ -74,6 +75,11 @@ class ServiceDiscovery: @staticmethod def _detect_environment() -> Environment: """Detect the current deployment environment""" + # Check for explicit Kubernetes mode (via ConfigMap) + service_discovery_mode = os.getenv("SERVICE_DISCOVERY_MODE", "").lower() + if service_discovery_mode == "kubernetes": + return Environment.KUBERNETES + # Check for Docker environment if os.path.exists("/.dockerenv") or os.getenv("DOCKER_CONTAINER"): return Environment.DOCKER_COMPOSE @@ -104,7 +110,21 @@ class ServiceDiscovery: f"Unknown service: {service}. Valid services are: {list(self.DEFAULT_PORTS.keys())}" ) - if self.environment == Environment.DOCKER_COMPOSE: + if self.environment == Environment.KUBERNETES: + # Kubernetes mode - use full service URLs from ConfigMap + service_url_map = { + "api": os.getenv("API_SERVICE_URL"), + "mcp": os.getenv("MCP_SERVICE_URL"), + "agents": os.getenv("AGENTS_SERVICE_URL"), + } + url = service_url_map.get(service) + if not url: + raise ValueError( + f"Kubernetes mode enabled but {service.upper()}_SERVICE_URL not set. " + f"Please ensure API_SERVICE_URL, MCP_SERVICE_URL, and AGENTS_SERVICE_URL are configured." + ) + + elif self.environment == Environment.DOCKER_COMPOSE: # Docker Compose uses service names directly # Check for override via environment variable host = os.getenv(f"{service_name.upper().replace('-', '_')}_HOST", service_name) @@ -177,6 +197,11 @@ class ServiceDiscovery: if not service.startswith("archon-") # Skip duplicates } + @property + def is_kubernetes(self) -> bool: + """Check if running in Kubernetes""" + return self.environment == Environment.KUBERNETES + @property def is_docker(self) -> bool: """Check if running in Docker"""