【问题标题】:Kubernetes: validating update requests to custom resourceKubernetes:验证对自定义资源的更新请求
【发布时间】:2019-09-03 13:28:28
【问题描述】:

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

【问题讨论】:

    标签: kubernetes kubernetes-custom-resources


    【解决方案1】:

    自定义资源上的 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 中嵌入警告,告诉用户他们已经改变了对象以无效的方式,并且它们的指定值被忽略。您可以看到该方法的示例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
    

    【讨论】:

    • 谢谢,但是如何实现“对规范的任何更改都被忽略”?我假设当你的验证逻辑被调用时(可能是通过 watch API),规范已经更新了。
    • 在我的控制器逻辑中,我忽略了规范中的值。当我的控制器处理请求时,它会检查 Status 子资源中是否存在相关值。如果不是,它知道这是初始创建并将不可变值从 Spec 复制到 Status,并持久化自定义资源。从那里开始,对于它处理的任何请求,它从状态子资源中提取这些值,而不是从规范中的内容中提取这些值。 Spec 仍然会发生变化(防止这种情况发生的唯一方法是使用 Validating Webhook),但我的控制器会忽略这些值。
    猜你喜欢
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    相关资源
    最近更新 更多