Maison > développement back-end > Golang > Erreur lors de l'exécution d'une commande spécifique dans le pod

Erreur lors de l'exécution d'une commande spécifique dans le pod

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2024-02-09 17:30:10
avant
715 Les gens l'ont consulté

在 pod 中运行特定命令时出现错误

php小编鱼仔在使用pod运行特定命令时遇到了错误。这个问题对于开发人员来说是非常常见的,但解决起来可能会有些困难。当我们在pod中执行特定命令时出现错误,这可能是由于多种因素引起的,比如版本不兼容、依赖关系问题等。在解决这个问题之前,我们需要先确定具体的错误信息,然后逐步排查和解决。在本文中,我们将介绍一些常见的错误情况和相应的解决方案,希望能帮助到遇到类似问题的开发人员。

问题内容

我正在尝试在正在运行的 pod 中执行命令。我正在使用 go k8sclient 来实现此目的,但遇到了问题。我也不知道解决方案是否正确。任何人都可以检查并提供正确的解决方案吗?

这是我的代码。

namespace := getnamespace()
        podname := "maxscale-0"

        config, err := rest.inclusterconfig()
        if err != nil {
                log.fatal(err)
        }

        clientset, err := kubernetes.newforconfig(config)
        if err != nil {
                log.fatal(err)
        }



        req := clientset.corev1().pods(namespace).exec(podname, &corev1.podexecoptions{
                command: []string{"sh", "-c", "grep -op '\"name\": \"\\k[^\"]*' /var/lib/maxscale/mariadb-monitor_journal.json"},
        })

        // set up a stream to capture the output
        execstream, err := req.stream()
        if err != nil {
                fmt.println(err)
                os.exit(1)
        }

        // print the output
        buf := new(bytes.buffer)
        buf.readfrom(execstream)
        fmt.println(buf.string())
Copier après la connexion

我得到的错误是

clientset.CoreV1().Pods(namespace).Exec undefined (type "k8s.io/client-go/kubernetes/typed/core/v1".PodInterface has no field or method Exec)
Copier après la connexion

解决方法

正如 @david maze 所分享的,要使用 k8 的 go 客户端在 pod 中执行命令,请遵循以下代码:

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
}
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!

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