Maison >développement back-end >Golang >Comment déboguer et exécuter correctement des commandes dans les pods Kubernetes à l'aide du client Go ?

Comment déboguer et exécuter correctement des commandes dans les pods Kubernetes à l'aide du client Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-08 18:01:12411parcourir

How to Debug and Correctly Execute Commands in Kubernetes Pods Using the Go Client?

Exécution d'un pod Kubernetes à l'aide du client Go

Vous souhaitez exécuter une commande dans un pod à l'aide du client Kubernetes Go, mais votre implémentation actuelle est rencontrer une erreur dans exec.Stream(sopt) sans aucun message d'erreur. Cet article vous guidera tout au long du débogage et fournit un exemple correct pour votre cas d'utilisation.

Débogage du problème

L'erreur actuelle peut survenir en raison de paramètres de configuration incorrects ou ne correspondent pas versions. Vérifiez les éléments suivants :

  • Assurez-vous que le champ Hôte de votre configuration correspond à l'adresse du serveur API Kubernetes.
  • Mettez à jour config.ContentConfig.GroupVersion pour utiliser la version correcte de l'API Kubernetes prise en charge par votre cluster.
  • Vérifiez si le nom du conteneur fourni dans req.VersionedParams correspond au nom d'un conteneur existant dans le pod spécifié.

Implémentation correcte

Voici un exemple corrigé basé sur la fonction ExecCmdExample modifiée :

package k8s

import (
    "io"

    v1 "k8s.io/api/core/v1"
    "k8s.io/client-go/kubernetes"
    _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" // Auth plugin specific to GKE
    "k8s.io/client-go/rest"
    "k8s.io/client-go/tools/remotecommand"
)

// ExecCmdExample executes a command on a specific pod and waits for the command's output.
func ExecCmdExample(client kubernetes.Interface, podName string,
    command string, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
    // Use a larger reader buffer size to handle long outputs.
    buf := make([]byte, 10000)

    cmd := []string{
        "sh",
        "-c",
        command,
    }

    options := &v1.PodExecOptions{
        Command: cmd,
        Stdin:   stdin != nil,
        Stdout:  true,
        Stderr:  true,
        TTY:     false,
    }

    req := client.CoreV1().RESTClient().Post().
        Resource("pods").
        Name(podName).
        Namespace("default").
        SubResource("exec").
        VersionedParams(
            options,
            scheme.ParameterCodec,
        )

    exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL())
    if err != nil {
        return err
    }

    err = exec.Stream(remotecommand.StreamOptions{
        Stdin:  stdin,
        Stdout: stdout,
        Stderr: stderr,
    })
    
    // Read additional output if necessary.
    if _, err = exec.Read(buf); err != nil {
        return err
    }

    return nil
}
  • Le La variable de configuration a été supprimée car elle est supposée être configurée ailleurs.
  • La variable La méthode VersionedParams gère désormais les versions plus récentes de PodExecOptions et ParameterCodec.
  • Un lecteur mis en mémoire tampon est utilisé pour gérer les sorties de commandes longues.
  • L'option TTY est définie sur false car vous n'avez pas besoin de la prise en charge du terminal interactif. .

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:
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