按clinet go列出kubernetes资源,我如何才能获得种类和版本?

按clinet go列出kubernetes资源,我如何才能获得种类和版本?,go,kubernetes,kubernetes-pod,client-go,Go,Kubernetes,Kubernetes Pod,Client Go,当我使用client go从api获取kubernetes资源时,但在响应中找不到apiversion和kind,apiversion和kind是空的。我怎样才能得到资源的版本和种类 下面是我的代码: package main import ( "flag" "k8s.io/client-go/tools/clientcmd" "log" "k8s.io/client-go/kubernete

当我使用client go从api获取kubernetes资源时,但在响应中找不到apiversion和kind,apiversion和kind是空的。我怎样才能得到资源的版本和种类

下面是我的代码:

package main

import (
    "flag"
    "k8s.io/client-go/tools/clientcmd"
    "log"
    "k8s.io/client-go/kubernetes"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "fmt"
)

var clientset *kubernetes.Clientset

func main()  {
    k8sconfig := flag.String("k8sconfig","./k8sconfig","kubernetes config file path")
    flag.Parse()
    config , err := clientcmd.BuildConfigFromFlags("",*k8sconfig)
    if err != nil {
        log.Println(err)
    }
    clientset , err = kubernetes.NewForConfig(config)
    if err != nil {
        log.Fatalln(err)
    } else {
        fmt.Println("connect k8s success")
    }
    pods,err := clientset.CoreV1().Pods("").List(metav1.ListOptions{})
    if err != nil {
        log.Println(err.Error())
    }
    for _, pod := range pods.Items{
        fmt.Println("apiversion: ", pod.APIVersion, "kind: ", pod.Kind)
    }   
}

The output:
apiversion:   kind:  
apiversion:   kind:  
apiversion:   kind:  
apiversion:   kind:  
apiversion:   kind:  
apiversion:   kind:  
apiversion:   kind:  
apiversion:   kind:
......
......

我认为问题在于,您正在使用
list()
API获取pod列表,因此它不是您期望的pod,并且没有
Kind
字段

您需要迭代POD列表以访问各个POD:

for _, pod := range pods.Items {
    fmt.Printf("%s %s\n", pod.GetName(), pod.GetCreationTimestamp())
}

Kind
字段作为的一部分存在,并且可以使用
pod.ObjectMeta.Kind
访问该字段,因为从代码中忽略了
APIVersion
Kind

如果您查看API服务器JSON,它将如下所示:

{
   "kind":"PodList",
   "apiVersion":"v1",
   "metadata":{
      "resourceVersion":"2397"
   },
   "items":[
      {
... ... ...
因此,响应确实包含
APIVersion
Kind
。但当响应被解码到k8s对象时

在这里,您可以看到第二个输出参数被忽略,即
schema.GroupVersionKind

func(c*Something)解码([]字节,*schema.GroupVersionKind,runtime.Object)(runtime.Object,*schema.GroupVersionKind,错误){
}

N.B.:当您使用客户机go进行API调用时(动态客户机除外),您已经知道API版本(即
CoreV1()
)和种类(即
List()
)。

此外,您可以使用
Get
API直接获取特定pod,我尝试了pod.TypeMeta.Kind和pod.Kind中的一些示例,它们都是空的打印完整的
pod
对象时它会打印什么?另外,请尝试使用
pod.ObjectMeta.Kind
而不是
pod.TypeMeta.Kind
。此外,如果在pod输出中没有看到必填字段,请查看Kamol的答案。
out, _, err := r.decoder.Decode(r.body, nil, obj)