【发布时间】:2019-08-14 02:56:46
【问题描述】:
我有一个 Kubernetes Custom Resource 实例,我想使用 JSON 补丁通过 Kubernetes API 对其进行修补。
这是我的 PATCH 请求:
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 patch,并且我之前已经使用类似的 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 documentation,CRD 应该支持具有application/json-patch+json 内容类型的PATCH 请求。但由于某种原因,请求似乎是无效的,而 Kubernetes 没有费心告诉我为什么。 API 服务器 pod 在其日志流中也没有任何相关消息。
在命令行使用kubectl patch也会出现同样的错误:
$ kubectl patch mycrd.example.com test --type=json -p '[{"op": "replace", "path": "/status/foo", "value": "bar"}]'
The "" is invalid
发生此错误的可能原因有哪些?我有哪些选项可以进一步调试?
【问题讨论】:
标签: kubernetes kubectl kubernetes-custom-resources