Merge pull request #16348 from hakman/azure-well-known-services

azure: Replace lb.ForAPIServer with lb.WellKnownServices
This commit is contained in:
Kubernetes Prow Robot 2024-02-11 06:21:45 -08:00 committed by GitHub
commit f060b9252a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 87 additions and 76 deletions

View File

@ -21,6 +21,7 @@ import (
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
"k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/wellknownservices"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/azuretasks" "k8s.io/kops/upup/pkg/fi/cloudup/azuretasks"
) )
@ -49,10 +50,11 @@ func (b *APILoadBalancerModelBuilder) Build(c *fi.CloudupModelBuilderContext) er
// Create LoadBalancer for API ELB // Create LoadBalancer for API ELB
lb := &azuretasks.LoadBalancer{ lb := &azuretasks.LoadBalancer{
Name: fi.PtrTo(b.NameForLoadBalancer()), Name: fi.PtrTo(b.NameForLoadBalancer()),
Lifecycle: b.Lifecycle, Lifecycle: b.Lifecycle,
ResourceGroup: b.LinkToResourceGroup(), ResourceGroup: b.LinkToResourceGroup(),
Tags: map[string]*string{}, Tags: map[string]*string{},
WellKnownServices: []wellknownservices.WellKnownService{wellknownservices.KubeAPIServer},
} }
switch lbSpec.Type { switch lbSpec.Type {
@ -81,7 +83,7 @@ func (b *APILoadBalancerModelBuilder) Build(c *fi.CloudupModelBuilderContext) er
c.AddTask(lb) c.AddTask(lb)
if b.Cluster.UsesLegacyGossip() || b.Cluster.UsesPrivateDNS() || b.Cluster.UsesNoneDNS() { if b.Cluster.UsesLegacyGossip() || b.Cluster.UsesPrivateDNS() || b.Cluster.UsesNoneDNS() {
lb.ForAPIServer = true lb.WellKnownServices = append(lb.WellKnownServices, wellknownservices.KopsController)
} }
return nil return nil

View File

@ -19,12 +19,14 @@ package azuretasks
import ( import (
"context" "context"
"fmt" "fmt"
"slices"
"strings" "strings"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
network "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork" network "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kops/pkg/wellknownports" "k8s.io/kops/pkg/wellknownports"
"k8s.io/kops/pkg/wellknownservices"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/azure" "k8s.io/kops/upup/pkg/fi/cloudup/azure"
) )
@ -40,8 +42,11 @@ type LoadBalancer struct {
// External is set to true when the loadbalancer is used for external traffic // External is set to true when the loadbalancer is used for external traffic
External *bool External *bool
Tags map[string]*string Tags map[string]*string
ForAPIServer bool
// WellKnownServices indicates which services are supported by this resource.
// This field is internal and is not rendered to the cloud.
WellKnownServices []wellknownservices.WellKnownService
} }
var ( var (
@ -57,8 +62,8 @@ func (lb *LoadBalancer) CompareWithID() *string {
// GetWellKnownServices implements fi.HasAddress::GetWellKnownServices. // GetWellKnownServices implements fi.HasAddress::GetWellKnownServices.
// It indicates which services we support with this load balancer. // It indicates which services we support with this load balancer.
func (lb *LoadBalancer) GetWellKnownServices() bool { func (lb *LoadBalancer) GetWellKnownServices() []wellknownservices.WellKnownService {
return lb.ForAPIServer return lb.WellKnownServices
} }
func (lb *LoadBalancer) FindAddresses(c *fi.CloudupContext) ([]string, error) { func (lb *LoadBalancer) FindAddresses(c *fi.CloudupContext) ([]string, error) {
@ -115,9 +120,9 @@ func (lb *LoadBalancer) Find(c *fi.CloudupContext) (*LoadBalancer, error) {
subnet := feConfig.Properties.Subnet subnet := feConfig.Properties.Subnet
actual := &LoadBalancer{ actual := &LoadBalancer{
Name: lb.Name, Name: lb.Name,
Lifecycle: lb.Lifecycle, Lifecycle: lb.Lifecycle,
ForAPIServer: lb.ForAPIServer, WellKnownServices: lb.WellKnownServices,
ResourceGroup: &ResourceGroup{ ResourceGroup: &ResourceGroup{
Name: lb.ResourceGroup.Name, Name: lb.ResourceGroup.Name,
}, },
@ -198,72 +203,74 @@ func (*LoadBalancer) RenderAzure(t *azure.AzureAPITarget, a, e, changes *LoadBal
Name: to.Ptr("LoadBalancerBackEnd"), Name: to.Ptr("LoadBalancerBackEnd"),
}, },
}, },
Probes: []*network.Probe{
{
Name: to.Ptr("Health-TCP-443"),
Properties: &network.ProbePropertiesFormat{
Protocol: to.Ptr(network.ProbeProtocolTCP),
Port: to.Ptr[int32](wellknownports.KubeAPIServer),
IntervalInSeconds: to.Ptr[int32](15),
NumberOfProbes: to.Ptr[int32](4),
},
},
{
Name: to.Ptr("Health-TCP-3988"),
Properties: &network.ProbePropertiesFormat{
Protocol: to.Ptr(network.ProbeProtocolTCP),
Port: to.Ptr[int32](wellknownports.KopsControllerPort),
IntervalInSeconds: to.Ptr[int32](15),
NumberOfProbes: to.Ptr[int32](4),
},
},
},
LoadBalancingRules: []*network.LoadBalancingRule{
{
Name: to.Ptr("TCP-443"),
Properties: &network.LoadBalancingRulePropertiesFormat{
Protocol: to.Ptr(network.TransportProtocolTCP),
FrontendPort: to.Ptr[int32](wellknownports.KubeAPIServer),
BackendPort: to.Ptr[int32](wellknownports.KubeAPIServer),
IdleTimeoutInMinutes: to.Ptr[int32](4),
EnableFloatingIP: to.Ptr(false),
LoadDistribution: to.Ptr(network.LoadDistributionDefault),
FrontendIPConfiguration: &network.SubResource{
ID: to.Ptr(fmt.Sprintf("/%s/loadbalancers/%s/frontendIPConfigurations/%s", idPrefix, *e.Name, *to.Ptr("LoadBalancerFrontEnd"))),
},
BackendAddressPool: &network.SubResource{
ID: to.Ptr(fmt.Sprintf("/%s/loadbalancers/%s/backendAddressPools/%s", idPrefix, *e.Name, *to.Ptr("LoadBalancerBackEnd"))),
},
Probe: &network.SubResource{
ID: to.Ptr(fmt.Sprintf("/%s/loadbalancers/%s/probes/%s", idPrefix, *e.Name, *to.Ptr("Health-TCP-443"))),
},
},
},
{
Name: to.Ptr("TCP-3988"),
Properties: &network.LoadBalancingRulePropertiesFormat{
Protocol: to.Ptr(network.TransportProtocolTCP),
FrontendPort: to.Ptr[int32](wellknownports.KopsControllerPort),
BackendPort: to.Ptr[int32](wellknownports.KopsControllerPort),
IdleTimeoutInMinutes: to.Ptr[int32](4),
EnableFloatingIP: to.Ptr(false),
LoadDistribution: to.Ptr(network.LoadDistributionDefault),
FrontendIPConfiguration: &network.SubResource{
ID: to.Ptr(fmt.Sprintf("/%s/loadbalancers/%s/frontendIPConfigurations/%s", idPrefix, *e.Name, *to.Ptr("LoadBalancerFrontEnd"))),
},
BackendAddressPool: &network.SubResource{
ID: to.Ptr(fmt.Sprintf("/%s/loadbalancers/%s/backendAddressPools/%s", idPrefix, *e.Name, *to.Ptr("LoadBalancerBackEnd"))),
},
Probe: &network.SubResource{
ID: to.Ptr(fmt.Sprintf("/%s/loadbalancers/%s/probes/%s", idPrefix, *e.Name, *to.Ptr("Health-TCP-3988"))),
},
},
},
},
}, },
Tags: e.Tags, Tags: e.Tags,
} }
if slices.Contains(e.WellKnownServices, wellknownservices.KubeAPIServer) {
lb.Properties.Probes = append(lb.Properties.Probes, &network.Probe{
Name: to.Ptr("Health-TCP-443"),
Properties: &network.ProbePropertiesFormat{
Protocol: to.Ptr(network.ProbeProtocolTCP),
Port: to.Ptr[int32](wellknownports.KubeAPIServer),
IntervalInSeconds: to.Ptr[int32](15),
NumberOfProbes: to.Ptr[int32](4),
},
})
lb.Properties.LoadBalancingRules = append(lb.Properties.LoadBalancingRules, &network.LoadBalancingRule{
Name: to.Ptr("TCP-443"),
Properties: &network.LoadBalancingRulePropertiesFormat{
Protocol: to.Ptr(network.TransportProtocolTCP),
FrontendPort: to.Ptr[int32](wellknownports.KubeAPIServer),
BackendPort: to.Ptr[int32](wellknownports.KubeAPIServer),
IdleTimeoutInMinutes: to.Ptr[int32](4),
EnableFloatingIP: to.Ptr(false),
LoadDistribution: to.Ptr(network.LoadDistributionDefault),
FrontendIPConfiguration: &network.SubResource{
ID: to.Ptr(fmt.Sprintf("/%s/loadbalancers/%s/frontendIPConfigurations/%s", idPrefix, *e.Name, *to.Ptr("LoadBalancerFrontEnd"))),
},
BackendAddressPool: &network.SubResource{
ID: to.Ptr(fmt.Sprintf("/%s/loadbalancers/%s/backendAddressPools/%s", idPrefix, *e.Name, *to.Ptr("LoadBalancerBackEnd"))),
},
Probe: &network.SubResource{
ID: to.Ptr(fmt.Sprintf("/%s/loadbalancers/%s/probes/%s", idPrefix, *e.Name, *to.Ptr("Health-TCP-443"))),
},
},
})
}
if slices.Contains(e.WellKnownServices, wellknownservices.KopsController) {
lb.Properties.Probes = append(lb.Properties.Probes, &network.Probe{
Name: to.Ptr("Health-TCP-3988"),
Properties: &network.ProbePropertiesFormat{
Protocol: to.Ptr(network.ProbeProtocolTCP),
Port: to.Ptr[int32](wellknownports.KopsControllerPort),
IntervalInSeconds: to.Ptr[int32](15),
NumberOfProbes: to.Ptr[int32](4),
},
})
lb.Properties.LoadBalancingRules = append(lb.Properties.LoadBalancingRules, &network.LoadBalancingRule{
Name: to.Ptr("TCP-3988"),
Properties: &network.LoadBalancingRulePropertiesFormat{
Protocol: to.Ptr(network.TransportProtocolTCP),
FrontendPort: to.Ptr[int32](wellknownports.KopsControllerPort),
BackendPort: to.Ptr[int32](wellknownports.KopsControllerPort),
IdleTimeoutInMinutes: to.Ptr[int32](4),
EnableFloatingIP: to.Ptr(false),
LoadDistribution: to.Ptr(network.LoadDistributionDefault),
FrontendIPConfiguration: &network.SubResource{
ID: to.Ptr(fmt.Sprintf("/%s/loadbalancers/%s/frontendIPConfigurations/%s", idPrefix, *e.Name, *to.Ptr("LoadBalancerFrontEnd"))),
},
BackendAddressPool: &network.SubResource{
ID: to.Ptr(fmt.Sprintf("/%s/loadbalancers/%s/backendAddressPools/%s", idPrefix, *e.Name, *to.Ptr("LoadBalancerBackEnd"))),
},
Probe: &network.SubResource{
ID: to.Ptr(fmt.Sprintf("/%s/loadbalancers/%s/probes/%s", idPrefix, *e.Name, *to.Ptr("Health-TCP-3988"))),
},
},
})
}
_, err := t.Cloud.LoadBalancer().CreateOrUpdate( _, err := t.Cloud.LoadBalancer().CreateOrUpdate(
context.TODO(), context.TODO(),
*e.ResourceGroup.Name, *e.ResourceGroup.Name,

View File

@ -22,6 +22,8 @@ import (
"reflect" "reflect"
"testing" "testing"
"k8s.io/kops/pkg/wellknownservices"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
network "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork" network "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
@ -42,8 +44,8 @@ func newTestLoadBalancer() *LoadBalancer {
Name: to.Ptr("vnet"), Name: to.Ptr("vnet"),
}, },
}, },
External: to.Ptr(true), External: to.Ptr(true),
ForAPIServer: true, WellKnownServices: []wellknownservices.WellKnownService{wellknownservices.KubeAPIServer},
Tags: map[string]*string{ Tags: map[string]*string{
testTagKey: to.Ptr(testTagValue), testTagKey: to.Ptr(testTagValue),
}, },