部署kind为NetworkPlugins的YAML需使用哪个Kubernetes Python客户端
问题错误原因
NetworkPlugins是第三方定义的CRD(自定义资源定义),归属API组为plumber.k8s.pf9.io/v1,不属于K8s内置的networking.k8s.ioAPI组,你调用NetworkingV1Api下的方法完全匹配不到该资源的操作接口,K8s内置API也不存在create_namespaced_network_plugins这个方法。- 使用
k8_utils.create_from_yaml时你尝试传入了特定资源的API实例(如AppsV1Api、NetworkingV1Api),这类特定资源API只能处理对应组的内置资源,无法识别自定义CRD。 - 你提供的代码片段中使用了
yaml.safe_load但没有导入pyyaml对应的yaml模块,会直接触发运行时错误。
正确实现方案
你可以任选以下两种方法实现需求:
方法1:使用create_from_yaml(最简便)
直接传入全局ApiClient实例即可,工具会自动根据yaml中的apiVersion和kind匹配对应接口:
from kubernetes import client as k8_client, utils as k8_utils, config as k8_config import yaml # 加载集群配置 k8_config.load_kube_config(clusterKubeConfigFile) api_client = k8_client.ApiClient() # 创建资源,命名空间参数根据CRD实际属性决定,集群级资源可删除该参数 k8_utils.create_from_yaml( api_client, self.host_plumber_yaml_file, namespace="kube-system" )
方法2:使用自定义资源专用API调用
用CustomObjectsApi手动调用CRD操作接口,参数可灵活调整:
from kubernetes import client as k8_client, config as k8_config import yaml # 加载集群配置 k8_config.load_kube_config(clusterKubeConfigFile) crd_api = k8_client.CustomObjectsApi() # 加载yaml配置 with open(self.host_plumber_yaml_file) as f: crd_body = yaml.safe_load(f) # 调用创建接口 # 资源复数名可执行`kubectl api-resources | grep NetworkPlugins`确认,一般为kind小写加s resp = crd_api.create_namespaced_custom_object( group="plumber.k8s.pf9.io", version="v1", namespace="kube-system", # 若为集群级CRD,删除该参数,调用create_cluster_custom_object方法 plural="networkplugins", body=crd_body ) print("资源创建成功,状态='%s'" % str(resp.get("status")))
内容的提问来源于stack exchange,提问作者Yajant Bhawsar
相关产品推荐
相关产品推荐

