为了账号安全,请及时绑定邮箱和手机立即绑定

通过client-go升级端口转发时出现连接错误

通过client-go升级端口转发时出现连接错误

Go
凤凰求蛊 2023-08-07 14:38:57
这是我编写的通过 client-go 进行端口转发的代码的易于运行的版本。有硬编码的 Pod 名称、命名空间和端口。您可以使用您正在运行的程序来更改它们。package mainimport (    "flag"    "net/http"    "os"    "path/filepath"    "k8s.io/client-go/kubernetes"    "k8s.io/client-go/tools/clientcmd"    "k8s.io/client-go/tools/portforward"    "k8s.io/client-go/transport/spdy")func main() {    stopCh := make(<-chan struct{})    readyCh := make(chan struct{})    var kubeconfig *string    if home := "/home/gianarb"; home != "" {        kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")    } else {        kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")    }    flag.Parse()    // use the current context in kubeconfig    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)    if err != nil {        panic(err.Error())    }    // create the clientset    clientset, err := kubernetes.NewForConfig(config)    if err != nil {        panic(err.Error())    }    reqURL := clientset.RESTClient().Post().        Resource("pods").        Namespace("default").        Name("test").        SubResource("portforward").URL()    transport, upgrader, err := spdy.RoundTripperFor(config)    if err != nil {        panic(err)    }    dialer := spdy.NewDialer(upgrader, &http.Client{Transport: transport}, http.MethodPost, reqURL)    fw, err := portforward.New(dialer, []string{"9999:9999"}, stopCh, readyCh, os.Stdout, os.Stdout)    if err != nil {        panic(err)    }    if err := fw.ForwardPorts(); err != nil {        panic(err)    }}golang 1.13版本:    k8s.io/api v0.0.0-20190409021203-6e4e0e4f393b    k8s.io/apimachinery v0.0.0-20190404173353-6a84e37a896d    k8s.io/cli-runtime v0.0.0-20190409023024-d644b00f3b79    k8s.io/client-go v11.0.0+incompatible我得到的错误是升级连接时出错:但之后就什么也没有了:。您对这个话题有什么经验吗?谢谢
查看完整描述

3 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

clientset.CoreV1().RESTClient().Post().

        Resource("pods").

        Namespace("default").

        Name("test").

        SubResource("portforward").URL()

对我有用,并给出带有 .../api/v1/namespaces... 的 url


查看完整回答
反对 回复 2023-08-07
?
Helenr

TA贡献1780条经验 获得超3个赞

有*rest.Request一个Prefix(string)方法可以用来插入丢失的子路径:


reqURL := clientset.RESTClient().Post().

        Prefix("api/v1").

        Resource("pods").

        Namespace("default").

        Name("test").

        SubResource("portforward").URL()


查看完整回答
反对 回复 2023-08-07
?
烙印99

TA贡献1829条经验 获得超13个赞

我部分解决了问题。至少我让它工作了并且我对此感到满意。


下面的代码生成的URL是https://192.168.99.125:8443/namespaces/default/pods/influxdb-65c9fdf9cb-nzvpf/portforward?timeout=32s


reqURL := clientset.RESTClient().Post().

        Resource("pods").

        Namespace("default").

        Name("test").

        SubResource("portforward").URL()

这是错误的,正确的是:


https://192.168.99.125:8443/api/v1/namespaces/default/pods/influxdb-65c9fdf9cb-nzvpf/portforward

这就是我现在生成该 URL 的方法:


    path := fmt.Sprintf("/api/v1/namespaces/%s/pods/%s/portforward", "default", podName)


    hostIP := strings.TrimLeft(config.Host, "htps:/")

    serverURL := url.URL{Scheme: "https", Path: path, Host: hostIP}

    dialer := spdy.NewDialer(upgrader, &http.Client{Transport: transport}, http.MethodPost, &serverURL)



查看完整回答
反对 回复 2023-08-07
  • 3 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信