I recently created a CustomResourceDefinition (CRD) along with a controller using Kubebuilder. After adding an optional field called `newField` to the CRD schema, I ran into issues because we didn't bump the API version; it remained at `apiVersion: mycrd.example.com/v1beta1`. In my test cluster, I discovered that the stored CRD's OpenAPI schema was outdated, which led to problems. The controller expected `newField` to exist, so when it set `obj.Status.NewField = "foo"`, the value was lost on the next read—showing as an empty string instead of `"foo"` because the API server pruned unknown fields. I want to minimize the chances of such mismatches in the future and am exploring options like verifying the CRD schema at the start of `Reconcile()` or letting the controller manage the CRD updates itself.
3 Answers
I'm curious about how you manage your deployment process. If you're not updating the CRD every time you deploy a new version of your operator, that could lead to mismatched schemas, right? It might be worth ensuring the CRD updates are part of your deployment pipeline to keep things synced!
When you add new fields to your CRD schema, make sure to run `make` and then `make manifests` to generate the updated manifest files. It's a crucial step during development to avoid mismatches. But for a production cluster, you'll need a more robust verification process to ensure both schemas match over time. Maybe include checks in your controller to confirm the schema is current?
For those looking for stricter validation, you can use `client.WithFieldValidation()` when initializing your controller. This way, if the schema doesn’t match, the update will fail with an error, instead of just logging a warning. It forces you to address any mismatch immediately, which is much more reliable!

Exactly! During development, it's all about keeping things in sync, but you should implement a consistent check for production. Perhaps have the controller validate the CRD schema at the start of each `Reconcile()` run – that could really help with detecting mismatches.