<p>This is an easy to run version of the code I wrote to do port-forwarding via client-go. There are hardcoded pod name, namespace, and port. You can change them with the one you have running.</p>

<pre class="lang-golang prettyprint-override"><code>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(&lt;-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, &amp;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)
    }
}
</code></pre>

<p>Version golang 1.13:</p>

<pre><code>    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
</code></pre>

<p>The error I get is </p>

<blockquote>
  <p>error upgrading connection:  </p>
</blockquote>

<p>but there is nothing after the <code>:</code>.
Do you have any experience with this topic?
Thanks</p>

GianArb
<p>The <code>*rest.Request</code> has a <code>Prefix(string)</code> method you can use to insert the missing subpath:</p>
<pre class="lang-golang prettyprint-override"><code>reqURL := clientset.RESTClient().Post().
        Prefix(&quot;api/v1&quot;).
        Resource(&quot;pods&quot;).
        Namespace(&quot;default&quot;).
        Name(&quot;test&quot;).
        SubResource(&quot;portforward&quot;).URL()
</code></pre>
