From dd9402f4514c4c268e10a1c8be74c67006527657 Mon Sep 17 00:00:00 2001 From: Subrata Paul Date: Sun, 28 Apr 2019 00:25:18 +0530 Subject: [PATCH 1/3] 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 } From 7e04eeab50be656160ae6b51ae51a94ae12e6514 Mon Sep 17 00:00:00 2001 From: Subrata Paul Date: Mon, 29 Apr 2019 19:07:02 +0530 Subject: [PATCH 2/3] Updated pkg node BUILD for new lib inclusion --- pkg/util/node/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/util/node/BUILD b/pkg/util/node/BUILD index 08692c148a7..7d7f5238db2 100644 --- a/pkg/util/node/BUILD +++ b/pkg/util/node/BUILD @@ -15,6 +15,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", "//vendor/k8s.io/klog:go_default_library", From 2862f3ec94e145b50ab27b2c4ff67e0e50dbfcb5 Mon Sep 17 00:00:00 2001 From: Subrata Paul Date: Sat, 25 May 2019 00:46:50 +0530 Subject: [PATCH 3/3] Updated node.go using update-gofmt.sh --- pkg/util/node/node.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/util/node/node.go b/pkg/util/node/node.go index 4c78c8f4791..d6ec4edecc1 100644 --- a/pkg/util/node/node.go +++ b/pkg/util/node/node.go @@ -110,7 +110,7 @@ func GetNodeHostIP(node *v1.Node) (net.IP, error) { // If required, wait for the node to be defined. func GetNodeIP(client clientset.Interface, hostname string) net.IP { var nodeIP net.IP - backoff := wait.Backoff { + backoff := wait.Backoff{ Steps: 5, Duration: 1 * time.Second, Factor: 2.0,