k8s文档Versions in CustomResourceDefinitions讨论了如何将CRD模式和CRD对象从一个版本升级到另一个版本。
但是,当我更新/更改CRD模式而不更新其版本时会发生什么?
例如,我有一个CRD模式v1/Foo
和两个字段A,B
(用go编写):
// api version: v1
type FOOSpec struct {
A int `json:"a"`
B int `json:"b"`
}
字符串
我使用kubebuilder生成CRD清单并将其应用到k8s集群中。之后,字段A被删除。
// still api version: v1
type FOOSpec struct {
B int `json:"b"`
}
型
我再次生成CRD清单并将其应用到k8s集群中。令人惊讶的是,k8只是接受更新的CRD模式,没有报告任何警告。
为什么会这样?如果我创建第一个模式的Foo 1对象,然后在第二个模式中创建Foo 2对象,会怎么样?这两个对象具有相同的版本(v1),但模式不同。
我期望k8s在更新CRD版本而不升级版本时报告错误。
1条答案
按热度按时间6yoyoihd1#
你基本上回答了自己的问题。
自定义资源定义(CRD)在Kubernetes API中定义Kubernetes资源类型。
在大多数模式演进中,开发人员有责任正确地对此类更改进行版本控制。Kubernetes不能在模式的定义上挑战开发人员;它必须接受开发者的意图(即使有问题)。
正如您所观察到的问题,更改GroupVersionKind的定义是有问题的,因此不鼓励(在生产中)。
如果您针对CRD创建资源,然后修改CRD(不修改其版本)并创建更多资源,则会引入不一致性:
在(Kubernetes API服务器)对资源尝试操作(CRUD)之前,不会出现错误。
Kubernetes Kind不是SemVer版本,而是遵循有限的枚举集,例如。v1alpha1,v1beta1,v1,v2 ...(参见版本优先级)。在开发过程中,我倾向于使用例如。v1 alpha 1,在不影响版本的情况下进行更改,并管理内务。一旦你发布了一个CRD,重要的是要提升版本,这样你就不会破坏你的用户。