我在集群中创建了自定义资源定义 (CRD) 及其控制器,现在我可以创建自定义资源,但如何验证对 CR 的更新请求?例如,只能更新某些字段。
1 回答
自定义资源上的 Kubernetes 文档有一个关于高级特性和灵活性的部分(不要介意验证请求应该被视为一个非常基本的特性)。对于 CRD 的验证,它说:
大多数验证可以使用OpenAPI v3.0 验证在 CRD 中指定。添加Validating Webhook支持的任何其他验证。
OpenAPI v3.0 验证不会帮助您完成您正在寻找的内容,即确保您的自定义资源上某些字段的不变性,它仅对您正在查看对象的一个实例并确定是否它是否有效,您无法将其与资源的先前版本进行比较并验证没有任何变化。
您可以使用验证 Webhook。这感觉像是一个重量级的解决方案,因为您将需要实现一个符合 Validating Webhook 合同的服务器(以特定类型的响应响应特定类型的请求),但您至少将拥有所需的数据来做出所需的决定,例如知道这是一个 UPDATE 请求并知道旧对象的样子。有关更多详细信息,请参见此处。我实际上并没有尝试过 Validating Webhooks,但感觉它可以工作。
我使用的另一种方法是Status
在第一次创建自定义资源时将用户提供的数据存储在自定义资源的子资源中,然后始终查看那里的数据。对 的任何更改都将被忽略,尽管您的控制器可以注意到 中的内容和Spec
中的内容之间的差异,并在告诉用户他们以无效的方式改变了对象并且它们指定的值被忽略时嵌入了警告。您可以在此处和此处查看该方法的示例。根据该链接存储库的相关 README 部分,这会导致以下行为:Spec
Status
Status
AVAILABLE
如果团队的 UAA 客户端尚未成功创建,该列将显示为 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