Loading...
Loading...
Use when building a Kubernetes Operator — custom controllers that reconcile CRD state. Triggers on "build an operator", "CRD design", "reconcile loop", "controller-runtime", "kubebuilder", "operator-sdk", "metacontroller", "KOPF", "operator capability levels", or "custom resource". Ships CRD validator, reconcile-loop linter, and OperatorHub capability auditor (all stdlib Python), 4 references on the operator pattern + CRD design + reconcile patterns + tooling landscape, and a /operator-audit slash command. NOT a generic k8s skill — specifically the Operator pattern.
npx skill4agent add alirezarezvani/claude-skills kubernetes-operatorhelm-chart-buildersenior-devopscloud-securityobserve(actual) → desired = read(spec) → diff(actual, desired) → act → update(status)
↓
requeue / doneSKILL=engineering/kubernetes-operator/skills/kubernetes-operator
# Validate a CRD design
python "$SKILL/scripts/crd_validator.py" --crd config/crd/myapp.yaml
# Lint a Go reconcile function
python "$SKILL/scripts/reconcile_lint.py" --controller controllers/myapp_controller.go
# Score against OperatorHub Capability Levels (1-5)
python "$SKILL/scripts/operator_capability_audit.py" --operator-dir .--helpcrd_validator.pypython scripts/crd_validator.py --crd config/crd/myapp.yaml
python scripts/crd_validator.py --crd config/crd/ --format jsonspec.versions[*].subresources.statusspec.scopeNamespacedClusterspec.versions[*].schema.openAPIV3Schemax-kubernetes-preserve-unknown-fields: trueserved: truestorage: truemetav1.ConditionsAgeStatusPhasereconcile_lint.pypython scripts/reconcile_lint.py --controller controllers/myapp_controller.go(ctrl.Result, error)return ctrl.Result{Requeue: true}, errclient.Update()time.SleepRequeueAfterdeferIsConditionTrueSetConditionoperator_capability_audit.pypython scripts/operator_capability_audit.py --operator-dir .references/tooling_landscape.md| Framework | Language | Best for | Maintenance |
|---|---|---|---|
| controller-runtime | Go | Production-grade, low-level control | Active (sig-api-machinery) |
| kubebuilder | Go | Standard scaffolding, opinionated | Active (Kubernetes SIGs) |
| operator-sdk | Go / Helm / Ansible | OpenShift / mixed-paradigm teams | Active (Red Hat) |
| metacontroller | Any (webhook-based) | Polyglot teams, avoiding Go | Less active |
| KOPF | Python | Python shops, async-first | Active (community) |
| java-operator-sdk | Java | JVM shops | Active (Red Hat / Java SIG) |
references/crd_design.mdReadyReconcilingDegradedv1alpha1v1beta1v1additionalPrinterColumnskubectl getAgePhaseReadyreferences/reconcile_loop.mdctrl.Result{RequeueAfter: ...}time.Sleep1. Pick a Group/Version/Kind: e.g., apps.example.com/v1alpha1, kind=MyApp
2. kubebuilder init --domain example.com --repo github.com/org/myapp-operator
3. kubebuilder create api --group apps --version v1alpha1 --kind MyApp
4. Run crd_validator.py on config/crd/bases/apps.example.com_myapps.yaml
→ Fix every WARN before writing controller code
5. Implement the reconcile function (Karpathy principle 2: simplest correct version first)
6. Run reconcile_lint.py on controllers/myapp_controller.go
7. Run operator_capability_audit.py --operator-dir . — confirm L1
8. Test in a kind cluster: kubectl apply -f config/samples/
9. Add status conditions; aim for L2 in the same PR1. Run operator_capability_audit.py --operator-dir <path>
2. Run crd_validator.py --crd config/crd/
3. Run reconcile_lint.py --controller controllers/
4. Triage findings:
- FAIL → block release; fix before next deploy
- WARN → file an issue; fix in next 30 days
5. Document current capability level in README; commit
6. Plan one capability level advancement per quarter1. Identify primary language constraint (team skill)
2. Identify deployment target (vanilla k8s vs OpenShift)
3. Identify operator complexity (single CRD vs multi-CRD vs cluster-wide)
4. Cross-reference with references/tooling_landscape.md
5. Build a 1-week proof-of-concept before committingreferences/operator_pattern.mdreferences/crd_design.mdreferences/reconcile_loop.mdreferences/tooling_landscape.md/operator-auditassets/crd_template.yamlassets/reconcile_skeleton.gotime.Sleep(30 * time.Second)RequeueAfterr.Client.Update(ctx, obj)r.Status().Update(ctx, obj)x-kubernetes-preserve-unknown-fields: truecrd_validator.pyreconcile_lint.py