【发布时间】:2019-09-03 13:28:28
【问题描述】:
我在集群中创建了自定义资源定义 (CRD) 及其控制器,现在我可以创建自定义资源,但如何验证对 CR 的更新请求?例如,只能更新某些字段。
【问题讨论】:
标签: kubernetes kubernetes-custom-resources
我在集群中创建了自定义资源定义 (CRD) 及其控制器,现在我可以创建自定义资源,但如何验证对 CR 的更新请求?例如,只能更新某些字段。
【问题讨论】:
标签: kubernetes kubernetes-custom-resources
自定义资源上的 Kubernetes 文档有一个关于 Advanced features and flexibility 的部分(不要介意验证请求应该被视为一个非常基本的功能?)。对于 CRD 的验证,它说:
可以使用OpenAPI v3.0 validation 在 CRD 中指定大多数验证。添加 Validating Webhook 支持的任何其他验证。
OpenAPI v3.0 验证不会帮助您完成您正在寻找的事情,即确保您的自定义资源上某些字段的不变性,它仅对您正在查看对象的一个实例的无状态验证有帮助并确定它是否有效,您无法将其与资源的先前版本进行比较并验证没有任何变化。
您可以使用验证 Webhook。这感觉像是一个重量级的解决方案,因为您将需要实现一个符合 Validating Webhook 合同的服务器(以特定类型的响应响应特定类型的请求),但您至少将拥有所需的数据来做出所需的决定,例如知道这是一个 UPDATE 请求并知道旧对象的样子。有关详细信息,请参阅here。我实际上并没有尝试过验证 Webhook,但感觉它可以工作。
我使用的另一种方法是在第一次创建自定义资源时将用户提供的数据存储在自定义资源的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
【讨论】: