mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-05 02:09:56 +00:00
Merge pull request #104925 from prameshj/ilbracefix
Process GCE ILB services with the v1 annotation in the service controller
This commit is contained in:
commit
198c9c70f1
@ -53,17 +53,21 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (g *Cloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v1.Service, existingFwdRule *compute.ForwardingRule, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) {
|
func (g *Cloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v1.Service, existingFwdRule *compute.ForwardingRule, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) {
|
||||||
if g.AlphaFeatureGate.Enabled(AlphaFeatureILBSubsets) && existingFwdRule == nil {
|
if existingFwdRule == nil && !hasFinalizer(svc, ILBFinalizerV1) {
|
||||||
|
// Neither the forwarding rule nor the V1 finalizer exists. This is most likely a new service.
|
||||||
|
if g.AlphaFeatureGate.Enabled(AlphaFeatureILBSubsets) {
|
||||||
// When ILBSubsets is enabled, new ILB services will not be processed here.
|
// When ILBSubsets is enabled, new ILB services will not be processed here.
|
||||||
// Services that have existing GCE resources created by this controller will continue to update.
|
// Services that have existing GCE resources created by this controller or the v1 finalizer
|
||||||
|
// will continue to update.
|
||||||
klog.V(2).Infof("Skipped ensureInternalLoadBalancer for service %s/%s, since %s feature is enabled.", svc.Namespace, svc.Name, AlphaFeatureILBSubsets)
|
klog.V(2).Infof("Skipped ensureInternalLoadBalancer for service %s/%s, since %s feature is enabled.", svc.Namespace, svc.Name, AlphaFeatureILBSubsets)
|
||||||
return nil, cloudprovider.ImplementedElsewhere
|
return nil, cloudprovider.ImplementedElsewhere
|
||||||
}
|
}
|
||||||
if hasFinalizer(svc, ILBFinalizerV2) {
|
if hasFinalizer(svc, ILBFinalizerV2) {
|
||||||
// Another controller is handling the resources for this service.
|
// No V1 resources present - Another controller is handling the resources for this service.
|
||||||
klog.V(2).Infof("Skipped ensureInternalLoadBalancer for service %s/%s, as service contains %q finalizer.", svc.Namespace, svc.Name, ILBFinalizerV2)
|
klog.V(2).Infof("Skipped ensureInternalLoadBalancer for service %s/%s, as service contains %q finalizer.", svc.Namespace, svc.Name, ILBFinalizerV2)
|
||||||
return nil, cloudprovider.ImplementedElsewhere
|
return nil, cloudprovider.ImplementedElsewhere
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nm := types.NamespacedName{Name: svc.Name, Namespace: svc.Namespace}
|
nm := types.NamespacedName{Name: svc.Name, Namespace: svc.Namespace}
|
||||||
|
|
||||||
|
@ -1044,7 +1044,20 @@ func TestCompareHealthChecks(t *testing.T) {
|
|||||||
// Test creation of InternalLoadBalancer with ILB Subsets featuregate enabled.
|
// Test creation of InternalLoadBalancer with ILB Subsets featuregate enabled.
|
||||||
func TestEnsureInternalLoadBalancerSubsetting(t *testing.T) {
|
func TestEnsureInternalLoadBalancerSubsetting(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
for _, tc := range []struct {
|
||||||
|
desc string
|
||||||
|
finalizers []string
|
||||||
|
createForwardingRule bool
|
||||||
|
expectErrorMsg string
|
||||||
|
}{
|
||||||
|
{desc: "New service creation fails with Implemented Elsewhere", expectErrorMsg: cloudprovider.ImplementedElsewhere.Error()},
|
||||||
|
{desc: "Service with existing ForwardingRule is processed", createForwardingRule: true},
|
||||||
|
{desc: "Service with v1 finalizer is processed", finalizers: []string{ILBFinalizerV1}},
|
||||||
|
{desc: "Service with v2 finalizer is skipped", finalizers: []string{ILBFinalizerV2}, expectErrorMsg: cloudprovider.ImplementedElsewhere.Error()},
|
||||||
|
{desc: "Service with v2 finalizer and existing ForwardingRule is processed", finalizers: []string{ILBFinalizerV2}, createForwardingRule: true},
|
||||||
|
{desc: "Service with v1 and v2 finalizers is processed", finalizers: []string{ILBFinalizerV1, ILBFinalizerV2}},
|
||||||
|
} {
|
||||||
|
t.Run(tc.desc, func(t *testing.T) {
|
||||||
vals := DefaultTestClusterValues()
|
vals := DefaultTestClusterValues()
|
||||||
gce, err := fakeGCECloud(vals)
|
gce, err := fakeGCECloud(vals)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@ -1053,27 +1066,45 @@ func TestEnsureInternalLoadBalancerSubsetting(t *testing.T) {
|
|||||||
gce.eventRecorder = recorder
|
gce.eventRecorder = recorder
|
||||||
|
|
||||||
nodeNames := []string{"test-node-1"}
|
nodeNames := []string{"test-node-1"}
|
||||||
nodes, err := createAndInsertNodes(gce, nodeNames, vals.ZoneName)
|
_, err = createAndInsertNodes(gce, nodeNames, vals.ZoneName)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
svc := fakeLoadbalancerService(string(LBTypeInternal))
|
svc := fakeLoadbalancerService(string(LBTypeInternal))
|
||||||
|
svc.Finalizers = tc.finalizers
|
||||||
svc, err = gce.client.CoreV1().Services(svc.Namespace).Create(context.TODO(), svc, metav1.CreateOptions{})
|
svc, err = gce.client.CoreV1().Services(svc.Namespace).Create(context.TODO(), svc, metav1.CreateOptions{})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
status, err := createInternalLoadBalancer(gce, svc, nil, nodeNames, vals.ClusterName, vals.ClusterID, vals.ZoneName)
|
var existingFwdRule *compute.ForwardingRule
|
||||||
assert.EqualError(t, err, cloudprovider.ImplementedElsewhere.Error())
|
if tc.createForwardingRule {
|
||||||
// No loadbalancer resources will be created due to the ILB Feature Gate
|
// Create a ForwardingRule with the expected name
|
||||||
|
existingFwdRule = &compute.ForwardingRule{
|
||||||
|
Name: gce.GetLoadBalancerName(context.TODO(), "", svc),
|
||||||
|
IPAddress: "5.6.7.8",
|
||||||
|
Ports: []string{"123"},
|
||||||
|
IPProtocol: "TCP",
|
||||||
|
LoadBalancingScheme: string(cloud.SchemeInternal),
|
||||||
|
}
|
||||||
|
gce.CreateRegionForwardingRule(existingFwdRule, gce.region)
|
||||||
|
}
|
||||||
|
gotErrorMsg := ""
|
||||||
|
status, err := createInternalLoadBalancer(gce, svc, existingFwdRule, nodeNames, vals.ClusterName, vals.ClusterID, vals.ZoneName)
|
||||||
|
if err != nil {
|
||||||
|
gotErrorMsg = err.Error()
|
||||||
|
}
|
||||||
|
if gotErrorMsg != tc.expectErrorMsg {
|
||||||
|
t.Errorf("createInternalLoadBalancer() = %q, want error %q", err, tc.expectErrorMsg)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
assert.Empty(t, status)
|
assert.Empty(t, status)
|
||||||
assertInternalLbResourcesDeleted(t, gce, svc, vals, true)
|
assertInternalLbResourcesDeleted(t, gce, svc, vals, true)
|
||||||
// Invoking delete should be a no-op
|
} else {
|
||||||
|
assert.NotEmpty(t, status.Ingress)
|
||||||
|
assertInternalLbResources(t, gce, svc, vals, nodeNames)
|
||||||
|
}
|
||||||
|
// Ensure that cleanup is successful, if applicable.
|
||||||
err = gce.EnsureLoadBalancerDeleted(context.Background(), vals.ClusterName, svc)
|
err = gce.EnsureLoadBalancerDeleted(context.Background(), vals.ClusterName, svc)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assertInternalLbResourcesDeleted(t, gce, svc, vals, true)
|
assertInternalLbResourcesDeleted(t, gce, svc, vals, true)
|
||||||
// Now remove the feature gate so that lb resources are created
|
})
|
||||||
gce.AlphaFeatureGate = NewAlphaFeatureGate([]string{})
|
}
|
||||||
status, err = gce.EnsureLoadBalancer(context.Background(), vals.ClusterName, svc, nodes)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.NotEmpty(t, status.Ingress)
|
|
||||||
assertInternalLbResources(t, gce, svc, vals, nodeNames)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestEnsureInternalLoadBalancerDeletedSubsetting verifies that updates and deletion of existing ILB resources
|
// TestEnsureInternalLoadBalancerDeletedSubsetting verifies that updates and deletion of existing ILB resources
|
||||||
|
Loading…
Reference in New Issue
Block a user