Skip to content

Commit c8723ea

Browse files
committed
The controller defined in the k8s.io/cloud-provider/service didn't report any events in the service informer's event handler when a service is updated. It fixed the issue where a cloud-provider custom cloud-controller-manager may panic when a service is updated because the event recorder was used before it was initialized. All cloud provider should update the k8s.io/cloud-provider to the latest patched version to fix this issue if the version of the k8s.io/cloud-provider is greater than or equal to v1.31.0.
1 parent 98e5a70 commit c8723ea

File tree

2 files changed

+12
-25
lines changed

2 files changed

+12
-25
lines changed

staging/src/k8s.io/cloud-provider/controllers/service/controller.go

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func New(
139139
UpdateFunc: func(old, cur interface{}) {
140140
oldSvc, ok1 := old.(*v1.Service)
141141
curSvc, ok2 := cur.(*v1.Service)
142-
if ok1 && ok2 && (s.needsUpdate(oldSvc, curSvc) || needsCleanup(curSvc)) {
142+
if ok1 && ok2 && (needsUpdate(oldSvc, curSvc) || needsCleanup(curSvc)) {
143143
s.enqueueService(cur)
144144
}
145145
},
@@ -552,19 +552,17 @@ func needsCleanup(service *v1.Service) bool {
552552
}
553553

554554
// needsUpdate checks if load balancer needs to be updated due to change in attributes.
555-
func (c *Controller) needsUpdate(oldService *v1.Service, newService *v1.Service) bool {
555+
func needsUpdate(oldService *v1.Service, newService *v1.Service) bool {
556556
if !wantsLoadBalancer(oldService) && !wantsLoadBalancer(newService) {
557557
return false
558558
}
559559
if wantsLoadBalancer(oldService) != wantsLoadBalancer(newService) {
560-
c.eventRecorder.Eventf(newService, v1.EventTypeNormal, "Type", "%v -> %v",
561-
oldService.Spec.Type, newService.Spec.Type)
560+
klog.V(2).Infof("Service %s wants load balancer changed from %s to %s", klog.KObj(oldService), oldService.Spec.Type, newService.Spec.Type)
562561
return true
563562
}
564563

565564
if wantsLoadBalancer(newService) && !reflect.DeepEqual(oldService.Spec.LoadBalancerSourceRanges, newService.Spec.LoadBalancerSourceRanges) {
566-
c.eventRecorder.Eventf(newService, v1.EventTypeNormal, "LoadBalancerSourceRanges", "%v -> %v",
567-
oldService.Spec.LoadBalancerSourceRanges, newService.Spec.LoadBalancerSourceRanges)
565+
klog.V(2).Infof("Service %s LoadBalancerSourceRanges changed from %v to %v", klog.KObj(newService), oldService.Spec.LoadBalancerSourceRanges, newService.Spec.LoadBalancerSourceRanges)
568566
return true
569567
}
570568

@@ -576,47 +574,40 @@ func (c *Controller) needsUpdate(oldService *v1.Service, newService *v1.Service)
576574
return true
577575
}
578576
if !loadBalancerIPsAreEqual(oldService, newService) {
579-
c.eventRecorder.Eventf(newService, v1.EventTypeNormal, "LoadbalancerIP", "%v -> %v",
580-
oldService.Spec.LoadBalancerIP, newService.Spec.LoadBalancerIP)
577+
klog.V(2).Infof("Service %s LoadBalancerIP changed from %s to %s", klog.KObj(newService), oldService.Spec.LoadBalancerIP, newService.Spec.LoadBalancerIP)
581578
return true
582579
}
583580
if len(oldService.Spec.ExternalIPs) != len(newService.Spec.ExternalIPs) {
584-
c.eventRecorder.Eventf(newService, v1.EventTypeNormal, "ExternalIP", "Count: %v -> %v",
585-
len(oldService.Spec.ExternalIPs), len(newService.Spec.ExternalIPs))
581+
klog.V(2).Infof("Service %s ExternalIPs' count changed from %v to %v", klog.KObj(newService), len(oldService.Spec.ExternalIPs), len(newService.Spec.ExternalIPs))
586582
return true
587583
}
588584
for i := range oldService.Spec.ExternalIPs {
589585
if oldService.Spec.ExternalIPs[i] != newService.Spec.ExternalIPs[i] {
590-
c.eventRecorder.Eventf(newService, v1.EventTypeNormal, "ExternalIP", "Added: %v",
591-
newService.Spec.ExternalIPs[i])
586+
klog.V(2).Infof("Service %s ExternalIPs[%d] changed from %v to %v", klog.KObj(newService), i, oldService.Spec.ExternalIPs[i], newService.Spec.ExternalIPs[i])
592587
return true
593588
}
594589
}
595590
if !reflect.DeepEqual(oldService.Annotations, newService.Annotations) {
596591
return true
597592
}
598593
if oldService.UID != newService.UID {
599-
c.eventRecorder.Eventf(newService, v1.EventTypeNormal, "UID", "%v -> %v",
600-
oldService.UID, newService.UID)
594+
klog.V(2).Infof("Service %s UID changed from %s to %s", klog.KObj(newService), oldService.UID, newService.UID)
601595
return true
602596
}
603597
if oldService.Spec.ExternalTrafficPolicy != newService.Spec.ExternalTrafficPolicy {
604-
c.eventRecorder.Eventf(newService, v1.EventTypeNormal, "ExternalTrafficPolicy", "%v -> %v",
605-
oldService.Spec.ExternalTrafficPolicy, newService.Spec.ExternalTrafficPolicy)
598+
klog.V(2).Infof("Service %s ExternalTrafficPolicy changed from %s to %s", klog.KObj(newService), oldService.Spec.ExternalTrafficPolicy, newService.Spec.ExternalTrafficPolicy)
606599
return true
607600
}
608601
if oldService.Spec.HealthCheckNodePort != newService.Spec.HealthCheckNodePort {
609-
c.eventRecorder.Eventf(newService, v1.EventTypeNormal, "HealthCheckNodePort", "%v -> %v",
610-
oldService.Spec.HealthCheckNodePort, newService.Spec.HealthCheckNodePort)
602+
klog.V(2).Infof("Service %s HealthCheckNodePort changed from %v to %v", klog.KObj(newService), oldService.Spec.HealthCheckNodePort, newService.Spec.HealthCheckNodePort)
611603
return true
612604
}
613605

614606
// User can upgrade (add another clusterIP or ipFamily) or can downgrade (remove secondary clusterIP or ipFamily),
615607
// but CAN NOT change primary/secondary clusterIP || ipFamily UNLESS they are changing from/to/ON ExternalName
616608
// so not care about order, only need check the length.
617609
if len(oldService.Spec.IPFamilies) != len(newService.Spec.IPFamilies) {
618-
c.eventRecorder.Eventf(newService, v1.EventTypeNormal, "IPFamilies", "Count: %v -> %v",
619-
len(oldService.Spec.IPFamilies), len(newService.Spec.IPFamilies))
610+
klog.V(2).Infof("Service %s IPFamilies' count changed from %d to %d", klog.KObj(newService), len(oldService.Spec.IPFamilies), len(newService.Spec.IPFamilies))
620611
return true
621612
}
622613

staging/src/k8s.io/cloud-provider/controllers/service/controller_test.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1498,12 +1498,8 @@ func TestNeedsUpdate(t *testing.T) {
14981498

14991499
for _, tc := range testCases {
15001500
t.Run(tc.testName, func(t *testing.T) {
1501-
_, ctx := ktesting.NewTestContext(t)
1502-
ctx, cancel := context.WithCancel(ctx)
1503-
defer cancel()
1504-
controller, _, _ := newController(ctx)
15051501
oldSvc, newSvc := tc.updateFn()
1506-
obtainedResult := controller.needsUpdate(oldSvc, newSvc)
1502+
obtainedResult := needsUpdate(oldSvc, newSvc)
15071503
if obtainedResult != tc.expectedNeedsUpdate {
15081504
t.Errorf("%v needsUpdate() should have returned %v but returned %v", tc.testName, tc.expectedNeedsUpdate, obtainedResult)
15091505
}

0 commit comments

Comments
 (0)