Maison > développement back-end > Golang > 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
Libérer: 2024-02-09 08:10:18
avant
1231 Les gens l'ont consulté

如何使用 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)
Copier après la connexion

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] [] [] ...
Copier après la connexion

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" ...
Copier après la connexion

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)
  }
}
Copier après la connexion

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))
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal