按clinet go列出kubernetes资源,我如何才能获得种类和版本?
当我使用client go从api获取kubernetes资源时,但在响应中找不到apiversion和kind,apiversion和kind是空的。我怎样才能得到资源的版本和种类 下面是我的代码:按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
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)