This repository contains a Go-based Kubernetes/OpenShift Operator built using Operator SDK.
The operator introduces a custom resource called App and reconciles it into a Kubernetes Deployment.
The operator continuously ensures that the actual cluster state matches the desired state defined by the App custom resource.
-
Defines a Custom Resource Definition (CRD) called
App -
Watches
Appresources across namespaces -
Creates and manages a Kubernetes Deployment
-
Reconciles changes to:
- Replica count
- Container image
-
Updates the status of the custom resource
-
Uses OwnerReferences for automatic cleanup
-
Runs as a cluster-scoped operator on OpenShift
App Custom Resource
|
v
App Controller (Operator)
|
v
Kubernetes Deployment
|
v
Pods
The App custom resource is the source of truth.
Users never manage Deployments directly.
apiVersion: apps.github.com/v1
kind: App
metadata:
name: example-app
namespace: default
spec:
replicas: 2
image: quay.io/<your_quay_user>/nginx-demo:latest.
├── api/ # CRD Go types
├── internal/controller/ # Reconcile logic
├── config/ # Generated manifests (CRD, RBAC, Deployment)
├── cmd/main.go # Operator entrypoint
├── Dockerfile # Operator image build
├── Makefile # Build / deploy automation
- User creates or updates an
Appresource - Controller
Reconcile()is triggered - Desired Deployment is computed from
App.spec - Deployment is created or updated
- Operator corrects any drift automatically
App.status.availableReplicasis updated
- Go 1.21+
- Operator SDK
- OpenShift / Kubernetes cluster
- Logged into cluster using
oc
export IMG=quay.io/<your_quay_user>/sample-operator:v0.1.0
make docker-build IMG=$IMG
make docker-push IMG=$IMGmake install
make deploy IMG=$IMGVerify:
oc get pods -n controller-systemoc apply -f app.yamlVerify:
oc get deployment example-app -n default
oc get pods -l app=example-app -n defaultoc patch app example-app -n default \
--type=merge -p '{"spec":{"replicas":4}}'Pods scale automatically.
oc scale deployment example-app -n default --replicas=1The operator restores the desired replica count.
oc get app example-app -o yamlstatus:
availableReplicas: 4oc delete app example-app -n defaultDeployment and Pods are deleted automatically via OwnerReferences.
- Kubernetes Operators follow the desired-state reconciliation pattern
- RBAC is critical, especially for cluster-scoped operators
- OwnerReferences require finalizer permissions
- The custom resource is the single source of truth
- Add Service and OpenShift Route
- Add finalizers for custom deletion logic
- Package using Operator Lifecycle Manager (OLM)
- Add unit tests using envtest
Abhinav OpenShift / Kubernetes Operator (Go)