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

使用Kubernetes C Client补丁Deployment遇422负载错误求助

解决Kubernetes C客户端补丁Deployment返回422错误的问题

422(Payload error)通常是因为补丁格式未被Kubernetes正确识别,核心原因是没有设置对应补丁类型的Content-Type请求头,或者补丁结构存在问题。以下是针对你两种补丁方式的修正方案:

关键前提:设置正确的Content-Type

Kubernetes针对不同补丁类型要求特定的Content-Type:

  • JSON Patch(RFC 6902):application/json-patch+json
  • Merge Patch(RFC 7386):application/merge-patch+json

你之前的代码没有设置这个请求头,导致K8s无法解析补丁内容,从而返回422错误。


方案1:修正JSON Patch实现

确保构造的JSON Patch结构正确,并添加对应的Content-Type头:

// 构造JSON Patch数组(修正目标replicas为3)
cJSON *jsonArray = cJSON_CreateArray();
cJSON *jsonObject = cJSON_CreateObject();
cJSON_AddStringToObject(jsonObject, "op", "replace");
cJSON_AddStringToObject(jsonObject, "path", "/spec/replicas");
cJSON_AddNumberToObject(jsonObject, "value", 3);
cJSON_AddItemToArray(jsonArray, jsonObject);

object_t *body = object_parseFromJSON(jsonArray);

// 添加JSON Patch对应的Content-Type请求头
apiClient_addHeader(apiClient, "Content-Type", "application/json-patch+json");

// 执行补丁操作
v1_deployment_t *updatedDeployment = AppsV1API_patchNamespacedDeployment(
    apiClient, 
    deploymentInfo->metadata->name, 
    namespc, 
    body, 
    NULL, NULL, NULL, NULL, 0
);

// 注意:使用完后释放cJSON对象和body,避免内存泄漏
cJSON_Delete(jsonArray);
object_free(body);

方案2:修正Merge Patch实现

Merge Patch需要设置对应Content-Type,可选添加apiVersion和kind字段(部分客户端要求):

// 构造Merge Patch对象
cJSON *root = cJSON_CreateObject();
// 可选:添加apiVersion和kind,确保客户端兼容性
cJSON_AddStringToObject(root, "apiVersion", "apps/v1");
cJSON_AddStringToObject(root, "kind", "Deployment");

cJSON *specObject = cJSON_CreateObject();
cJSON_AddNumberToObject(specObject, "replicas", 3);
cJSON_AddItemToObject(root, "spec", specObject);

object_t *body = object_parseFromJSON(root);

// 添加Merge Patch对应的Content-Type请求头
apiClient_addHeader(apiClient, "Content-Type", "application/merge-patch+json");

// 执行补丁操作
v1_deployment_t *updatedDeployment = AppsV1API_patchNamespacedDeployment(
    apiClient, 
    deploymentInfo->metadata->name, 
    namespc, 
    body, 
    NULL, NULL, NULL, NULL, 0
);

// 释放资源
cJSON_Delete(root);
object_free(body);

额外检查项

  1. 确认namespc变量的值与Deployment所在的命名空间一致(比如默认是default)。
  2. 验证apiClient已正确初始化且拥有足够的权限(权限错误通常返回403,而非422,可作为排除项)。
  3. 检查补丁中的数值类型:replicas是整数类型,确保你传入的是数字而非字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:17:32