From b8fc9d9a05bc4bd438f677bb644075b73f3c4aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=A5=96=E5=BB=BA?= Date: Fri, 24 Mar 2023 13:38:46 +0800 Subject: [PATCH] controller: fix apiserver connection timeout on startup (#2545) --- pkg/controller/config.go | 9 ++++++++- pkg/daemon/config.go | 7 +++++++ pkg/util/k8s.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/pkg/controller/config.go b/pkg/controller/config.go index 9b2ab48e465..46b8e58ddee 100644 --- a/pkg/controller/config.go +++ b/pkg/controller/config.go @@ -12,10 +12,10 @@ import ( "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/klog/v2" + "kubevirt.io/client-go/kubecli" clientset "github.com/kubeovn/kube-ovn/pkg/client/clientset/versioned" "github.com/kubeovn/kube-ovn/pkg/util" - "kubevirt.io/client-go/kubecli" ) // Configuration is the controller conf @@ -301,6 +301,13 @@ func (config *Configuration) initKubeClient() error { klog.Errorf("failed to build kubeconfig %v", err) return err } + + // try to connect to apiserver's tcp port + if err = util.DialApiServer(cfg.Host); err != nil { + klog.Errorf("failed to dial apiserver: %v", err) + return err + } + cfg.QPS = 1000 cfg.Burst = 2000 // use cmd arg to modify timeout later diff --git a/pkg/daemon/config.go b/pkg/daemon/config.go index e93ab80e811..d24d9ee1fc6 100644 --- a/pkg/daemon/config.go +++ b/pkg/daemon/config.go @@ -325,6 +325,13 @@ func (config *Configuration) initKubeClient() error { return err } } + + // try to connect to apiserver's tcp port + if err = util.DialApiServer(cfg.Host); err != nil { + klog.Errorf("failed to dial apiserver: %v", err) + return err + } + cfg.QPS = 1000 cfg.Burst = 2000 diff --git a/pkg/util/k8s.go b/pkg/util/k8s.go index 8b7edf67ee1..176980216ea 100644 --- a/pkg/util/k8s.go +++ b/pkg/util/k8s.go @@ -1,11 +1,39 @@ package util import ( + "fmt" + "net" + "net/url" "strings" + "time" v1 "k8s.io/api/core/v1" + "k8s.io/klog/v2" ) +func DialApiServer(host string) error { + u, err := url.Parse(host) + if err != nil { + return fmt.Errorf("failed to parse host %q: %v", host, err) + } + + address := net.JoinHostPort(u.Hostname(), u.Port()) + timer := time.NewTimer(3 * time.Second) + for i := 0; i < 10; i++ { + conn, err := net.DialTimeout("tcp", address, 3*time.Second) + if err == nil { + klog.Infof("succeeded to dial apiserver %q", address) + _ = conn.Close() + return nil + } + klog.Warningf("failed to dial apiserver %q: %v", address, err) + <-timer.C + timer.Reset(3 * time.Second) + } + + return fmt.Errorf("timed out dialing apiserver %q", host) +} + func GetNodeInternalIP(node v1.Node) (ipv4, ipv6 string) { var ips []string for _, addr := range node.Status.Addresses {