kubectl patch为Deployment添加preStop钩子时请求无效如何解决?
报错根因
你遇到的报错是因为JSON Patch的add操作要求目标路径的所有上级父节点必须已存在,你当前的Deployment配置中,首个容器下没有lifecycle、lifecycle.preStop、lifecycle.preStop.exec这些上层字段,直接添加最下层的command字段就会触发请求非法错误。
核心疑问解答
kubectl patch完全支持添加不存在的路径,只要该路径的父节点已存在即可,不需要更换方案,只要调整patch的写法就行。
可用解决方案
方案1:调整JSON Patch写法,补全所有父节点创建步骤
kubectl -n mobile patch deployment hero-orders-app --type "json" -p '[ {"op":"add","path":"/spec/template/spec/containers/0/lifecycle","value":{}}, {"op":"add","path":"/spec/template/spec/containers/0/lifecycle/preStop","value":{}}, {"op":"add","path":"/spec/template/spec/containers/0/lifecycle/preStop/exec","value":{"command":["/bin/sleep","10"]}} ]'
方案2:使用默认的策略合并补丁(更简洁,不需要逐级创建节点)
kubectl默认的patch类型就是针对K8S资源优化的策略合并补丁,不需要逐级声明父节点,直接按结构写需要新增的配置即可,系统会自动合并:
kubectl -n mobile patch deployment hero-orders-app -p '{"spec":{"template":{"spec":{"containers":[{"name":"hero-orders-'"$CLUSTER_NAME"'","lifecycle":{"preStop":{"exec":{"command":["/bin/sleep","10"]}}}}]}}}}'
注意:这里需要替换
$CLUSTER_NAME为你实际的集群名称,和原Deployment中容器的name保持一致即可,策略合并补丁会自动匹配对应容器合并配置,不会覆盖其他已有字段。
内容的提问来源于stack exchange,提问作者tingyu gu
相关产品推荐
相关产品推荐

