$ oc edit clusterextension <clusterextension_name>
操作符生命周期管理器 (OLM) v1 仅为技术预览功能。技术预览功能不受Red Hat生产服务级别协议 (SLA) 的支持,并且可能功能不完整。Red Hat不建议在生产环境中使用它们。这些功能提供对即将推出的产品功能的早期访问,使客户能够在开发过程中测试功能并提供反馈。 有关Red Hat技术预览功能的支持范围的更多信息,请参见技术预览功能支持范围。 |
更新由集群扩展提供的自定义资源定义 (CRD) 时,操作符生命周期管理器 (OLM) v1 将运行CRD升级安全性预检,以确保与该CRD先前版本的向后兼容性。CRD更新必须通过验证检查才能在集群上允许更改继续进行。
以下对现有自定义资源定义 (CRD) 的更改会被CRD升级安全性预检捕获并阻止升级
在现有 CRD 版本中添加了一个新的必填字段。
从现有 CRD 版本中删除了一个现有字段。
更改了现有 CRD 版本中现有字段的类型。
为之前没有默认值的字段添加了一个新的默认值。
更改了字段的默认值。
删除了字段的现有默认值。
为之前没有枚举限制的现有字段添加了新的枚举限制。
删除了现有字段中的一些现有枚举值。
增加了现有 CRD 版本中现有字段的最小值。
减小了现有 CRD 版本中现有字段的最大值。
为之前没有约束的字段添加了最小值或最大值字段约束。
更改最小值和最大值的规则适用于 |
CRD 升级安全预检检查会报告以下对现有 CRD 的更改并阻止升级,尽管这些操作在技术上是由 Kubernetes API 服务器处理的。
作用域从Cluster
更改为Namespace
,或从Namespace
更改为Cluster
。
删除了现有 CRD 的已存储版本。
如果 CRD 升级安全预检检查遇到其中一项禁止的升级更改,它会为在 CRD 升级中检测到的每个禁止更改记录一条错误信息。
在 CRD 的更改不属于任何禁止更改类别,但也不能被正确检测为允许更改的情况下,CRD 升级安全预检检查将阻止升级并记录“未知更改”的错误。 |
以下对现有自定义资源定义 (CRD) 的更改对于向后兼容是安全的,并且不会导致 CRD 升级安全预检检查阻止升级。
向字段中允许的枚举值列表中添加新的枚举值。
将现有必填字段在现有版本中更改为可选字段。
减小了现有 CRD 版本中现有字段的最小值。
增加了现有 CRD 版本中现有字段的最大值。
添加了新版本的 CRD,并且没有修改现有版本。
可以通过向提供 CRD 的ClusterExtension
对象添加值为true
的preflight.crdUpgradeSafety.disabled
字段来禁用自定义资源定义 (CRD) 升级安全预检检查。
禁用 CRD 升级安全预检检查可能会破坏与已存储的 CRD 版本的向后兼容性,并可能导致集群出现其他意外后果。 |
无法禁用单个字段验证器。如果禁用 CRD 升级安全预检检查,则所有字段验证器都将被禁用。
以下检查由 Kubernetes API 服务器处理。
通过 Operator Lifecycle Manager (OLM) v1 禁用 CRD 升级安全预检检查后,Kubernetes 仍然会阻止这两个操作。 |
您已安装集群扩展。
编辑 CRD 的ClusterExtension
对象。
$ oc edit clusterextension <clusterextension_name>
将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 对象。
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
。
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
。
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
属性字段。
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
属性已更改为必填字段。
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]