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

如何使用Python Kubernetes Client更新CRD子资源status

更新CRD Status子资源的可行方案

核心思路:利用CustomObjectsApi的PATCH方法指定子资源

Python Kubernetes Client的CustomObjectsApi其实支持更新status子资源,只是需要显式指定subresource='status'参数,这是很多开发者容易忽略的点。


方案1:使用patch_namespaced_custom_object(命名空间级CRD)

直接调用patch_namespaced_custom_object方法,传入status更新内容并指定子资源:

from kubernetes import client, config

# 加载K8s配置(本地用kubeconfig,集群内用service account)
config.load_kube_config()
custom_api = client.CustomObjectsApi()

# 配置CRD的元数据信息
CRD_GROUP = "example.com"
CRD_VERSION = "v1"
NAMESPACE = "default"
CRD_PLURAL = "mycrds"
RESOURCE_NAME = "my-crd-demo"

# 构造status更新体(按需修改字段)
status_update_body = {
    "status": {
        "phase": "Completed",
        "readyReplicas": 3,
        "conditions": [
            {
                "type": "Ready",
                "status": "True",
                "lastTransitionTime": "2024-05-20T10:00:00Z",
                "reason": "AllPodsRunning"
            }
        ]
    }
}

# 发送PATCH请求更新status
try:
    response = custom_api.patch_namespaced_custom_object(
        group=CRD_GROUP,
        version=CRD_VERSION,
        namespace=NAMESPACE,
        plural=CRD_PLURAL,
        name=RESOURCE_NAME,
        body=status_update_body,
        subresource="status",
        # 可选:指定patch策略,默认是merge-patch+json
        content_type="application/merge-patch+json"
    )
    print(f"Status更新成功:{response['status']}")
except client.exceptions.ApiException as e:
    print(f"更新失败:{e.body}")

方案2:使用patch_cluster_custom_object(集群级CRD)

如果你的CRD是集群范围(scope: Cluster),改用patch_cluster_custom_object方法:

# 集群级CRD无需指定namespace
response = custom_api.patch_cluster_custom_object(
    group=CRD_GROUP,
    version=CRD_VERSION,
    plural=CRD_PLURAL,
    name=RESOURCE_NAME,
    body=status_update_body,
    subresource="status"
)

方案3:直接调用REST API(兜底方案)

如果上述方法有问题,可以通过API Client直接发送HTTP请求到K8s API端点:

api_client = client.ApiClient()

# 构造status更新的API路径
url = f"/apis/{CRD_GROUP}/{CRD_VERSION}/namespaces/{NAMESPACE}/{CRD_PLURAL}/{RESOURCE_NAME}/status"

# 发送PATCH请求
response = api_client.call_api(
    url=url,
    method='PATCH',
    body=status_update_body,
    headers={'Content-Type': 'application/merge-patch+json'}
)
print(f"响应:{response}")

关键注意事项

  • CRD必须启用status子资源:检查你的CRD定义中是否包含subresources.status配置,否则K8s会拒绝status更新请求。示例CRD片段:
    spec:
      versions:
        - name: v1
          served: true
          storage: true
          subresources:
            status: {}  # 必须配置这个字段
    
  • Patch策略选择:根据需求选application/merge-patch+json(合并更新)或application/json-patch+json(JSON Patch操作)。
  • 权限验证:确保执行代码的账号拥有对应CRD的update权限(针对status子资源)。

内容的提问来源于stack exchange,提问作者Julian Re

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:03:34