go 涉及的包引入
go mod init hello
go get k8s.io/api/core/v1
go get k8s.io/client-go/kubernetes
go get k8s.io/client-go/tools/clientcmd
go get k8s.io/client-go/tools/remotecommand
go get k8s.io/client-go/util/homedir
go get k8s.io/kubectl/pkg/scheme
go Kubernetes 客户端库相关的包,相当于脚本执行kubectl exec 进入容器内部
package main
import (
"context"
"flag"
"fmt"
"os"
"path/filepath"
corev1 "k8s.io/api/core/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/tools/remotecommand"
"k8s.io/client-go/util/homedir"
"k8s.io/kubectl/pkg/scheme"
)
func main() {
// 1. 加载 kubeconfig(支持命令行参数和环境变量)
var kubeconfig *string
if home := homedir.HomeDir(); home != "" {
kubeconfig = flag.String("kubeconfig",
filepath.Join("/root/go/fast/","kubeconfig"), //相对路径,绝对路径都可以
"")
}
flag.Parse()
// 2. 创建客户端配置
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
fmt.Printf("创建配置失败: %v\n", err)
os.Exit(1)
}
// 3. 初始化客户端
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
fmt.Printf("创建客户端失败: %v\n", err)
os.Exit(1)
}
// 4. 构造 Exec 请求参数
podName := "hello-55d78b94bf-fxhcg" // 替换为实际 Pod 名称
containerName := "hello" // 替换为容器名称,不填为默认
req := clientset.CoreV1().RESTClient().Post().
Resource("pods").
Name(podName).
Namespace("bizworks").
SubResource("exec").
VersionedParams(&corev1.PodExecOptions{
Container: containerName,
Command: []string{"/bin/bash"},
Stdin: true,
Stdout: true,
Stderr: true,
TTY: true,
}, scheme.ParameterCodec)
// 5. 建立终端连接
executor, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL())
if err != nil {
fmt.Printf("创建执行器失败: %v\n", err)
os.Exit(1)
}
// 6. 启动交互式会话
fmt.Printf("正在连接到 Pod %s 的容器 %s...\n", podName, containerName)
err = executor.StreamWithContext(context.Background(), remotecommand.StreamOptions{
Stdin: os.Stdin,
Stdout: os.Stdout,
Stderr: os.Stderr,
Tty: true,
})
if err != nil {
fmt.Printf("终端会话失败: %v\n", err)
os.Exit(1)
}
}