Kubernetes:验证对自定义资源的更新请求

时间:2019-09-03 04:09:27

标签: kubernetes kubernetes-custom-resources

我在集群中创建了自定义资源定义(CRD)及其控制器,现在可以创建自定义资源,但是如何验证对CR的更新请求?例如,只能更新某些字段。

1 个答案:

答案 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子资源中存储用户提供的数据,然后始终在其中查看数据。尽管您的控制器可以注意到SpecSpec之间的差异,但是对Status所做的任何更改都会被忽略,并在Status中嵌入警告,告诉您用户,他们以无效的方式对对象进行了突变,并且忽略了其指定的值。您可以看到该方法herehere的示例。根据该链接存储库的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