Skip to content

Commit fa4bc10

Browse files
authored
Merge pull request kubernetes#86793 from prameshj/gce-finalizer
Attach a new finalizer in GCE ILB creation.
2 parents 95a1d5e + 1de2327 commit fa4bc10

File tree

9 files changed

+295
-17
lines changed

9 files changed

+295
-17
lines changed

cluster/gce/addons/loadbalancing/cloud-provider-role.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ rules:
3333
- create
3434
- patch
3535
- update
36+
- apiGroups:
37+
- ""
38+
resources:
39+
- services/status
40+
verbs:
41+
- patch
42+
- update
3643
---
3744
apiVersion: rbac.authorization.k8s.io/v1
3845
kind: Role

pkg/controller/service/controller.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,6 +804,7 @@ func (s *Controller) addFinalizer(service *v1.Service) error {
804804
updated.ObjectMeta.Finalizers = append(updated.ObjectMeta.Finalizers, servicehelper.LoadBalancerCleanupFinalizer)
805805

806806
klog.V(2).Infof("Adding finalizer to service %s/%s", updated.Namespace, updated.Name)
807+
// TODO(87447) use PatchService from k8s.io/cloud-provider/service/helpers
807808
_, err := patch(s.kubeClient.CoreV1(), service, updated)
808809
return err
809810
}

staging/src/k8s.io/legacy-cloud-providers/gce/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,13 @@ go_library(
5050
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
5151
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
5252
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
53+
"//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library",
5354
"//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library",
5455
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
5556
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
5657
"//staging/src/k8s.io/client-go/informers:go_default_library",
5758
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
59+
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
5860
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
5961
"//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library",
6062
"//staging/src/k8s.io/client-go/pkg/version:go_default_library",

staging/src/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_internal.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,30 @@ import (
4141
const (
4242
// Used to list instances in all states(RUNNING and other) - https://cloud.google.com/compute/docs/reference/rest/v1/instanceGroups/listInstances
4343
allInstances = "ALL"
44+
// ILBFinalizerV1 key is used to identify ILB services whose resources are managed by service controller.
45+
ILBFinalizerV1 = "gke.networking.io/l4-ilb-v1"
46+
// ILBFinalizerV2 is the finalizer used by newer controllers that implement Internal LoadBalancer services.
47+
ILBFinalizerV2 = "gke.networking.io/l4-ilb-v2"
4448
)
4549

4650
func (g *Cloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v1.Service, existingFwdRule *compute.ForwardingRule, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) {
47-
if g.AlphaFeatureGate.Enabled(AlphaFeatureILBSubsets) {
51+
if g.AlphaFeatureGate.Enabled(AlphaFeatureILBSubsets) && existingFwdRule == nil {
52+
// When ILBSubsets is enabled, new ILB services will not be processed here.
53+
// Services that have existing GCE resources created by this controller will continue to update.
54+
g.eventRecorder.Eventf(svc, v1.EventTypeNormal, "SkippingEnsureInternalLoadBalancer",
55+
"Skipped ensureInternalLoadBalancer since %s feature is enabled.", AlphaFeatureILBSubsets)
56+
return nil, cloudprovider.ImplementedElsewhere
57+
}
58+
if hasFinalizer(svc, ILBFinalizerV2) {
59+
// Another controller is handling the resources for this service.
60+
g.eventRecorder.Eventf(svc, v1.EventTypeNormal, "SkippingEnsureInternalLoadBalancer",
61+
"Skipped ensureInternalLoadBalancer as service contains '%s' finalizer.", ILBFinalizerV2)
4862
return nil, cloudprovider.ImplementedElsewhere
4963
}
64+
if err := addFinalizer(svc, g.client.CoreV1(), ILBFinalizerV1); err != nil {
65+
klog.Errorf("Failed to attach finalizer '%s' on service %s/%s - %v", ILBFinalizerV1, svc.Namespace, svc.Name, err)
66+
return nil, err
67+
}
5068

5169
nm := types.NamespacedName{Name: svc.Name, Namespace: svc.Namespace}
5270
ports, _, protocol := getPortsAndProtocol(svc.Spec.Ports)
@@ -298,6 +316,11 @@ func (g *Cloud) ensureInternalLoadBalancerDeleted(clusterName, clusterID string,
298316
return err
299317
}
300318

319+
if err := removeFinalizer(svc, g.client.CoreV1(), ILBFinalizerV1); err != nil {
320+
klog.Errorf("Failed to remove finalizer '%s' on service %s/%s - %v", ILBFinalizerV1, svc.Namespace, svc.Name, err)
321+
return err
322+
}
323+
301324
return nil
302325
}
303326

0 commit comments

Comments
 (0)