Ошибка обновления соединения при переадресации портов через client-go

Это простая в использовании версия кода, который я написал для переадресации портов через client-go. Есть жестко заданное имя пода, пространство имен и порт. Вы можете изменить их на тот, который у вас запущен.

package main

import (
    "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)
    }
}

Версия голанг 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

Ошибка, которую я получаю,

ошибка обновления соединения:

но после : ничего нет. Есть ли у вас опыт работы с этой темой? Спасибо


person GianArb    schedule 25.11.2019    source источник
comment
попробуйте напечатать его с помощью %#v или %T, возможно, это опечатка с пустым сообщением.   -  person mh-cbon    schedule 27.11.2019


Ответы (3)


clientset.CoreV1().RESTClient().Post().
        Resource("pods").
        Namespace("default").
        Name("test").
        SubResource("portforward").URL()

у меня работает и дает URL с .../api/v1/namespaces...

person hsin    schedule 12.03.2020

У *rest.Request есть метод Prefix(string), который вы можете использовать для вставки отсутствующего подпути:

reqURL := clientset.RESTClient().Post().
        Prefix("api/v1").
        Resource("pods").
        Namespace("default").
        Name("test").
        SubResource("portforward").URL()
person tomaspinho    schedule 04.03.2021

У меня проблема частично решена. По крайней мере у меня все заработало и я доволен.

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)
person GianArb    schedule 27.11.2019