Dag*_*ang 5 kubernetes kubernetes-custom-resources
我在集群中创建了自定义资源定义(CRD)及其控制器,现在可以创建自定义资源,但是如何验证对CR的更新请求?例如,仅某些字段可以更新。
关于自定义资源的 Kubernetes 文档有一个关于高级功能和灵活性的部分(不用介意验证请求应该被视为一个非常基本的功能)。对于 CRD 的验证,它说:
大多数验证可以使用OpenAPI v3.0 验证在 CRD 中指定。通过添加Validating Webhook支持的任何其他验证。
OpenAPI v3.0 验证不会帮助您完成您正在寻找的任务,即确保自定义资源上某些字段的不变性,它仅对无状态验证有帮助,在无状态验证中您正在查看对象的一个实例并确定是否无论它是否有效,您都无法将其与资源的先前版本进行比较并验证是否没有任何更改。
您可以使用验证 Webhooks。这感觉像是一个重量级的解决方案,因为您需要实现一个符合 Validating Webhook 合约的服务器(用特定类型的响应来响应特定类型的请求),但您至少将拥有所需的数据来做出所需的决定,例如知道这是一个 UPDATE 请求并知道旧对象是什么样子。有关更多详细信息,请参阅此处。我实际上还没有尝试过验证 Webhooks,但感觉它可以工作。
Status我使用的另一种方法是在第一次创建自定义资源时将用户提供的数据存储在自定义资源的子资源中,然后始终查看那里的数据。对 的任何更改都会Spec被忽略,尽管您的控制器可以注意到 中的内容Spec和 中的内容之间的差异Status,并嵌入警告,Status告诉用户他们已经以无效的方式改变了对象,并且它们的指定值将被忽略。您可以在此处和此处查看该方法的示例。根据该链接存储库的相关自述文件部分,这会导致以下行为:
AVAILABLE如果团队的 UAA 客户端尚未成功创建,该列将显示 false。如果您在初始创建后更改了团队规范,该WARNING列将显示警告。该DIRECTOR列显示最初提供的值spec.director,这是该团队将继续使用的值。如果您确实尝试更改Team资源,您可以看到(忽略的)用户提供的带有以下标志的值-o wide:Run Code Online (Sandbox Code Playgroud)$ kubectl get team --all-namespaces -owide NAMESPACE NAME DIRECTOR AVAILABLE WARNING USER-PROVIDED DIRECTOR test test vbox-admin true vbox-admin如果我们尝试改变
spec.director属性,我们将看到以下内容:Run Code Online (Sandbox Code Playgroud)$ 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
| 归档时间: |
|
| 查看次数: |
46 次 |
| 最近记录: |