• 王建
    2025-02-20 来自北京
    您好,思考题我测试了一下,mappingFor 不管传入的是 resource(比如:pods) 还是 kind(比如 Pod),都是能正确返回 RESTMapping 的,所以是代码不用改? 测试代码如下: package main import ( "context" "fmt" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" "k8s.io/client-go/restmapper" "k8s.io/client-go/tools/clientcmd" ) func InitRestMapper(clientSet *kubernetes.Clientset) meta.RESTMapper { gr, err := restmapper.GetAPIGroupResources(clientSet.Discovery()) if err != nil { panic(err) } mapper := restmapper.NewDiscoveryRESTMapper(gr) return mapper } func mappingFor(resourceOrKindArg string, restMapper *meta.RESTMapper) (*meta.RESTMapping, error) { fullySpecifiedGVR, groupResource := schema.ParseResourceArg(resourceOrKindArg) gvk := schema.GroupVersionKind{} if fullySpecifiedGVR != nil { gvk, _ = (*restMapper).KindFor(*fullySpecifiedGVR) } if gvk.Empty() { gvk, _ = (*restMapper).KindFor(groupResource.WithVersion("")) } if !gvk.Empty() { return (*restMapper).RESTMapping(gvk.GroupKind(), gvk.Version) } return nil, nil } func main() { config, err := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig") if err != nil { panic(err) } clientSet, err := kubernetes.NewForConfig(config) if err != nil { panic(err) } mapper := InitRestMapper(clientSet) restMapping, _ := mappingFor("pod", &mapper) dynamicClient, err := dynamic.NewForConfig(config) if err != nil { panic(err) } var ri dynamic.ResourceInterface if restMapping.Scope.Name() == "namespace" { ri = dynamicClient.Resource(restMapping.Resource).Namespace("default") } else { ri = dynamicClient.Resource(restMapping.Resource) } resource, err := ri.List(context.TODO(), metav1.ListOptions{}) if err != nil { panic(err) } for _, item := range resource.Items { fmt.Printf("Resource Name: %s\n", item.GetName()) } }
    展开
    
    