5.2 KiB
RIG Operator (Resource Infrastructure Gateway)
RIG Operator is a Kubernetes operator designed to decouple Infrastructure Management (Quotas, Credentials, Providers) from Cluster Provisioning (Kubernetes versions, Node sizing).
It replaces legacy monolithic provisioners with a Strategy-Pattern Architecture, allowing a single operator to manage hybrid fleets (Harvester, vSphere, etc.) using a unified API while strictly enforcing resource quotas.
🏗 Architecture & Design
The Problem
Legacy controllers often mix concerns:
- Hardcoded Providers: Adding vSphere requires rewriting the main loop.
- No Accounting: Users can provision infinite clusters until the underlying storage fills up.
- Tight Coupling: Helm values, RKE2 configs, and VM details are mashed into one huge struct.
The RIG Solution
RIG segregates responsibilities into three distinct layers, acting as a Gatekeeper and Router.
1. The Data Model (Blueprints)
InfraBlueprint(The Accountant): Owned by Platform Admins. Defines Quotas (CPU/RAM/Disk), Credentials, and points to the specific Provider Config. It automatically tracks usage across all child clusters.ClusterBlueprint(The Request): Owned by Users. Defines What is needed (e.g., "3 nodes, 4 CPU, 16GB RAM") but not How it is provided.HarvesterBlueprint/VsphereBlueprint(The Tech Specs): Holds low-level details (Image names, Networks, VM Namespaces).
2. The Logic Flow
- Gatekeeper: Before doing anything, the Controller checks
Infra.Quota. If(Used + Request) > Max, provisioning is blocked. - Router: The Controller reads
Infra.ProviderRefand dynamically loads the correct Strategy (Harvester vs. vSphere). - Builder: A generic
MasterBuildercombines the Strategy's output with a Base Helm Template to generate the final values.
📂 Project Structure
| Directory | Role | Description |
|---|---|---|
api/v1alpha1 |
The Contract | Defines the CRDs (ibp, cbp, hbp). |
internal/controller |
The Brain | ClusterBlueprint (Provisioning/Gatekeeping) & InfraBlueprint (Accounting). |
internal/provider |
The Interface | Defines the Strategy interface that all clouds must obey. |
internal/provider/harvester |
The Implementation | Logic specific to Harvester (Identity minting, NodePool mapping). |
internal/builder |
The Assembler | Merges Strategy output with Helm Templates. Agnostic to the cloud provider. |
internal/helm |
The Tool | Wrapper around the Helm SDK (OCI supported). |
internal/templates |
The Defaults | Embedded YAML files containing default values (CPU/RAM, UserData). |
🚀 Development Workflow
Prerequisites
- Go 1.22+
- Helm v3 (Binary)
- Kubernetes Cluster (or local Kind/Minikube)
kubectlpointing to your dev cluster
1. Common Commands
Initial Setup (Download Dependencies):
go mod tidy
Update APIs (CRDs):
*Run this whenever you edit api/v1alpha1/*.go*
make manifests generate
Run Locally:
Runs the controller against your current ~/.kube/config context.
make install run
2. Debugging (VS Code / Delve)
make run is great for logs, but if you need to set breakpoints (e.g., to inspect the Helm Values map before it applies), use the debugger.
VS Code launch.json Configuration:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug RIG Operator",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}/cmd/main.go",
"args": [],
"env": {
"KUBECONFIG": "${userHome}/.kube/config"
}
}
]
}
- Select "Debug RIG Operator" from the Run menu.
- Set a breakpoint in
internal/controller/clusterblueprint_controller.go(e.g., inside theReconcileloop). - Apply a generic cluster manifest to trigger the breakpoint.
🛠 Maintenance Guide
"I need to add a new field..."
| Scenario | Files to Touch | Command to Run |
|---|---|---|
Add a field to the API (e.g., ProxyURL to Infra) |
api/v1alpha1/infrablueprint_types.go |
make manifests generate |
| Update Default CPU/RAM | internal/templates/harvester/values.yaml |
make build (Recompiles embedded file) |
| Change Harvester UserData logic | internal/provider/harvester/strategy.go |
go test ./... |
| Add a new Cloud Provider (e.g. AWS) | 1. Create api/.../awsblueprint_types.go |
2. Create internal/provider/aws/strategy.go
3. Update controller switch case. | make manifests generate |
"The Quota isn't updating!"
Remember that the InfraController is responsible for math. It watches ClusterBlueprint events.
- Check logs:
kubectl logs -l control-plane=controller-manager - Ensure your Cluster actually points to the correct Infra name (
spec.infraBlueprintRef).
📊 Documentation & Diagrams
Visual flows (Mermaid) are available in the docs/ folder:
docs/flow-diagram.svg: High-level Request Flow.docs/controllerflow.mermaid: Detailed Controller logic.