如何使用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
相关产品推荐
相关产品推荐

