Maison  >  Article  >  développement back-end  >  Comment obtenir des réponses « conviviales » de Kubernetes APIServer à l'aide de l'interface ReST

Comment obtenir des réponses « conviviales » de Kubernetes APIServer à l'aide de l'interface ReST

WBOY
WBOYavant
2024-02-09 08:10:181182parcourir

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

L'éditeur php Apple vous présentera comment utiliser l'interface ReST pour obtenir une réponse "conviviale" de l'APIServer Kubernetes. Kubernetes est une plate-forme d'orchestration de conteneurs populaire qui fournit des API pour gérer et surveiller diverses ressources du cluster. En utilisant l'interface ReST, nous pouvons facilement interagir avec le serveur API Kubernetes et obtenir les informations dont nous avons besoin. Dans cet article, nous explorerons en détail comment s'authentifier, envoyer des requêtes et gérer les réponses à l'aide de l'interface ReST, ainsi que comment gérer d'éventuelles conditions d'erreur. Que vous soyez un débutant ou un utilisateur expérimenté de Kubernetes, cet article vous fournira des orientations utiles et des conseils pratiques.

Contenu de la question

J'utilise la bibliothèque Golang Client-Go pour communiquer avec le serveur API Kubernetes au niveau Rest Get, Post. La réponse reçue n'est pas une structure json bien formée, ni une "sorte" d'objet API.

Le fragment du programme est :

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)

La réponse commence par :

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] [] [] ...

J'attends un résultat similaire à celui renvoyé par la commande suivante :

$ 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" ...

Solution de contournement

La réponse reçue n'est pas une structure JSON bien formée

Je pense que vous ne savez pas comment fonctionne le module client-go.

La réponse du reste de l'API est définitivement une réponse json bien formée, mais elle sera désorganisée dans une structure de données go (comme this ).

Si vous souhaitez accéder aux nœuds renvoyés, vous pouvez interagir avec les résultats en utilisant la syntaxe 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)
  }
}

J'attends un résultat similaire à celui renvoyé par la commande suivante :

Pourquoi? client-go Les liaisons renvoient des données utiles à votre code go. Si vous souhaitez générer une sortie json, vous devez explicitement marshaler la ressource au 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))

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer