×

操作符生命周期管理器 (OLM) v1 仅为技术预览功能。技术预览功能不受Red Hat生产服务级别协议 (SLA) 的支持,并且可能功能不完整。Red Hat不建议在生产环境中使用它们。这些功能提供对即将推出的产品功能的早期访问,使客户能够在开发过程中测试功能并提供反馈。

有关Red Hat技术预览功能的支持范围的更多信息,请参见技术预览功能支持范围

更新由集群扩展提供的自定义资源定义 (CRD) 时,操作符生命周期管理器 (OLM) v1 将运行CRD升级安全性预检,以确保与该CRD先前版本的向后兼容性。CRD更新必须通过验证检查才能在集群上允许更改继续进行。

其他资源

禁止的CRD升级更改

以下对现有自定义资源定义 (CRD) 的更改会被CRD升级安全性预检捕获并阻止升级

  • 在现有 CRD 版本中添加了一个新的必填字段。

  • 从现有 CRD 版本中删除了一个现有字段。

  • 更改了现有 CRD 版本中现有字段的类型。

  • 为之前没有默认值的字段添加了一个新的默认值。

  • 更改了字段的默认值。

  • 删除了字段的现有默认值。

  • 为之前没有枚举限制的现有字段添加了新的枚举限制。

  • 删除了现有字段中的一些现有枚举值。

  • 增加了现有 CRD 版本中现有字段的最小值。

  • 减小了现有 CRD 版本中现有字段的最大值。

  • 为之前没有约束的字段添加了最小值或最大值字段约束。

更改最小值和最大值的规则适用于minimumminLengthminPropertiesminItemsmaximummaxLengthmaxPropertiesmaxItems约束。

CRD 升级安全预检检查会报告以下对现有 CRD 的更改并阻止升级,尽管这些操作在技术上是由 Kubernetes API 服务器处理的。

  • 作用域从Cluster更改为Namespace,或从Namespace更改为Cluster

  • 删除了现有 CRD 的已存储版本。

如果 CRD 升级安全预检检查遇到其中一项禁止的升级更改,它会为在 CRD 升级中检测到的每个禁止更改记录一条错误信息。

在 CRD 的更改不属于任何禁止更改类别,但也不能被正确检测为允许更改的情况下,CRD 升级安全预检检查将阻止升级并记录“未知更改”的错误。

允许的 CRD 升级更改

以下对现有自定义资源定义 (CRD) 的更改对于向后兼容是安全的,并且不会导致 CRD 升级安全预检检查阻止升级。

  • 向字段中允许的枚举值列表中添加新的枚举值。

  • 将现有必填字段在现有版本中更改为可选字段。

  • 减小了现有 CRD 版本中现有字段的最小值。

  • 增加了现有 CRD 版本中现有字段的最大值。

  • 添加了新版本的 CRD,并且没有修改现有版本。

禁用 CRD 升级安全预检检查

可以通过向提供 CRD 的ClusterExtension对象添加值为truepreflight.crdUpgradeSafety.disabled字段来禁用自定义资源定义 (CRD) 升级安全预检检查。

禁用 CRD 升级安全预检检查可能会破坏与已存储的 CRD 版本的向后兼容性,并可能导致集群出现其他意外后果。

无法禁用单个字段验证器。如果禁用 CRD 升级安全预检检查,则所有字段验证器都将被禁用。

以下检查由 Kubernetes API 服务器处理。

  • 作用域从Cluster更改为Namespace,或从Namespace更改为Cluster

  • 删除了现有 CRD 的已存储版本。

通过 Operator Lifecycle Manager (OLM) v1 禁用 CRD 升级安全预检检查后,Kubernetes 仍然会阻止这两个操作。

先决条件
  • 您已安装集群扩展。

步骤
  1. 编辑 CRD 的ClusterExtension对象。

    $ oc edit clusterextension <clusterextension_name>
  2. preflight.crdUpgradeSafety.disabled字段设置为true

    ClusterExtension对象示例
    apiVersion: olm.operatorframework.io/v1alpha1
    kind: ClusterExtension
    metadata:
        name: clusterextension-sample
    spec:
        installNamespace: default
        packageName: argocd-operator
        version: 0.6.0
        preflight:
            crdUpgradeSafety:
                disabled: true (1)
    1 设置为true

不安全的 CRD 更改示例

以下示例演示了对示例自定义资源定义 (CRD) 的各个部分所做的特定更改,这些更改将被 CRD 升级安全预检检查捕获。

对于以下示例,请考虑以下初始状态的 CRD 对象。

CRD 对象示例
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  annotations:
    controller-gen.kubebuilder.io/version: v0.13.0
  name: example.test.example.com
spec:
  group: test.example.com
  names:
    kind: Sample
    listKind: SampleList
    plural: samples
    singular: sample
  scope: Namespaced
  versions:
  - name: v1alpha1
    schema:
      openAPIV3Schema:
        properties:
          apiVersion:
            type: string
          kind:
            type: string
          metadata:
            type: object
          spec:
            type: object
          status:
            type: object
          pollInterval:
            type: string
        type: object
    served: true
    storage: true
    subresources:
      status: {}

作用域更改

在以下自定义资源定义 (CRD) 示例中,scope字段从Namespaced更改为Cluster

CRD 中的作用域更改示例
    spec:
      group: test.example.com
      names:
        kind: Sample
        listKind: SampleList
        plural: samples
        singular: sample
      scope: Cluster
      versions:
      - name: v1alpha1
错误输出示例
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoScopeChange" validation failed: scope changed from "Namespaced" to "Cluster"

删除已存储的版本

在以下自定义资源定义 (CRD) 示例中,删除了已存储的版本v1alpha1

在 CRD 中删除已存储版本的示例
      versions:
      - name: v1alpha2
        schema:
          openAPIV3Schema:
            properties:
              apiVersion:
                type: string
              kind:
                type: string
              metadata:
                type: object
              spec:
                type: object
              status:
                type: object
              pollInterval:
                type: string
            type: object
错误输出示例
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoStoredVersionRemoved" validation failed: stored version "v1alpha1" removed

删除现有字段

在以下自定义资源定义 (CRD) 示例中,从v1alpha1模式中删除了pollInterval属性字段。

在 CRD 中删除现有字段的示例
      versions:
      - name: v1alpha1
        schema:
          openAPIV3Schema:
            properties:
              apiVersion:
                type: string
              kind:
                type: string
              metadata:
                type: object
              spec:
                type: object
              status:
                type: object
            type: object
错误输出示例
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoExistingFieldRemoved" validation failed: crd/test.example.com version/v1alpha1 field/^.spec.pollInterval may not be removed

添加必填字段

在以下自定义资源定义 (CRD) 示例中,pollInterval属性已更改为必填字段。

在 CRD 中添加必填字段的示例
      versions:
      - name: v1alpha2
        schema:
          openAPIV3Schema:
            properties:
              apiVersion:
                type: string
              kind:
                type: string
              metadata:
                type: object
              spec:
                type: object
              status:
                type: object
              pollInterval:
                type: string
            type: object
            required:
            - pollInterval
错误输出示例
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "ChangeValidator" validation failed: version "v1alpha1", field "^": new required fields added: [pollInterval]