我有一个 Kubernetes自定义资源实例,我想使用 JSON 补丁通过 Kubernetes API 对其进行修补。
这是我的补丁请求:
PATCH /apis/example.com/v1alpha1/namespaces/default/mycrd/test HTTP/1.1
Accept: application/json
Content-Type: application/json-patch+json
[other headers omitted for brevity...]
[
{"op": "replace", "path": "/status/foo", value: "bar"}
]
我相当确定我的请求正文是有效的JSON 补丁,并且我之前已经使用类似的 API 调用成功更新了核心(非 CRD)API 资源。CRD 有一个openAPIV3Schema
明确允许.status.foo
存在和类型的定义string
。
上面的请求被 Kubernetes API 服务器拒绝,响应如下:
HTTP/1.1 422 Unprocessable Entity
Conent-Type: application/json
[other headers omitted for brevity...]
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "the server rejected our request due to an error in our request",
"reason": "Invalid",
"details": {},
"code": 422
}
根据CRD 文档,CRD 应该支持带有内容类型PATCH
的请求。application/json-patch+json
但是由于某种原因,请求似乎是无效的,而 Kubernetes 没有费心告诉我为什么。API 服务器 pod 在其日志流中也没有任何相关消息。
kubectl patch
在命令行上使用时也会出现同样的错误:
$ kubectl patch mycrd.example.com test --type=json -p '[{"op": "replace", "path": "/status/foo", "value": "bar"}]'
The "" is invalid
发生此错误的可能原因是什么?我有哪些选项可以进一步调试?