From dd9402f4514c4c268e10a1c8be74c67006527657 Mon Sep 17 00:00:00 2001 From: Subrata Paul Date: Sun, 28 Apr 2019 00:25:18 +0530 Subject: [PATCH] Fix for kube-proxy to wait for some duration for the node to be defined Kube-proxy must atleast wait for some duration for the node to defined so that it can fetch the node IP. This node IP is currently used in ipvs proxier for the node-port services. --- cmd/kube-proxy/app/server_others.go | 3 +++ pkg/util/node/node.go | 31 +++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/cmd/kube-proxy/app/server_others.go b/cmd/kube-proxy/app/server_others.go index a92c1492f5d..70f347d09dd 100644 --- a/cmd/kube-proxy/app/server_others.go +++ b/cmd/kube-proxy/app/server_others.go @@ -143,6 +143,9 @@ func newProxyServer( nodeIP := net.ParseIP(config.BindAddress) if nodeIP.IsUnspecified() { nodeIP = utilnode.GetNodeIP(client, hostname) + if nodeIP == nil { + return nil, fmt.Errorf("unable to get node IP for hostname %s", hostname) + } } if proxyMode == proxyModeIPTables { klog.V(0).Info("Using iptables Proxier.") diff --git a/pkg/util/node/node.go b/pkg/util/node/node.go index 087a0bc82dd..4c78c8f4791 100644 --- a/pkg/util/node/node.go +++ b/pkg/util/node/node.go @@ -30,6 +30,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/strategicpatch" + "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" v1core "k8s.io/client-go/kubernetes/typed/core/v1" ) @@ -106,17 +107,31 @@ func GetNodeHostIP(node *v1.Node) (net.IP, error) { } // GetNodeIP returns the ip of node with the provided hostname +// If required, wait for the node to be defined. func GetNodeIP(client clientset.Interface, hostname string) net.IP { var nodeIP net.IP - node, err := client.CoreV1().Nodes().Get(hostname, metav1.GetOptions{}) - if err != nil { - klog.Warningf("Failed to retrieve node info: %v", err) - return nil + backoff := wait.Backoff { + Steps: 5, + Duration: 1 * time.Second, + Factor: 2.0, + Jitter: 0.2, } - nodeIP, err = GetNodeHostIP(node) - if err != nil { - klog.Warningf("Failed to retrieve node IP: %v", err) - return nil + + err := wait.ExponentialBackoff(backoff, func() (bool, error) { + node, err := client.CoreV1().Nodes().Get(hostname, metav1.GetOptions{}) + if err != nil { + klog.Errorf("Failed to retrieve node info: %v", err) + return false, nil + } + nodeIP, err = GetNodeHostIP(node) + if err != nil { + klog.Errorf("Failed to retrieve node IP: %v", err) + return false, err + } + return true, nil + }) + if err == nil { + klog.Infof("Successfully retrieved node IP: %v", nodeIP) } return nodeIP }