如何利用已检索的CRD配置new_class及kr8s.get调用
问题描述
在集群中安装CRD后,尝试用kr8s执行get操作时遇到配置问题,已能通过get_crd获取CRD对象,但get调用报错。代码示例如下:
mycrd = get_crd('mycrdnames') MyClass = new_class( kind="mycrdname", version="example.com", namespaced=False, asyncio=True, ) myclass = MyClass({}) kc.get("mycrdnames/example.com", namespace="mynamespace", api=mycrd.api)
报错信息:
ValueError: Unknown API version, base must be specified.
疑问:
- 正确配置
new_class和get调用所需的信息是否已包含在已检索到的CRD中?如果是,该如何提取? - 如果没有,去哪里可以找到所需信息(例如base应该是什么)?
解决方案
问题1:从CRD对象提取所需配置信息
是的,所有必要信息都在get_crd返回的CRD对象中,提取方式如下:
- group:取CRD的
spec.group字段(你代码里写的version="example.com"其实应该是group) - version:从CRD的
spec.versions列表中选择目标版本(比如取第一个版本的name字段) - kind:取CRD的
spec.names.kind字段 - namespaced:判断CRD的
spec.scope是否为"Namespaced",是则为True,否则为False
修改后的代码示例:
mycrd = get_crd('mycrdnames') # 从CRD中提取配置 crd_group = mycrd.spec.group crd_version = mycrd.spec.versions[0].name # 选择第一个可用版本,可根据需求调整 crd_kind = mycrd.spec.names.kind crd_namespaced = mycrd.spec.scope == "Namespaced" MyClass = new_class( kind=crd_kind, version=crd_version, group=crd_group, # 新增group参数 namespaced=crd_namespaced, asyncio=True, ) # 调用get时,直接用生成的类实例或者正确的资源路径 # 方式1:用类实例的get方法 myclass = MyClass({}) await myclass.get(name="your-resource-name", namespace="mynamespace") # 方式2:用kc.get的正确格式 kc.get(f"{crd_kind.lower()}s/{crd_group}", name="your-resource-name", namespace="mynamespace")
问题2:获取额外配置信息的途径
如果CRD对象的信息不足以配置,可通过以下方式获取:
- 用kubectl查看CRD的完整定义:
kubectl get crd mycrdnames -o yaml,在spec字段下能找到group、versions、scope等所有关键信息 - 查看集群的API文档:执行
kubectl proxy后,访问http://localhost:8001/swagger.json,搜索CRD对应的group和version,可查看完整的API路径规范
内容的提问来源于stack exchange,提问作者Clark Updike
相关产品推荐
相关产品推荐

