K8S学习指南(69)-客户端client-go的使用
package main
import (
"context"
"fmt"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/remotecommand"
"os"
"path/filepath"
// 导入客户端go相关的包
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
)
// 初始化k8s客户端
func initKubeClient() *kubernetes.Clientset {
config, err := rest.InClusterConfig()
if err != nil {
panic(err.Error())
}
clientset := kubernetes.NewForConfigOrDie(config)
return clientset
}
// 执行kubectl exec命令
func execCommand(client *kubernetes.Clientset, podName, containerName, namespace, command string) error {
req := client.CoreV1().RESTClient().Post().
Resource("pods").
Name(podName).
Namespace(namespace).
SubResource("exec").
Param("container", containerName)
req.VersionedParams(&corev1.PodExecOptions{
Command: []string{"sh", "-c", command},
Stdin: true,
Stdout: true,
Stderr: true,
TTY: true,
}, scheme.ParameterCodec)
exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL())
if err != nil {
return err
}
err = exec.Stream(remotecommand.StreamOptions{
Stdin: os.Stdin,
Stdout: os.Stdout,
Stderr: os.Stderr,
Tty: true,
})
return err
}
func main() {
// 获取Pod名称
podName := "my-pod"
// 获取容器名称
containerName := "my-container"
// 获取命名空间
namespace := "default"
// 获取要执行的命令
command := "ls -l"
client := initKubeClient()
err := execCommand(client, podName, containerName, namespace, command)
if err != nil {
panic(err.Error())
}
}
这段代码展示了如何使用client-go包在Go语言中初始化Kubernetes客户端,并执行一个简单的kubectl exec命令。这对于理解如何在Go语言中与Kubernetes集群交互是非常有用的。
评论已关闭