【问题标题】:kubectl patch doesn't update status subresourcekubectl 补丁不更新状态子资源
【发布时间】:2023-02-10 04:20:08
【问题描述】:

我正在尝试更新自定义资源的状态子资源,但发现 curl 和 kubectl patch 命令存在差异。当我使用 curl 调用时,它工作得很好,但是当我使用 kubectl patch 命令时,它说已修补但带有 no change。这是我使用的命令

使用卷曲:

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

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 是补丁但带有 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)

但是,当我对其他子资源(如 spec)执行 kubectl patch 时,它工作正常。我在这里错过了什么吗?

【问题讨论】:

标签: kubernetes kubectl


【解决方案1】:

从 kubectl v1.24 开始,可以使用附加标志修补子资源,例如--subresource=status。此标志被视为“Alpha”但不需要启用该功能。

例如,使用 yaml 合并:

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

Sysdig "What's New?" for v1.24 包含更多关于此标志的文字:

get、patch、edit 和 replace 等一些 kubectl 命令现在将包含一个新标志 --subresource=[subresource-name],这将允许获取和更新所有 API 资源的状态和缩放子资源。

您现在可以停止使用复杂的 curl 命令来直接更新子资源。

--subresource 标志计划通过KEP-2590: graduate kubectl subresource support to beta 在 Kubernetes v1.27 中升级为“Beta”。可以在#2590 Add subresource support to kubectl 中跟踪此功能的生命周期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2019-01-09
    • 1970-01-01
    • 2020-12-14
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    相关资源
    最近更新 更多