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

ddhy6vgd  于 2023-01-16  发布在  Kubernetes
关注(0)|答案(1)|浏览(195)

我正在尝试执行一个命令到一个正在运行的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())

我得到的错误是

clientset.CoreV1().Pods(namespace).Exec undefined (type "k8s.io/client-go/kubernetes/typed/core/v1".PodInterface has no field or method Exec)
bvuwiixz

bvuwiixz1#

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

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
}

有关详细信息,另请参阅此link

相关问题