From 01a6ce5fb249548d82f6510565b947b21f33be89 Mon Sep 17 00:00:00 2001 From: adam jones Date: Wed, 13 Aug 2025 19:12:25 +0100 Subject: [PATCH] infra: Update Ingress configuration to support prod registry domain at registry.modelcontextprotocol.io (#266) i.e. ```diff staging.registry.modelcontextprotocol.io -> staging prod.registry.modelcontextprotocol.io -> prod + registry.modelcontextprotocol.io -> prod ``` --- deploy/pkg/k8s/registry.go | 61 ++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/deploy/pkg/k8s/registry.go b/deploy/pkg/k8s/registry.go index 266239c..10f860d 100644 --- a/deploy/pkg/k8s/registry.go +++ b/deploy/pkg/k8s/registry.go @@ -145,7 +145,15 @@ func DeployMCPRegistry(ctx *pulumi.Context, cluster *providers.ProviderInfo, env } // Create Ingress - domain := "%s.registry.modelcontextprotocol.io" + hosts := []string{ + environment + ".registry.modelcontextprotocol.io", + } + + // Add root domain for prod environment + if environment == "prod" { + hosts = append(hosts, "registry.modelcontextprotocol.io") + } + ingress, err := networkingv1.NewIngress(ctx, "mcp-registry", &networkingv1.IngressArgs{ Metadata: &metav1.ObjectMetaArgs{ Name: pulumi.String("mcp-registry"), @@ -155,46 +163,55 @@ func DeployMCPRegistry(ctx *pulumi.Context, cluster *providers.ProviderInfo, env "environment": pulumi.String(environment), }, Annotations: pulumi.StringMap{ - "kubernetes.io/ingress.class": pulumi.String("nginx"), + "cert-manager.io/cluster-issuer": pulumi.String("letsencrypt-prod"), + "kubernetes.io/ingress.class": pulumi.String("nginx"), }, }, Spec: &networkingv1.IngressSpecArgs{ Tls: networkingv1.IngressTLSArray{ &networkingv1.IngressTLSArgs{ - Hosts: pulumi.StringArray{ - pulumi.Sprintf(domain, environment), - }, + Hosts: pulumi.ToStringArray(hosts), SecretName: pulumi.Sprintf("mcp-registry-%s-tls", environment), }, }, - Rules: networkingv1.IngressRuleArray{ - &networkingv1.IngressRuleArgs{ - Host: pulumi.Sprintf(domain, environment), - Http: &networkingv1.HTTPIngressRuleValueArgs{ - Paths: networkingv1.HTTPIngressPathArray{ - &networkingv1.HTTPIngressPathArgs{ - Path: pulumi.String("/"), - PathType: pulumi.String("Prefix"), - Backend: &networkingv1.IngressBackendArgs{ - Service: &networkingv1.IngressServiceBackendArgs{ - Name: service.Metadata.Name().Elem(), - Port: &networkingv1.ServiceBackendPortArgs{ - Number: pulumi.Int(80), + Rules: pulumi.ToStringArray(hosts).ToStringArrayOutput().ApplyT(func(hosts []string) networkingv1.IngressRuleArray { + rules := make(networkingv1.IngressRuleArray, 0, len(hosts)) + for _, host := range hosts { + rules = append(rules, &networkingv1.IngressRuleArgs{ + Host: pulumi.String(host), + Http: &networkingv1.HTTPIngressRuleValueArgs{ + Paths: networkingv1.HTTPIngressPathArray{ + &networkingv1.HTTPIngressPathArgs{ + Path: pulumi.String("/"), + PathType: pulumi.String("Prefix"), + Backend: &networkingv1.IngressBackendArgs{ + Service: &networkingv1.IngressServiceBackendArgs{ + Name: service.Metadata.Name().Elem(), + Port: &networkingv1.ServiceBackendPortArgs{ + Number: pulumi.Int(80), + }, }, }, }, }, }, - }, - }, - }, + }) + } + return rules + }).(networkingv1.IngressRuleArrayOutput), }, }, pulumi.Provider(cluster.Provider)) if err != nil { return nil, err } - ctx.Export("ingressHost", ingress.Spec.Rules().Index(pulumi.Int(0)).Host()) + ctx.Export("ingressHosts", ingress.Spec.Rules().ApplyT(func(rules []networkingv1.IngressRule) []string { + hosts := make([]string, 0, len(rules)) + for _, rule := range rules { + hosts = append(hosts, *rule.Host) + } + return hosts + })) return service, nil }