<p>I have a few external CRDs with old <code>apiVersion</code> applied in the cluster, and operators based on those CRDs deployed.</p>
<p>As said in <a href="https://kubernetes.io/blog/2021/07/14/upcoming-changes-in-kubernetes-1-22/" rel="nofollow noreferrer">official docs</a> about Kubernetes API and Feature Removals in 1.22.</p>
<blockquote>
<p>You can use the v1 API to retrieve or update existing objects, even if they were created using an older API version. If you defined any custom resources in your cluster, those are still served after you upgrade.</p>
</blockquote>
<p>Based on the quote, does it mean I could leave those <code>apiextensions.k8s.io/v1beta1</code> CRDs in the cluster? Will controllers/operators continue to work normally?</p>

<p>The custom resources will still be served after you upgrade</p>
<p>Suppose we define a resource called <code>mykind</code></p>
<pre class="lang-yaml prettyprint-override"><code>apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: mykinds.grp.example.com
spec:
  group: grp.example.com
  versions:
    - name: v1beta1
      served: true
      storage: true
</code></pre>
<p>Then, on any cluster where this has been applied I can always define a <code>mykind</code> resource:</p>
<pre class="lang-yaml prettyprint-override"><code>apiVersion: grp.example.com/v1beta1
kind: Mykind
metadata:
  name: mykind-instance
</code></pre>
<p>And this resource will still be served normally after upgrade even if the CRD for <code>mykind</code> was created under <code>v1beta1</code>.</p>
<p>However, anything in the controller / operator code referencing v1beta1 CRD won't work. This could be applying the CRD itself (if your controller has permissions to do that) for example. That's something to watch out for if your operator is managed by the <a href="https://github.com/operator-framework/operator-lifecycle-manager" rel="nofollow noreferrer">Operator Lifecycle Manager</a>. But watching for changes in the CRs would be unaffected by the upgrade.</p>
<p>So if your controller / operator isn't watching <code>CustomResourceDefinitions</code> then technically you can leave these CRDs on the cluster and your operator will work as normal. But you won't be able to uninstall + reinstall should you need to.</p>
<p>Another thing to explore is if / how that might affect your ability to bump API versions later though.</p>
