Kubernetes Operator that streamlines routing, TLS certificates, and SSO authentication configuration for applications in the Nebari NIC ecosystem.
The NIC Operator enables self-service application onboarding in GitOps-friendly Kubernetes platforms. When a new app is deployed via Helm or Argo CD, the operator automatically configures:
- HTTP/HTTPS Routes (Gateway API HTTPRoute)
- TLS Certificates (via cert-manager)
- SSO Authentication (OIDC with Keycloak)
- Security Policies (Envoy Gateway SecurityPolicy)
This operator works within a platform that includes:
- Argo CD - GitOps application deployment
- Envoy Gateway - Gateway API implementation (north/south traffic)
- cert-manager - TLS certificate provisioning and renewal
- Keycloak - OIDC authentication provider (optional)
flowchart TB
Helm[Helm/Argo CD Deploy] --> K8s[(Kubernetes API)]
K8s --> AppCR[NebariApp CR]
subgraph Operator[nebari-operator]
Core[Core Validator]
Routing[Routing Reconciler]
Auth[Auth Reconciler]
end
AppCR --> Core
Core --> Routing --> HTTPRoute[HTTPRoute]
HTTPRoute --> Gateway[Gateway + TLS]
Core --> Auth --> SecPol[SecurityPolicy OIDC]
Auth --> KC[Keycloak Client Optional]
KC --> Secret[K8s Secret]
Secret --> SecPol
Get started in 5 minutes! Follow our Quick Start Guide to:
- Install the operator
- Set up platform prerequisites
- Deploy your first application
- Enable authentication
Prerequisites: Kubernetes cluster with Gateway API support (Envoy Gateway recommended)
✅ Declarative Configuration - Single CRD defines routing, TLS, and auth ✅ Automatic Route Generation - HTTPRoute resources created automatically ✅ TLS Management - Seamless cert-manager integration ✅ OIDC Authentication - Optional SSO with Keycloak ✅ GitOps Compatible - Continuously reconciled with desired state ✅ Multi-Platform - Works with any Kubernetes (cloud, on-prem, local) ✅ Namespace Isolation - Opt-in per namespace with labels
- Quick Start Guide - Install and deploy your first app (5 min)
- Platform Setup - Infrastructure prerequisites and installation
- Configuration Reference - Complete NebariApp CRD reference
- Reconciler Overview - How the operator works internally
- Validation Reconciler - Namespace and service validation
- Routing Reconciler - Gateway API and HTTPRoute management
- Authentication Reconciler - OIDC and Keycloak integration
- Makefile Reference - Build, test, and deployment commands
- Release Process - How releases are created and managed
- Release Setup - GitHub Actions configuration
Install the latest stable release:
kubectl apply -f https://github.com/nebari-dev/nebari-operator/releases/latest/download/install.yamlVERSION=v0.1.0
kubectl apply -f https://github.com/nebari-dev/nebari-operator/releases/download/${VERSION}/install.yamlkubectl get pods -n nebari-operator-system
kubectl logs -n nebari-operator-system -l control-plane=controller-managerCreate a NebariApp to expose your service:
apiVersion: reconcilers.nebari.dev/v1
kind: NebariApp
metadata:
name: my-app
namespace: default
spec:
hostname: my-app.example.com
service:
name: my-service
port: 8080
tls:
enabled: true
mode: wildcard
auth:
enabled: true
oidc:
provider: keycloak
issuer: "https://keycloak.example.com/realms/main"
clientSecretRef:
name: my-app-oidc
namespace: defaultThe operator will automatically create:
- HTTPRoute for routing traffic to your service
- SecurityPolicy for OIDC authentication (if auth enabled)
- Keycloak Client for your application (if configured)
See the Configuration Reference for all available options.
- Go 1.24+
- Docker or Podman
- kubectl
- Kubernetes cluster (kind, minikube, or cloud)
- make
# Install dependencies
make manifests generate
# Run tests
make test
# Run linter
make lint
# Run operator locally (against configured cluster)
make runUse the automated development environment:
# Create Kind cluster with full infrastructure
cd dev
make setup
# Build and deploy operator
cd ..
make docker-build IMG=quay.io/nebari/nebari-operator:dev
kind load docker-image quay.io/nebari/nebari-operator:dev --name nic-operator-dev
make install deploy IMG=quay.io/nebari/nebari-operator:dev
# Deploy sample application
kubectl apply -f dev/sample-app-deployment.yaml
kubectl apply -f dev/sample-nebariapp-with-routing.yaml
# Test changes
make docker-build IMG=quay.io/nebari/nebari-operator:dev
kind load docker-image quay.io/nebari/nebari-operator:dev --name nic-operator-dev
kubectl rollout restart deployment nebari-operator-controller-manager -n nebari-operator-system
# Cleanup
cd dev
make teardownSee dev/README.md for detailed development workflows.
make help # Show all available targets
make fmt # Format code
make vet # Run static analysis
make test # Run unit tests
make lint # Run linter
make build # Build binary
make docker-build # Build Docker image
make deploy # Deploy to clusterSee the Makefile Reference for complete documentation.
We welcome contributions! Here's how to get started:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Add tests for new functionality
- Run tests and linters:
make fmt vet test lint - Commit your changes (
git commit -m 'Add amazing feature') - Push to your fork (
git push origin feature/amazing-feature) - Open a Pull Request
When you open a PR:
- ✅ Automated tests run
- ✅ Code is linted and validated
- ✅ Multi-arch Docker images are built
- ✅ A comment with image details is added to your PR
Test your PR image:
kubectl set image deployment/nebari-operator-controller-manager \
manager=quay.io/nebari/nebari-operator:your-branch-name \
-n nebari-operator-systemReleases are fully automated via GitHub Actions. When a new release is published:
- ✅ Tests run automatically
- ✅ Docker images built for amd64 and arm64
- ✅ Go binaries built for multiple platforms
- ✅ Helm chart packaged and published
- ✅ Release notes generated
- ✅ All artifacts attached to the release
See the Release Process for detailed information.
Check the Releases page for the latest version.
Images are available at Quay.io:
quay.io/nebari/nebari-operator:latest
quay.io/nebari/nebari-operator:v0.1.0
quay.io/nebari/nebari-operator:main
The operator uses a pipeline of specialized reconcilers to transform a simple NebariApp resource into a fully
configured application:
- Validation Reconciler - Ensures prerequisites (namespace opt-in, service exists)
- Routing Reconciler - Creates HTTPRoute and attaches to Gateway
- Authentication Reconciler - Configures OIDC authentication (optional)
Each reconciler operates independently, updating status conditions and emitting Kubernetes events for observability.
Learn more: Reconciler Architecture
Licensed under the Apache License, Version 2.0. See LICENSE for details.