Maison >développement back-end >Golang >Comment résoudre les erreurs lors de l'exécution de commandes dans les pods Kubernetes à l'aide du client Go ?

Comment résoudre les erreurs lors de l'exécution de commandes dans les pods Kubernetes à l'aide du client Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-03 14:11:13523parcourir

How to Troubleshoot Errors When Executing Commands in Kubernetes Pods Using the Go Client?

Exécuter des commandes dans des pods avec le client Kubernetes Go

Dans Kubernetes, la commande exec vous permet d'exécuter à distance des commandes sur un pod. Le client Go fournit une interface pratique pour effectuer cette opération.

Considérez le scénario suivant : vous devez exécuter la commande ls sur un pod nommé wordpress-mysql-213049546-29s7d.

config := &restclient.Config{
    Host:     "http://192.168.8.175:8080",
    Insecure: true,
}

config.ContentConfig.GroupVersion = &api.Unversioned
config.ContentConfig.NegotiatedSerializer = api.Codecs

restClient, err := restclient.RESTClientFor(config)
if err != nil {
    panic(err.Error())
}

req := restClient.Post().Resource("pods").Name("wordpress-mysql-213049546-29s7d").Namespace("default").SubResource("exec").Param("container", "mysql")
req.VersionedParams(&api.PodExecOptions{
    Container: "mysql",
    Command:   []string{"ls"},
    Stdin:     true,
    Stdout:    true,
}, api.ParameterCodec)

exec, err := remotecommand.NewExecutor(config, "POST", req.URL())
if err != nil {
    panic(err.Error())
}
sopt := remotecommand.StreamOptions{
    SupportedProtocols: remotecommandserver.SupportedStreamingProtocols,
    Stdin:              os.Stdin,
    Stdout:             os.Stdout,
    Stderr:             os.Stderr,
    Tty:                false,
}

err = exec.Stream(sopt)
if err != nil {
    panic(err.Error())
}

Vous rencontrez une erreur sans aucun message lorsque vous tentez d'exécuter ce code. Voici comment aborder le problème :

Débogage du code

  1. Vérifiez la connexion au serveur API Kubernetes : Assurez-vous que votre code peut communiquer avec le serveur API Kubernetes.
  2. Vérifiez le pod et l'espace de noms : Vérifiez à nouveau que le podName et l'espace de noms sont corrects.
  3. Examinez le manifeste du pod : Examinez le manifeste du pod pour confirmer que le conteneur mysql dispose des autorisations nécessaires pour exécuter la commande ls.

Utilisation d'un Exemple correct

Vous pouvez également vous référer à l'extrait de code suivant pour un fonctionnement exemple :

import (
    "io"

    v1 "k8s.io/api/core/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/kubernetes/scheme"
    restclient "k8s.io/client-go/rest"
    "k8s.io/client-go/tools/remotecommand"
)

// ExecCmd exec command on specific pod and wait the command's output.
func ExecCmdExample(client kubernetes.Interface, config *restclient.Config, podName string,
    command string, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
    cmd := []string{
        "sh",
        "-c",
        command,
    }
    req := client.CoreV1().RESTClient().Post().Resource("pods").Name(podName).
        Namespace("default").SubResource("exec")
    option := &v1.PodExecOptions{
        Command: cmd,
        Stdin:   true,
        Stdout:  true,
        Stderr:  true,
        TTY:     true,
    }
    if stdin == nil {
        option.Stdin = false
    }
    req.VersionedParams(
        option,
        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,
    })
    if err != nil {
        return err
    }

    return nil
}

Cet exemple de code devrait vous aider à exécuter avec succès des commandes sur des pods à l'aide du client Kubernetes Go.

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