这是我编写的用于通过client-go进行端口转发的代码的易于运行的版本。有硬编码的Pod名称,名称空间和端口。您可以使用自己运行的计算机更改它们。
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)
}
}
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
我得到的错误是
错误升级连接:
但是:
之后什么也没有。
您对此主题有经验吗?
谢谢
答案 0 :(得分:0)
我的问题已部分解决。至少我让它工作了,对此我感到满意。
以下代码生成的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)
答案 1 :(得分:0)
var rngN18_29 = AllShts[b].getRange("N18:N29")
var formulas = rngN18_29.getFormulas();
for (var a = 0; a < formulas.length; a++) {
formulas[a][0] = formulas[a][0].replace("V","W");
}
rngN18_29.setFormulas(formulas);
为我工作,并使用... / api / v1 /命名空间...
答案 2 :(得分:0)
*rest.Request
有一个 Prefix(string)
方法可以用来插入缺失的子路径:
reqURL := clientset.RESTClient().Post().
Prefix("api/v1").
Resource("pods").
Namespace("default").
Name("test").
SubResource("portforward").URL()