From 38597a26a8475195b6381b8468f2001373b220cd Mon Sep 17 00:00:00 2001 From: Wojciech Tyczynski Date: Fri, 24 Nov 2017 12:14:43 +0100 Subject: [PATCH] Update NetworkUnavailable condition in ipam controller --- pkg/controller/node/ipam/BUILD | 1 + pkg/controller/node/ipam/cloud_cidr_allocator.go | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/pkg/controller/node/ipam/BUILD b/pkg/controller/node/ipam/BUILD index 1f0d52855b..e72f938e94 100644 --- a/pkg/controller/node/ipam/BUILD +++ b/pkg/controller/node/ipam/BUILD @@ -42,6 +42,7 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/controller/node/ipam", deps = [ + "//pkg/api/v1/node:go_default_library", "//pkg/cloudprovider:go_default_library", "//pkg/cloudprovider/providers/gce:go_default_library", "//pkg/controller:go_default_library", diff --git a/pkg/controller/node/ipam/cloud_cidr_allocator.go b/pkg/controller/node/ipam/cloud_cidr_allocator.go index 97c70bc0ca..87fba8bb0a 100644 --- a/pkg/controller/node/ipam/cloud_cidr_allocator.go +++ b/pkg/controller/node/ipam/cloud_cidr_allocator.go @@ -36,11 +36,12 @@ import ( clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" v1core "k8s.io/client-go/kubernetes/typed/core/v1" + v1node "k8s.io/kubernetes/pkg/api/v1/node" "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/cloudprovider/providers/gce" "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller/node/util" - nodeutil "k8s.io/kubernetes/pkg/util/node" + utilnode "k8s.io/kubernetes/pkg/util/node" ) // cloudCIDRAllocator allocates node CIDRs according to IP address aliases @@ -105,6 +106,12 @@ func NewCloudCIDRAllocator(client clientset.Interface, cloud cloudprovider.Inter if newNode.Spec.PodCIDR == "" { return ca.AllocateOrOccupyCIDR(newNode) } + // Even if PodCIDR is assigned, but NetworkUnavailable condition is + // set to true, we need to process the node to set the condition. + _, cond := v1node.GetNodeCondition(&newNode.Status, v1.NodeNetworkUnavailable) + if cond == nil || cond.Status != v1.ConditionFalse { + return ca.AllocateOrOccupyCIDR(newNode) + } return nil }), DeleteFunc: util.CreateDeleteNodeHandler(ca.ReleaseCIDR), @@ -209,7 +216,8 @@ func (ca *cloudCIDRAllocator) updateCIDRAllocation(nodeName string) error { if node.Spec.PodCIDR != "" { if node.Spec.PodCIDR == podCIDR { glog.V(4).Infof("Node %v already has allocated CIDR %v. It matches the proposed one.", node.Name, podCIDR) - return nil + // We don't return to set the NetworkUnavailable condition if needed. + break } glog.Errorf("PodCIDR being reassigned! Node %v spec has %v, but cloud provider has assigned %v", node.Name, node.Spec.PodCIDR, podCIDR) @@ -219,7 +227,7 @@ func (ca *cloudCIDRAllocator) updateCIDRAllocation(nodeName string) error { // // See https://github.com/kubernetes/kubernetes/pull/42147#discussion_r103357248 } - if err = nodeutil.PatchNodeCIDR(ca.client, types.NodeName(node.Name), podCIDR); err == nil { + if err = utilnode.PatchNodeCIDR(ca.client, types.NodeName(node.Name), podCIDR); err == nil { glog.Infof("Set node %v PodCIDR to %v", node.Name, podCIDR) break } @@ -231,7 +239,7 @@ func (ca *cloudCIDRAllocator) updateCIDRAllocation(nodeName string) error { return err } - err = nodeutil.SetNodeCondition(ca.client, types.NodeName(node.Name), v1.NodeCondition{ + err = utilnode.SetNodeCondition(ca.client, types.NodeName(node.Name), v1.NodeCondition{ Type: v1.NodeNetworkUnavailable, Status: v1.ConditionFalse, Reason: "RouteCreated",