Add zone/region labels sync function

In the case of `vsphere-legacy-cloud-provider` client
has insufficient permissions to update Node after its addition,
this handler will attempt to populate Nodes topology labels later.
This commit is contained in:
Denis Moiseev 2022-01-25 14:37:58 +01:00
parent bfdbfa2ab6
commit cd1d530a1a

View File

@ -67,6 +67,7 @@ const (
ProviderName = "vsphere"
providerIDPrefix = "vsphere://"
updateNodeRetryCount = 3
zoneLabelsResyncPeriod = 5 * time.Minute
VolDir = "kubevols"
RoundTripperDefaultCount = 3
DummyVMPrefixName = "vsphere-k8s"
@ -312,6 +313,11 @@ func (vs *VSphere) SetInformers(informerFactory informers.SharedInformerFactory)
AddFunc: vs.NodeAdded,
DeleteFunc: vs.NodeDeleted,
})
// Register sync function for node zone/region labels
nodeInformer.AddEventHandlerWithResyncPeriod(
cache.ResourceEventHandlerFuncs{UpdateFunc: vs.syncNodeZoneLabels},
zoneLabelsResyncPeriod,
)
klog.V(4).Infof("Node informers in vSphere cloud provider initialized")
}
@ -1544,6 +1550,31 @@ func (vs *VSphere) NodeAdded(obj interface{}) {
vs.setNodeZoneLabels(node)
}
// Node zone labels sync function, intended to be called periodically within kube-controller-manager.
func (vs *VSphere) syncNodeZoneLabels(_ interface{}, newObj interface{}) {
node, ok := newObj.(*v1.Node)
if node == nil || !ok {
klog.Warningf("NodeUpdated: unrecognized object %+v", newObj)
return
}
// Populate zone and region labels if needed.
// This logic engages only if credentials provided via secret.
// Returns early if topology labels are already presented.
// https://github.com/kubernetes/kubernetes/issues/75175
if vs.isSecretInfoProvided && vs.isZoneEnabled() {
labels := node.GetLabels()
_, zoneOk := labels[v1.LabelTopologyZone]
_, regionOk := labels[v1.LabelTopologyRegion]
if zoneOk && regionOk {
klog.V(6).Infof("Node topology labels are already populated")
return
}
klog.V(4).Infof("Topology labels was not found, trying to populate for node %s", node.Name)
vs.setNodeZoneLabels(node)
}
}
func (vs *VSphere) setNodeZoneLabels(node *v1.Node) {
nodeZone := node.ObjectMeta.Labels[v1.LabelTopologyZone]
nodeRegion := node.ObjectMeta.Labels[v1.LabelTopologyRegion]