Перечислите ресурсы kubernetes по клинет-го. Как я могу получить тип и версию?

Когда я получаю ресурсы kubernetes из api с помощью client-go, но не могу найти 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:
......
......

person yzhengwei    schedule 23.03.2021    source источник


Ответы (2)


Я думаю, проблема в том, что вы получаете список модулей с помощью List() API, поэтому это не модуль, как вы ожидаете, и у него нет поля Kind.

Вам нужно перебрать список модулей для доступа к отдельным модулям:

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

Поле Kind присутствует как часть модуля _ 5_ и доступен с помощью pod.ObjectMeta.Kind.

person Krishna Chaurasia    schedule 23.03.2021
comment
кроме того, вы можете использовать Get API для прямого получения определенного модуля, некоторые примеры объяснены в create-a-simple-client-app-with-the-kubernetes-go-library - person Krishna Chaurasia; 23.03.2021
comment
Пробовал pod.TypeMeta.Kind и pod.Kind, все они пустые - person yzhengwei; 23.03.2021
comment
что он печатает, когда вы печатаете весь объект pod? также попробуйте использовать pod.ObjectMeta.Kind вместо pod.TypeMeta.Kind. - person Krishna Chaurasia; 23.03.2021
comment
также взгляните на ответ Камола, если вы не видите обязательное поле в выводе модуля. - person Krishna Chaurasia; 23.03.2021

Вы не получаете APIVersion и Kind, потому что они были проигнорированы кодом.

Если вы посмотрите на сервер API JSON ответ, это будет примерно так:

{
   "kind":"PodList",
   "apiVersion":"v1",
   "metadata":{
      "resourceVersion":"2397"
   },
   "items":[
      {
... ... ...

Таким образом, ответ действительно содержит APIVersion и Kind. Но когда ответ декодируется в объект k8s, здесь < / а>

out, _, err := r.decoder.Decode(r.body, nil, obj)

Здесь вы можете видеть, что второй выходной параметр игнорируется, это schema.GroupVersionKind.

func (c *Something) Decode([]byte, *schema.GroupVersionKind, runtime.Object) (runtime.Object, *schema.GroupVersionKind, error) {
    
}

N.B .: Когда вы выполняете вызов API с использованием client-go (кроме динамического клиента), вы уже знаете APIVersion (например, CoreV1()) и Kind (например, List()).

person Kamol Hasan    schedule 23.03.2021