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

如何用client-go实现kubectl get crds的等效功能?

使用client-go实现kubectl get crd的等效代码

当然可以用client-go实现kubectl get crd的功能,核心是借助apiextensions-apiserver的客户端操作CRD资源——毕竟CRD属于apiextensions.k8s.io组下的顶层资源。

完整实现示例

首先需要导入必要的依赖包:

import (
    "context"
    "fmt"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/rest"
    "k8s.io/client-go/tools/clientcmd"
    apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
    "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
)

接下来是核心逻辑,支持集群内和本地kubeconfig两种配置方式:

func main() {
    // 优先尝试集群内配置(适用于Pod内运行的程序)
    config, err := rest.InClusterConfig()
    if err != nil {
        // 集群内配置失败则加载本地kubeconfig
        config, err = clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
        if err != nil {
            panic(fmt.Sprintf("加载配置失败: %v", err))
        }
    }

    // 创建apiextensions clientset
    apiextensionsClient, err := clientset.NewForConfig(config)
    if err != nil {
        panic(fmt.Sprintf("创建clientset失败: %v", err))
    }

    // 列出所有CRD,完全等效于`kubectl get crd`
    crdList, err := apiextensionsClient.ApiextensionsV1().CustomResourceDefinitions().List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        panic(fmt.Sprintf("列出CRD失败: %v", err))
    }

    // 遍历输出CRD的名称和状态
    fmt.Printf("共找到%d个CRD:\n", len(crdList.Items))
    for _, crd := range crdList.Items {
        fmt.Printf("- %s (状态: %s)\n", crd.Name, crd.Status.Conditions[len(crd.Status.Conditions)-1].Type)
    }
}

关键说明

  • CRD属于apiextensions.k8s.io/v1 API组,必须使用apiextensionsClient.ApiextensionsV1()来访问对应的资源接口
  • metav1.ListOptions参数支持添加过滤规则,比如通过FieldSelector或LabelSelector实现类似kubectl get crd -l app=my-crd的过滤效果
  • 如果需要兼容旧版K8s集群(v1.16之前),可以替换为ApiextensionsV1beta1(),但该版本已被废弃,建议优先使用v1版本

内容的提问来源于stack exchange,提问作者samuelus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:40:24