You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mutating Webhook修改对象后,删除CR时Validating Webhook获空对象报错

问题原因及解决方案

核心原因

Kubernetes 处理DELETE类型的准入请求时,admission.Request中的Object.Raw字段是空的——删除操作默认不会传递待删除对象的完整内容,而是将对象原始数据放在OldObject.Raw字段中。你的Validating Webhook在处理删除请求时,错误地尝试解析空的req.Object.Raw,导致JSON解析失败,抛出序列化错误。

同时要确保Webhook配置正确:

  • 必须在rules中明确包含DELETE操作
  • 若需要访问待删除对象的完整数据,需将Webhook配置的sideEffects设为None(或NoneOnDryRun),且admissionReviewVersions匹配集群版本

解决方案示例

修改Validating Webhook的处理逻辑,根据请求类型选择对应的对象进行解析:

func validateMyCR(ctx context.Context, req admission.Request) admission.Response {
    var cr v1alpha1.NewCR
    var raw []byte

    // 根据操作类型选择要解析的对象
    switch req.Operation {
    case admission.Create, admission.Update:
        raw = req.Object.Raw
    case admission.Delete:
        raw = req.OldObject.Raw
    default:
        return admission.Allowed("")
    }

    if len(raw) == 0 {
        return admission.Denied("无法获取请求对象数据")
    }

    if err := json.Unmarshal(raw, &cr); err != nil {
        return admission.Errored(http.StatusInternalServerError, err)
    }

    // 此处添加你的验证逻辑(如检查标签、资源规则等)
    // ...

    return admission.Allowed("验证通过")
}

额外检查点

  • 检查ValidatingWebhookConfiguration资源,确保rules包含DELETE操作:
rules:
- apiGroups: ["your.group.com"]
  apiVersions: ["v1alpha1"]
  operations: ["DELETE"] # 必须显式包含DELETE
  resources: ["newcrs"]
  scope: "Namespaced"
  • 确认Webhook配置的sideEffects字段设置为None,否则K8s可能不会传递OldObject数据:
sideEffects: None

内容的提问来源于stack exchange,提问作者codego123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:34:59