如何使用go 语言调用k8s相关依赖包,执行进入容器内部

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)
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容