Maison >développement back-end >Golang >Comment obtenir des réponses « conviviales » de Kubernetes APIServer à l'aide de l'interface ReST
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.
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" ...
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!