我想在一个pod中使用k8s go client来执行exec命令。但是我找不到任何关于此的例子。所以我读了kubectl exec
源代码,并编写如下代码。并且err = exec.Stream(sopt)
总是在没有任何消息的情况下得到错误。谁能告诉我如何调试这个问题,或者给我一个正确的例子。
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())
}
答案 0 :(得分:1)
当命令是以/bin/sh
开头的字符串数组时,它对我有用:
[]string{"/bin/sh", "-c", "ls", "-ll", "."}
答案 1 :(得分:0)
您可能会感兴趣,看看e2e/framework/exec_util.go
答案 2 :(得分:0)
我在使用Kubernetes的exec
长时间Client-go
进入Pod时遇到了这个问题。但是最后我找到了一种使它起作用的方法。我在仓库中编写了一个简单的代码来执行此任务here。我要求您检查一下。我相信这会有所帮助。
答案 3 :(得分:0)
package k8s
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
}
对我有用。
答案 4 :(得分:0)
创建请求时您错过了.CoreV1()
!