我在集群中创建了自定义资源定义(CRD)及其控制器,现在可以创建自定义资源,但是如何验证对CR的更新请求?例如,只能更新某些字段。
答案 0 :(得分:2)
Custom Resources上的Kubernetes文档在Advanced features and flexibility上有一节(不要介意验证请求应该被认为是一个非常基本的功能?)。对于CRD的验证,它说:
可以使用OpenAPI v3.0 validation在CRD中指定大多数验证。通过添加Validating Webhook支持的其他任何验证。
OpenAPI v3.0验证不会帮助您完成所需的工作,即确保自定义资源上某些字段的不可变性,仅对查看对象的一个实例的无状态验证很有帮助并确定它是否有效,就无法将其与资源的先前版本进行比较,并验证没有任何更改。
您可以使用“验证Webhooks”。感觉像是一个重量级的解决方案,因为您将需要实现一个符合Validation Webhook合同的服务器(以特定的响应类型响应特定的请求),但是您至少需要所需的数据才能做出所需的确定,例如知道这是一个UPDATE请求,并且知道旧对象的外观。有关更多详细信息,请参见here。我实际上还没有尝试过验证Webhooks,但是感觉像是可行的。
我使用的另一种方法是在第一次创建自定义资源的Status
子资源中存储用户提供的数据,然后始终在其中查看数据。尽管您的控制器可以注意到Spec
和Spec
之间的差异,但是对Status
所做的任何更改都会被忽略,并在Status
中嵌入警告,告诉您用户,他们以无效的方式对对象进行了突变,并且忽略了其指定的值。您可以看到该方法here和here的示例。根据该链接存储库的relevant README section,这将导致以下行为:
如果尚未成功创建团队的UAA客户端,则
AVAILABLE
列将显示false。如果您在初始创建后对团队规格进行了更改,则WARNING
列将显示警告。DIRECTOR
列显示spec.director
最初提供的值,这是该团队将继续使用的值。如果您确实尝试更改Team
资源,则可以使用-o wide
标志查看(忽略的)用户提供的值:$ kubectl get team --all-namespaces -owide NAMESPACE NAME DIRECTOR AVAILABLE WARNING USER-PROVIDED DIRECTOR test test vbox-admin true vbox-admin
如果我们尝试对
spec.director
属性进行突变,则将看到以下内容:$ kubectl get team --all-namespaces -owide NAMESPACE NAME DIRECTOR AVAILABLE WARNING USER-PROVIDED DIRECTOR test test vbox-admin true API resource has been mutated; all changes ignored bad-new-director-name