kubernetes kubectl修补程序不更新状态子资源

jchrr9hc  于 2023-02-11  发布在  Kubernetes
关注(0)|答案(1)|浏览(229)

我正在尝试更新自定义资源的状态子资源,但发现curl和kubectl patch命令存在差异。当我使用curl调用时,它工作正常,但当我使用kubectl patch命令时,它显示已修补,但使用no change。以下是我使用的命令

使用 curl :

当我连接到kubectl proxy并运行下面的curl调用时,它成功地更新了CR上的status子资源。

curl -XPATCH  -H "Accept: application/json" -H "Content-Type: application/json-patch+json"  --data '[{"op": "replace", "path": "/status/state", "value": "newState"}]' 'http://127.0.0.1:8001/apis/acme.com/v1alpha1/namespaces/acme/myresource/default/status'

Kubectl修补程序命令:

使用kubectl patch表示CR是patch,但具有no change,并且状态子资源已更新。

$ kubectl -n acme patch myresource default --type='json' -p='[{"op": "replace", "path": "/status/state", "value":"newState"}]'
myresource.acme.com/default patched (no change)

但是当我在其他子资源上运行kubectl patch时,比如spec,它运行得很好。

33qvvth1

33qvvth11#

从kubectl v1.24开始,可以使用额外的标志(如--subresource=status)来修补子资源。该标志被视为“Alpha”,但不需要启用该功能。
例如,使用yaml合并:

kubectl patch MyCrd myresource --type=merge --subresource status --patch 'status: {healthState: InSync}'

v1.24的Sysdig“新增功能”包含有关此标志的更多词汇:
一些kubectl命令,如get、patch、edit和replace,现在将包含一个新的标志--subresource=[subresource-name],它将允许获取和更新所有API资源的状态和缩放子资源。
现在可以停止使用复杂的curl命令直接更新子资源。
--subresource标记计划在Kubernetes v1.27到KEP-2590: graduate kubectl subresource support to beta中升级为“Beta”。可以在#2590 Add subresource support to kubectl中跟踪此功能的生命周期。

相关问题