Skip to content

Control Plane — Deployment (June 2026)

Archived 2026-10-09

This June-2026 narrative page was superseded by the rewritten page at planes/control/deployment.md (design plan P1). The sixteen-service, two-namespace shape on Azure Service Bus is not current direction; the 2026 design ships one modular host over the MessagingModel port. It is kept for provenance.

Historical — archived

This page is kept for provenance. Its dates, targets and technology statements are not current direction. See the linked replacement page.

The Control Plane was to run as a fleet of independently deployable containerized .NET 10 / ASP.NET Core services on Azure, provisioned with Pulumi and delivered through the factory's own DevOps & GitOps pipelines. Each microservice was a separately versioned, separately scaled deployment unit with its own database.

Runtime Model (June 2026)

Concern Choice
Orchestration AKS (core services & sagas) + Azure Container Apps (workers, bursty consumers).
Packaging OCI containers built from ConnectSoft.MicroserviceTemplate / ConnectSoft.WorkerTemplate.
Messaging Azure Service Bus (MassTransit transport).
Data Azure SQL / Azure Database for PostgreSQL (per service), Azure Cache for Redis.
Identity OpenIddict authorization server; workload identity via Azure AD-managed identities.
Ingress ConnectSoft.ApiGatewayTemplate fronts public APIs; internal/gRPC traffic stays in-cluster.
IaC Pulumi (clusters, namespaces, data stores, Service Bus, Key Vault, DNS, autoscaling).
Secrets Azure Key Vault via CSI driver + workload identity.

Deployment Topology (June 2026)

flowchart TB
    Gateway["API Gateway<br/>(ConnectSoft.ApiGatewayTemplate)"] --> CoreNs

    subgraph AKS["AKS Cluster"]
        subgraph CoreNs["Namespace: control-plane-core"]
            WfOrch["WorkflowOrchestrator (sagas)"]
            TaskSvc["TaskAssignmentService"]
            Policy["PolicyEngineService"]
            Tenant["TenantService"]
            Identity["IdentityService / AuthorizationService"]
        end
        subgraph SvcNs["Namespace: control-plane-services"]
            Project["Project / Blueprint / Agent services"]
            Approval["ApprovalService / AuditService"]
            Cost["CostUsageService"]
            Integration["IntegrationService"]
        end
    end

    subgraph ACA["Azure Container Apps"]
        Workers["Workers<br/>(timeout, assignment, projection,<br/>quota, rollup, audit-export, validation,<br/>dependency, replay)"]
    end

    CoreNs --> ServiceBus["Azure Service Bus"]
    SvcNs --> ServiceBus
    Workers --> ServiceBus
    CoreNs --> SQL["Azure SQL (per service)"]
    SvcNs --> PG["PostgreSQL (per service)"]
    CoreNs --> Redis["Azure Cache for Redis"]
    CoreNs --> KeyVault["Azure Key Vault"]
    SvcNs --> KeyVault
    Workers --> KeyVault
Hold "Alt" / "Option" to enable pan & zoom

Scaling (June 2026)

Workload class Scaling signal Strategy
API services CPU + request rate Horizontal Pod Autoscaler (AKS); min 2 replicas for HA.
Saga core (WorkflowOrchestrator) Saga throughput + queue depth Scale by partitioned correlation.
Workers (event-driven) Service Bus queue depth (KEDA) Scale-to-many on backlog, scale-to-zero when idle (ACA).
Read models (ProcessStateService) Read QPS Scale out replicas; Redis hot cache absorbs spikes.
Hot-path gRPC (Policy, Quota, TaskAssignment) RPS + latency SLO Over-provision; circuit breakers protect dependents.

Configuration, Secrets, Health (June 2026)

  • Layered config: appsettings.json → environment overrides → Key Vault secrets → runtime feature flags (FeatureFlagService), bound through ConnectSoft.Extensions.Options.
  • Per-environment Pulumi stacks (dev, test, staging, prod); editions select shared vs dedicated data isolation.
  • Connection strings, OpenIddict keys and integration credentials in Key Vault via workload identity; IntegrationConnection aggregates store only a configRef.
  • Standard probes (/health/live, /health/ready, /health/startup) aggregated by ConnectSoft.HealthChecksAggregatorTemplate; probes gate rollouts.

Deployment Pipeline & Resilience (June 2026)

GitOps delivery through environments; zero-downtime rolling updates with expand/contract migrations; retries, circuit breakers, timeouts; Service Bus dead-letter queues preserving the full envelope; multi-zone deployment; OpenTelemetry traces keyed on traceId.