Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mendapatkan respons "mesra" daripada Kubernetes APIServer menggunakan antara muka ReST

Bagaimana untuk mendapatkan respons "mesra" daripada Kubernetes APIServer menggunakan antara muka ReST

WBOY
WBOYke hadapan
2024-02-09 08:10:181181semak imbas

如何使用 ReST 接口从 Kubernetes APIServer 获取“友善”响应

Editor php Apple akan memperkenalkan kepada anda cara menggunakan antara muka ReST untuk mendapatkan respons "mesra" daripada Pelayan API Kubernetes. Kubernetes ialah platform orkestrasi kontena popular yang menyediakan API untuk mengurus dan memantau pelbagai sumber dalam kelompok. Dengan menggunakan antara muka ReST, kami boleh berinteraksi dengan mudah dengan APIServer Kubernetes dan mendapatkan maklumat yang kami perlukan. Dalam artikel ini, kami akan meneroka secara terperinci cara untuk mengesahkan, menghantar permintaan dan mengendalikan respons menggunakan antara muka ReST, serta cara mengendalikan kemungkinan keadaan ralat. Sama ada anda seorang pemula atau pengguna Kubernetes yang berpengalaman, artikel ini akan memberi anda panduan berguna dan nasihat praktikal.

Kandungan soalan

Saya menggunakan perpustakaan klien-golang untuk berkomunikasi dengan pelayan api kubernetes semasa rehat dapatkan, peringkat pos. Respons yang diterima bukanlah struktur json yang terbentuk dengan baik, dan juga bukan "jenis" objek api.

Serpihan program ialah:

kubeconfig := filepath.join(
         os.getenv("home"), ".kube", "config",
    )
    config, err := clientcmd.buildconfigfromflags("", kubeconfig)
    if err != nil {
        log.fatal(err)
    }
    config.negotiatedserializer = scheme.codecs.withoutconversion()


    groupversion, _ := schema.parsegroupversion("api/v1")
    config.groupversion = &groupversion
    config.contenttype = "application/json"

    config.acceptcontenttypes = "application/json"
    
    examplerestclient, err := rest.restclientfor(config)
    if err != nil {
        panic(err)
    }
    
    var statuscode int
    var contenttype string

    response, err := examplerestclient.
        get().
        resource("nodes").
        do(context.background()).
        statuscode(&statuscode).
        contenttype(&contenttype).
        get()
    
    if err != nil {
        panic(err)
    }

    fmt.printf("content-type is %s\n", contenttype)
    fmt.printf("status code is %d\n", statuscode)

    fmt.printf("received response %v\n", response)

Tindak balas bermula dengan:

status code is 200
received response &nodelist{listmeta:{ 17299  <nil>},items:[]node{node{objectmeta:{dev-cluster-control-plane    7fe038c9-8be6-41a9-9f3f-5900abb0e34b 16922 0 2023-02-19 16:32:44 +0530 ist <nil> <nil> map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:dev-cluster-control-plane kubernetes.io/os:linux node-role.kubernetes.io/control-plane: node.kubernetes.io/exclude-from-external-load-balancers:] map[kubeadm.alpha.kubernetes.io/cri-socket:unix:///run/containerd/containerd.sock node.alpha.kubernetes.io/ttl:0 volumes.kubernetes.io/controller-managed-attach-detach:true] [] [] ...

Saya menjangkakan output serupa dengan arahan berikut:

$ kubectl get --raw /api/v1/nodes
{"kind":"NodeList","apiVersion":"v1","metadata":{"resourceVersion":"17481"},"items":[{"metadata":{"name":"dev-cluster-control-plane","uid":"7fe038c9-8be6-41a9-9f3f-5900abb0e34b","resourceVersion":"17351","creationTimestamp":"2023-02-19T11:02:44Z","labels":{"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"dev-cluster-control-plane","kubernetes.io/os":"linux","node-role.kubernetes.io/control-plane":"","node.kubernetes.io/exclude-from-external-load-balancers":""},"annotations":{"kubeadm.alpha.kubernetes.io/cri-socket":"unix:///run/containerd/containerd.sock","node.alpha.kubernetes.io/ttl":"0" ...

Penyelesaian

Maklum balas yang diterima bukanlah struktur json yang terbentuk dengan baik

Saya rasa anda keliru tentang cara modul client-go berfungsi.

Maklum balas daripada api yang lain pastinya respons json yang terbentuk dengan baik, tetapi ini akan dipecahkan ke dalam struktur data go (seperti ini ).

Jika anda ingin mengakses nod yang dikembalikan, anda boleh berinteraksi dengan keputusan menggunakan sintaks go standard:

response, err := examplerestclient.
  get().
  resource("nodes").
  do(context.background()).
  statuscode(&statuscode).
  contenttype(&contenttype).
  get()

if err != nil {
  panic(err)
}

nodes := response.(*v1.nodelist)
for _, node := range nodes.items {
  fmt.printf("name: %s\n", node.objectmeta.getname())
  fmt.printf("addresses:\n")
  for _, addr := range node.status.addresses {
    fmt.printf("  %s: %s\n", addr.type, addr.address)
  }
}

Saya menjangkakan output serupa dengan arahan berikut:

kenapa? client-go Binding mengembalikan data yang berguna kepada kod go anda. Jika anda ingin menjana output json, anda perlu menyusun sumber secara eksplisit ke format json:
response, err := exampleRestClient.
  Get().
  Resource("nodes").
  Do(context.Background()).
  StatusCode(&statusCode).
  ContentType(&contentType).
  Get()

if err != nil {
  panic(err)
}

out, err := json.Marshal(response)
fmt.Print(string(out))

Atas ialah kandungan terperinci Bagaimana untuk mendapatkan respons "mesra" daripada Kubernetes APIServer menggunakan antara muka ReST. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam