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

如何利用已检索的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.

疑问:

  1. 正确配置new_class和get调用所需的信息是否已包含在已检索到的CRD中?如果是,该如何提取?
  2. 如果没有,去哪里可以找到所需信息(例如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:33:26