使用K8S Go Client列出ClusterServiceVersions时如何指定operators.coreos.com组
解决K8S Go Client获取ClusterServiceVersions原始响应的问题
第一个错误原因及修复
错误提示the server could not find the requested resource (get ClusterServiceVersions.meta.k8s.io)是因为未指定正确的API组:ClusterServiceVersions(CSV)属于operators.coreos.com组,而非默认的meta.k8s.io。同时要注意K8S REST API的资源名要求为小写复数形式。
修复后的代码示例:
import ( "context" "fmt" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" ) func getCSVRaw(namespace string) { // 初始化clientset,可根据实际场景用InClusterConfig或kubeconfig config, _ := rest.InClusterConfig() clientset, _ := kubernetes.NewForConfig(config) data, err := clientset.RESTClient().Get(). Namespace(namespace). Group("operators.coreos.com"). // 指定CSV所属API组 Version("v1alpha1"). // 根据集群实际版本调整,也可能为v1 Resource("clusterserviceversions"). // 小写复数资源名 DoRaw(context.TODO()) if err != nil { panic(err.Error()) } fmt.Printf("%s", string(data)) }
第二个错误原因及修复
错误panic: v1.ListOptions is not suitable for converting to "meta.k8s.io/v1" in scheme是因为scheme版本不兼容:你使用的v1.ListOptions与当前客户端的scheme不匹配。
如果需要传递分页、过滤等参数,推荐直接用Param方法手动添加(更适配获取原始响应的场景):
// 示例:添加label过滤参数 data, err := clientset.RESTClient().Get(). Namespace(namespace). Group("operators.coreos.com"). Version("v1alpha1"). Resource("clusterserviceversions"). Param("labelSelector", "operator-name=my-operator"). // 手动指定过滤条件 DoRaw(context.TODO())
如果一定要使用VersionedParams,需确保参数Codec与API组版本匹配:
import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) data, err := clientset.RESTClient().Get(). Namespace(namespace). Group("operators.coreos.com"). Version("v1alpha1"). Resource("clusterserviceversions"). VersionedParams(&metav1.ListOptions{LabelSelector: "operator-name=my-operator"}, clientset.RESTClient().GetConfig().ParameterCodec). DoRaw(context.TODO())
内容的提问来源于stack exchange,提问作者xonya
相关产品推荐
相关产品推荐

