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
相关产品推荐
相关产品推荐

