Skip to content

Deployment Topology

In Falcone is deployed via a Helm umbrella chart that supports multiple profiles, environments, and platforms.

Umbrella Chart

The charts/in-falcone/ Helm chart uses a component-wrapper subchart pattern — a single reusable template that generates Kubernetes resources (Deployment/StatefulSet, Service, PVC, ConfigMap, ServiceAccount) for each platform component.

charts/in-falcone/
├── Chart.yaml                    # Umbrella chart (v0.3.0)
├── values.yaml                   # Base values (3000+ lines)
├── values.schema.json            # Value validation schema
├── templates/
│   ├── _helpers.tpl              # Shared template functions
│   ├── namespace.yaml            # Namespace creation
│   ├── bootstrap-job.yaml        # Post-install/upgrade bootstrap
│   ├── bootstrap-rbac.yaml       # Bootstrap RBAC
│   ├── bootstrap-payload-configmap.yaml
│   ├── bootstrap-script-configmap.yaml
│   ├── runtime-configmaps.yaml   # Gateway, control-plane, console config
│   ├── public-surface.yaml       # Ingress / Route / LoadBalancer
│   └── validate.yaml             # ConfigMap validation
├── charts/
│   ├── component-wrapper/        # Reusable workload template (v0.2.0)
│   ├── vault/                    # Vault OSS subchart (v0.1.0)
│   └── eso/                      # External Secrets Operator (v0.1.0)
└── values/
    ├── profiles/                 # Deployment scale profiles
    │   ├── all-in-one.yaml
    │   ├── standard.yaml
    │   └── ha.yaml
    ├── dev.yaml                  # Environment-specific
    ├── staging.yaml
    ├── prod.yaml
    ├── sandbox.yaml
    ├── platform-kubernetes.yaml  # Platform-specific
    ├── platform-openshift.yaml
    ├── platform-kubernetes-loadbalancer.yaml
    ├── airgap.yaml               # Air-gapped environments
    ├── customer-reference.yaml
    └── local.example.yaml        # Local overrides template

Values Layering

Configuration is composed by stacking YAML files in order:

┌─────────────────────────────┐
│  6. Local Override          │  (untracked, developer-specific)
├─────────────────────────────┤
│  5. Airgap                  │  (private registry overrides)
├─────────────────────────────┤
│  4. Platform                │  (Kubernetes / OpenShift / LB)
├─────────────────────────────┤
│  3. Environment             │  (dev / staging / prod)
├─────────────────────────────┤
│  2. Profile                 │  (all-in-one / standard / ha)
├─────────────────────────────┤
│  1. Base values.yaml        │  (common defaults)
└─────────────────────────────┘

Later layers override earlier ones. This allows composing precise configurations:

bash
helm upgrade --install in-falcone charts/in-falcone \
  -f charts/in-falcone/values.yaml \                    # 1. Base
  -f charts/in-falcone/values/profiles/standard.yaml \   # 2. Profile
  -f charts/in-falcone/values/staging.yaml \             # 3. Environment
  -f charts/in-falcone/values/platform-openshift.yaml    # 4. Platform

Component Matrix

Compute Components (Deployment)

ComponentImagePortDefault Replicas
APISIXapache/apisix:3.10.09080, 91801 → 2 → 3
Keycloakkeycloak/keycloak:26.1.080801 → 1 → 2
OpenWhiskapache/openwhisk-controller:2.0.032331 → 2 → 3
Control Planeghcr.io/.../control-plane:0.1.080801 → 2 → 3
Web Consoleghcr.io/.../web-console:0.1.030001 → 2 → 3
Prometheusprom/prometheus:3.2.190900 → 1 → 1

Stateful Components (StatefulSet)

ComponentImagePortStorage (dev/std/prod)
PostgreSQLbitnami/postgresql:17.2.0543210Gi / 20Gi / 100-200Gi
MongoDBbitnami/mongodb:8.0.02701710Gi / 20Gi / 100-200Gi
Kafkabitnami/kafka:3.9.0909220Gi / 50Gi / 200-250Gi
MinIOminio/minio:2026.3.239000, 900120Gi / 100Gi / 500Gi-1Ti

Resource Requests

ComponentCPU RequestMemory RequestCPU LimitMemory Limit
APISIX200m256Mi11Gi
Keycloak250m512Mi11Gi
PostgreSQL250m512Mi12Gi
MongoDB250m512Mi12Gi
Kafka300m768Mi12Gi
OpenWhisk250m512Mi11Gi
MinIO250m512Mi12Gi
Control Plane200m256Mi11Gi
Web Console100m128Mi500m512Mi

Public Surface Exposure

Three modes for exposing the platform to external traffic:

Ingress (Kubernetes default)

yaml
publicSurface:
  mode: ingress
  ingress:
    className: nginx
    tls:
      mode: clusterManaged
    surfaces:
      api:
        host: api.dev.in-falcone.example.com
      console:
        host: console.dev.in-falcone.example.com
      identity:
        host: identity.dev.in-falcone.example.com
      realtime:
        host: realtime.dev.in-falcone.example.com

OpenShift Route

yaml
publicSurface:
  mode: route
  route:
    tls:
      termination: edge
    surfaces:
      api:
        host: api.staging.in-falcone.example.com
      console:
        host: console.staging.in-falcone.example.com

LoadBalancer

yaml
publicSurface:
  mode: loadBalancer
  loadBalancer:
    tls:
      mode: external
    surfaces:
      api:
        annotations:
          service.beta.kubernetes.io/aws-load-balancer-type: nlb

Bootstrap Controller

A Kubernetes Job that runs post-install and post-upgrade to configure the platform:

One-Shot Operations (first install only)

  1. Keycloak realm setup: Create in-falcone-platform realm with roles, scopes, clients
  2. Superadmin user: Create initial admin user with credentials from Secret
  3. Governance catalog: Provision plans, quota policies, deployment profiles
  4. Internal namespaces: Create OpenWhisk system namespaces
  5. Storage buckets: Create platform-audit and platform-artifacts buckets

Reconcile Operations (every upgrade)

  1. APISIX routes: Declaratively reconcile all gateway routes
  2. Bootstrap payload: Update ConfigMap with latest bootstrap data

Lock Mechanism

ConfigMap: in-falcone-bootstrap-lock
├── locked: true/false
├── lockedBy: <pod-name>
├── lockedAt: <timestamp>
└── payloadHash: <sha256>
  • Prevents concurrent bootstrap execution
  • Skips execution if payload hash matches (no changes)
  • Break-glass override available for stuck locks

Profiles Comparison

AspectAll-in-OneStandardHA
Total Replicas~10~20~30
Kafka Replicas133
Anti-AffinityNoNoYes
ObservabilityDisabledEnabledEnabled
Pod DisruptionNoneBasicConfigured
Min CPU~3 cores~6 cores~10 cores
Min Memory~4 Gi~8 Gi~16 Gi
Use CaseDev, CIStaging, small prodProduction

Air-Gap Support

For disconnected environments, the airgap.yaml overlay:

  1. Rewrites all image repositories to a private registry
  2. Configures image pull secrets
  3. Disables external connectivity checks
yaml
global:
  imageRegistry: registry.internal.example.com
  imagePullSecrets:
    - name: registry-credentials

Released under the MIT License.