如何通过K8s Python Client的create_from_yaml创建ServiceMonitor并解决API缺失错误?
解决Kubernetes Python客户端部署ServiceMonitor时的AttributeError问题
错误原因
Kubernetes Python官方客户端仅内置原生K8s资源的API类,而ServiceMonitor是Prometheus Operator提供的自定义资源(CRD),默认不在客户端的API类集合中。create_from_yaml函数会根据YAML中的apiVersion自动拼接对应的API类名(如monitoring.coreos.com/v1对应MonitoringCoreosComV1Api),但找不到该类时就会抛出AttributeError。
解决方案
方法一:使用CustomObjectsApi直接创建(推荐)
CustomObjectsApi是K8s客户端提供的通用自定义资源操作接口,无需额外生成代码,直接操作CRD:
from kubernetes import client, config # 加载集群配置(集群内运行用config.load_incluster_config()) config.load_kube_config() # 初始化自定义资源API客户端 custom_api = client.CustomObjectsApi() # 构造ServiceMonitor配置(可直接从YAML转成字典) servicemonitor_body = { "apiVersion": "monitoring.coreos.com/v1", "kind": "ServiceMonitor", "metadata": { "name": "rabbitmq-exporter", "labels": {"app": "rabbitmq"} }, "spec": { "selector": {"matchLabels": {"app": "rabbitmq"}}, "endpoints": [ {"port": "prometheus", "path": "/metrics", "interval": "10s"} ] } } # 创建ServiceMonitor,替换为你的目标命名空间 custom_api.create_namespaced_custom_object( group="monitoring.coreos.com", version="v1", namespace="default", plural="servicemonitors", body=servicemonitor_body )
注意:
plural参数需与CRD定义中的spec.names.plural一致,ServiceMonitor的复数固定为servicemonitors。
方法二:生成CRD专属API类(适配create_from_yaml)
如果必须使用create_from_yaml,需要生成对应CRD的API类:
- 获取ServiceMonitor的OpenAPI定义:
通过kubectl导出CRD的OpenAPI schema:kubectl get crd servicemonitors.monitoring.coreos.com -o jsonpath='{.spec.validation.openAPIV3Schema}' > servicemonitor-openapi.json - 用OpenAPI Generator生成Python客户端:
安装openapi-generator后,运行生成命令:openapi-generator generate -i servicemonitor-openapi.json -g python -o prometheus-operator-client - 安装生成的客户端:
生成完成后,cd prometheus-operator-client && pip install .create_from_yaml就能自动识别并调用MonitoringCoreosComV1Api类完成部署。
内容的提问来源于stack exchange,提问作者Paulo
相关产品推荐
相关产品推荐

