Architecture

End-to-end provisioning flow, network topology, and component responsibilities.

Provisioning Flow

The golden path follows a linear pipeline from developer self-service to a running VM on the cluster. Every step is automated; no manual cluster operations are required after the initial platform setup.

 ┌──────────────────┐
 │  Red Hat          │
 │  Developer Hub    │   1. Developer fills wizard
 │  (Backstage)      │   2. Template generates manifests
 └────────┬─────────┘
          │
          │  publish:gitea
          ▼
 ┌──────────────────┐
 │  Gitea            │   3. New repo created with
 │  (Git Server)     │      manifests/ directory
 └────────┬─────────┘
          │
          │  webhook / poll
          ▼
 ┌──────────────────┐
 │  ArgoCD           │   4. Application created
 │  (OpenShift       │      auto-sync + self-heal
 │   GitOps)         │
 └────────┬─────────┘
          │
          │  kubectl apply (SSA)
          ▼
 ┌──────────────────────────────────────────────┐
 │  OpenShift Cluster                            │
 │                                               │
 │  ┌─────────────┐  ┌────────────────────────┐ │
 │  │ Namespace    │  │ VirtualMachine         │ │
 │  │ (user-vms)  │  │  ├─ DataVolume (disk)  │ │
 │  │             │  │  ├─ cloud-init Secret   │ │
 │  │             │  │  └─ SSH Secret          │ │
 │  │             │  └────────────────────────┘ │
 │  │             │                              │
 │  │             │  ┌────────────────────────┐ │
 │  │             │  │ Service (ClusterIP)    │ │
 │  │             │  │  port 22 (SSH)         │ │
 │  │             │  │  port 8080 (HTTP)      │ │
 │  │             │  └────────────────────────┘ │
 │  └─────────────┘                              │
 │                                               │
 │  ┌─ Optional: Connectivity Link ────────────┐│
 │  │  Gateway (Istio)                         ││
 │  │  HTTPRoute ──► Service ──► VM:8080       ││
 │  │  AuthPolicy (OIDC / API Key)             ││
 │  │  RateLimitPolicy                         ││
 │  │  Route (OpenShift, TLS edge)             ││
 │  └──────────────────────────────────────────┘│
 └──────────────────────────────────────────────┘

Network Data Flow

When Connectivity Link is enabled, external traffic traverses several layers before reaching the VM guest OS.

  Internet / Client
        │
        ▼
  ┌─────────────────┐
  │ OpenShift Route  │  TLS termination (edge)
  │ (*.apps.domain)  │
  └────────┬────────┘
           │  port 8080
           ▼
  ┌─────────────────┐
  │ Istio Gateway    │  GatewayClass: istio
  │ (envoy proxy)    │  Listener: HTTP/8080
  └────────┬────────┘
           │
           ▼
  ┌─────────────────┐
  │ HTTPRoute        │  Path prefix matching
  │                  │  Backend: Service:8080
  └────────┬────────┘
           │
     ┌─────┴─────┐
     ▼           ▼
┌─────────┐ ┌──────────┐
│AuthPolicy│ │RateLimit │  Kuadrant policy enforcement
│(Authorino)│ │Policy    │  (runs as Envoy ext-auth
└─────────┘ │(Limitador)│   and rate-limit filters)
            └──────────┘
           │
           ▼
  ┌─────────────────┐
  │ Kubernetes       │  ClusterIP
  │ Service          │  port 8080 ──► targetPort 8080
  └────────┬────────┘
           │
           ▼
  ┌─────────────────┐
  │ VirtualMachine   │  RHEL guest OS
  │ (KubeVirt VMI)   │  httpd listening on :8080
  └─────────────────┘

Component Responsibilities

Component Responsibility Kubernetes Resources
Red Hat Developer Hub Self-service UI (wizard), manifest generation from templates, Gitea repo creation, ArgoCD app creation, catalog registration, email notification. None (runs as a Backstage instance)
Gitea Hosts the Git repository containing VM manifests. Single source of truth for the desired state. None (external Git server)
ArgoCD Watches the Git repo, applies manifests to the cluster, detects drift, self-heals, prunes deleted resources. Application in openshift-gitops
OpenShift Virtualization Runs the VM using KubeVirt. Manages VM lifecycle (start, stop, migrate), provisions storage via CDI DataVolumes. VirtualMachine, DataVolume, VirtualMachineInstance
cloud-init Guest-side initialization: sets hostname, creates users, installs packages, configures SSH keys, enables services. Secret (cloudInitNoCloud userdata)
Istio / Service Mesh Provides the istio GatewayClass and spawns envoy proxy pods for Gateway resources. Gateway (creates istio ingress pods)
Kuadrant Policy engine for authentication (Authorino) and rate limiting (Limitador). Enforces AuthPolicy and RateLimitPolicy on HTTPRoutes. AuthPolicy, RateLimitPolicy, PlanPolicy, APIProduct

GitOps Reconciliation Loop

After initial provisioning, the system enters a continuous reconciliation loop. Any change to the Git repository triggers an automatic sync:

  ┌────────────────────────────────────────────────┐
  │                                                │
  │   Developer pushes YAML change to Gitea        │
  │              │                                 │
  │              ▼                                 │
  │   ArgoCD detects diff (poll / webhook)         │
  │              │                                 │
  │              ▼                                 │
  │   ArgoCD applies changes (Server-Side Apply)   │
  │              │                                 │
  │              ▼                                 │
  │   OpenShift reconciles resources               │
  │   (VM restarted if spec changed,               │
  │    policies updated in-place)                  │
  │              │                                 │
  │              ▼                                 │
  │   ArgoCD marks app as "Synced + Healthy"       │
  │              │                                 │
  │              └──────────── loop ───────────────┘
  │
  │   If manual cluster change detected:
  │   ArgoCD self-heals (reverts to Git state)
  └────────────────────────────────────────────────┘