Pod執行指令方法,傳回指令執行的标準輸出和标準錯誤
import (
"bytes"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
restclient "k8s.io/client-go/rest"
"k8s.io/client-go/tools/remotecommand"
"strings"
//"strings"
)
...
// 入參為kubeconfig、pod名字、命名空間、指令字元串
func cmdExecuter(config *restclient.Config, podName, namespace, cmd string) (map[string]string, error) {
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, err
}
// 構造執行指令請求
req := clientset.CoreV1().RESTClient().Post().
Resource("pods").
Name(podName).
Namespace(namespace).
SubResource("exec").
VersionedParams(&v1.PodExecOptions{
Command: []string{"sh", "-c", cmd},
Stdin: true,
Stdout: true,
Stderr: true,
TTY: false,
}, scheme.ParameterCodec)
// 執行指令
executor, err := remotecommand.NewSPDYExecutor(config, "POST",req.URL())
if err != nil {
return nil, err
}
// 使用bytes.Buffer變量接收标準輸出和标準錯誤
var stdout, stderr bytes.Buffer
if err = executor.Stream(remotecommand.StreamOptions{
Stdin: strings.NewReader(""),
Stdout: &stdout,
Stderr: &stderr,
}); err != nil {
return nil, err
}
// 傳回資料
ret := map[string]string{"stdout":stdout.String(), "stderr":stderr.String(), "pod_name": podName}
return ret, nil
}