mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-01 07:47:56 +00:00
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:
parent
bfdbfa2ab6
commit
cd1d530a1a
@ -67,6 +67,7 @@ const (
|
|||||||
ProviderName = "vsphere"
|
ProviderName = "vsphere"
|
||||||
providerIDPrefix = "vsphere://"
|
providerIDPrefix = "vsphere://"
|
||||||
updateNodeRetryCount = 3
|
updateNodeRetryCount = 3
|
||||||
|
zoneLabelsResyncPeriod = 5 * time.Minute
|
||||||
VolDir = "kubevols"
|
VolDir = "kubevols"
|
||||||
RoundTripperDefaultCount = 3
|
RoundTripperDefaultCount = 3
|
||||||
DummyVMPrefixName = "vsphere-k8s"
|
DummyVMPrefixName = "vsphere-k8s"
|
||||||
@ -312,6 +313,11 @@ func (vs *VSphere) SetInformers(informerFactory informers.SharedInformerFactory)
|
|||||||
AddFunc: vs.NodeAdded,
|
AddFunc: vs.NodeAdded,
|
||||||
DeleteFunc: vs.NodeDeleted,
|
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")
|
klog.V(4).Infof("Node informers in vSphere cloud provider initialized")
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1544,6 +1550,31 @@ func (vs *VSphere) NodeAdded(obj interface{}) {
|
|||||||
vs.setNodeZoneLabels(node)
|
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) {
|
func (vs *VSphere) setNodeZoneLabels(node *v1.Node) {
|
||||||
nodeZone := node.ObjectMeta.Labels[v1.LabelTopologyZone]
|
nodeZone := node.ObjectMeta.Labels[v1.LabelTopologyZone]
|
||||||
nodeRegion := node.ObjectMeta.Labels[v1.LabelTopologyRegion]
|
nodeRegion := node.ObjectMeta.Labels[v1.LabelTopologyRegion]
|
||||||
|
Loading…
Reference in New Issue
Block a user