是否必须升级已弃用的 CRD apiVersions?

Is it mandatory to upgrade CRDs deprecated apiVersions?

我在集群中应用了一些旧 apiVersion 的外部 CRD,并部署了基于这些 CRD 的运算符。

official docs 中所述,关于 Kubernetes API 和 1.22 中的功能删除。

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.

根据引用,这是否意味着我可以将那些 apiextensions.k8s.io/v1beta1 CRD 留在集群中? controllers/operators 会继续正常工作吗?

自定义资源升级后仍可使用

假设我们定义了一个名为 mykind

的资源
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

然后,在应用了这个的任何集群上,我总是可以定义一个 mykind 资源:

apiVersion: grp.example.com/v1beta1
kind: Mykind
metadata:
  name: mykind-instance

即使 mykind 的 CRD 是在 v1beta1 下创建的,此资源在升级后仍将正常提供。

但是,控制器/操作员代码中引用 v1beta1 CRD 的任何内容都将不起作用。例如,这可能是应用 CRD 本身(如果您的控制器有权这样做)。如果您的运营商由 Operator Lifecycle Manager 管理,则需要注意这一点。但是观察 CR 的变化不会受到升级的影响。

因此,如果您的控制器/操作员没有监视 CustomResourceDefinitions,那么从技术上讲,您可以将这些 CRD 留在集群上,您的操作员将照常工作。但如果需要,您将无法卸载 + 重新安装。

另一件需要探索的事情是,这是否/如何影响您以后升级 API 版本的能力。