mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 21:47:07 +00:00
Merge pull request #42034 from brendandburns/azure
Automatic merge from submit-queue (batch tested with PRs 41139, 41186, 38882, 37698, 42034) Add support for bring-your-own ip address for Services on Azure @colemickens @codablock
This commit is contained in:
commit
264c8b4340
@ -24,6 +24,7 @@ import (
|
|||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
serviceapi "k8s.io/kubernetes/pkg/api/v1/service"
|
serviceapi "k8s.io/kubernetes/pkg/api/v1/service"
|
||||||
|
"k8s.io/kubernetes/pkg/cloudprovider"
|
||||||
|
|
||||||
"github.com/Azure/azure-sdk-for-go/arm/network"
|
"github.com/Azure/azure-sdk-for-go/arm/network"
|
||||||
"github.com/Azure/go-autorest/autorest/to"
|
"github.com/Azure/go-autorest/autorest/to"
|
||||||
@ -35,9 +36,13 @@ import (
|
|||||||
// if so, what its status is.
|
// if so, what its status is.
|
||||||
func (az *Cloud) GetLoadBalancer(clusterName string, service *v1.Service) (status *v1.LoadBalancerStatus, exists bool, err error) {
|
func (az *Cloud) GetLoadBalancer(clusterName string, service *v1.Service) (status *v1.LoadBalancerStatus, exists bool, err error) {
|
||||||
lbName := getLoadBalancerName(clusterName)
|
lbName := getLoadBalancerName(clusterName)
|
||||||
pipName := getPublicIPName(clusterName, service)
|
|
||||||
serviceName := getServiceName(service)
|
serviceName := getServiceName(service)
|
||||||
|
|
||||||
|
pipName, err := az.getPublicIPName(clusterName, service)
|
||||||
|
if err != nil {
|
||||||
|
return nil, false, err
|
||||||
|
}
|
||||||
|
|
||||||
_, existsLb, err := az.getAzureLoadBalancer(lbName)
|
_, existsLb, err := az.getAzureLoadBalancer(lbName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false, err
|
return nil, false, err
|
||||||
@ -61,10 +66,38 @@ func (az *Cloud) GetLoadBalancer(clusterName string, service *v1.Service) (statu
|
|||||||
}, true, nil
|
}, true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (az *Cloud) getPublicIPName(clusterName string, service *v1.Service) (string, error) {
|
||||||
|
loadBalancerIP := service.Spec.LoadBalancerIP
|
||||||
|
if len(loadBalancerIP) == 0 {
|
||||||
|
return fmt.Sprintf("%s-%s", clusterName, cloudprovider.GetLoadBalancerName(service)), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
list, err := az.PublicIPAddressesClient.List(az.ResourceGroup)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
if list.Value != nil {
|
||||||
|
for ix := range *list.Value {
|
||||||
|
ip := &(*list.Value)[ix]
|
||||||
|
if ip.PublicIPAddressPropertiesFormat.IPAddress != nil &&
|
||||||
|
*ip.PublicIPAddressPropertiesFormat.IPAddress == loadBalancerIP {
|
||||||
|
return *ip.Name, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: follow next link here? Will there really ever be that many public IPs?
|
||||||
|
|
||||||
|
return "", fmt.Errorf("user supplied IP Address %s was not found", loadBalancerIP)
|
||||||
|
}
|
||||||
|
|
||||||
// EnsureLoadBalancer creates a new load balancer 'name', or updates the existing one. Returns the status of the balancer
|
// EnsureLoadBalancer creates a new load balancer 'name', or updates the existing one. Returns the status of the balancer
|
||||||
func (az *Cloud) EnsureLoadBalancer(clusterName string, service *v1.Service, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) {
|
func (az *Cloud) EnsureLoadBalancer(clusterName string, service *v1.Service, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) {
|
||||||
lbName := getLoadBalancerName(clusterName)
|
lbName := getLoadBalancerName(clusterName)
|
||||||
pipName := getPublicIPName(clusterName, service)
|
pipName, err := az.getPublicIPName(clusterName, service)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
serviceName := getServiceName(service)
|
serviceName := getServiceName(service)
|
||||||
glog.V(2).Infof("ensure(%s): START clusterName=%q lbName=%q", serviceName, clusterName, lbName)
|
glog.V(2).Infof("ensure(%s): START clusterName=%q lbName=%q", serviceName, clusterName, lbName)
|
||||||
|
|
||||||
@ -158,9 +191,13 @@ func (az *Cloud) UpdateLoadBalancer(clusterName string, service *v1.Service, nod
|
|||||||
// doesn't exist even if some part of it is still laying around.
|
// doesn't exist even if some part of it is still laying around.
|
||||||
func (az *Cloud) EnsureLoadBalancerDeleted(clusterName string, service *v1.Service) error {
|
func (az *Cloud) EnsureLoadBalancerDeleted(clusterName string, service *v1.Service) error {
|
||||||
lbName := getLoadBalancerName(clusterName)
|
lbName := getLoadBalancerName(clusterName)
|
||||||
pipName := getPublicIPName(clusterName, service)
|
|
||||||
serviceName := getServiceName(service)
|
serviceName := getServiceName(service)
|
||||||
|
|
||||||
|
pipName, err := az.getPublicIPName(clusterName, service)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
glog.V(2).Infof("delete(%s): START clusterName=%q lbName=%q", serviceName, clusterName, lbName)
|
glog.V(2).Infof("delete(%s): START clusterName=%q lbName=%q", serviceName, clusterName, lbName)
|
||||||
|
|
||||||
// reconcile logic is capable of fully reconcile, so we can use this to delete
|
// reconcile logic is capable of fully reconcile, so we can use this to delete
|
||||||
@ -214,11 +251,13 @@ func (az *Cloud) EnsureLoadBalancerDeleted(clusterName string, service *v1.Servi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Only delete an IP address if we created it.
|
||||||
|
if service.Spec.LoadBalancerIP == "" {
|
||||||
err = az.ensurePublicIPDeleted(serviceName, pipName)
|
err = az.ensurePublicIPDeleted(serviceName, pipName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
glog.V(2).Infof("delete(%s): FINISH", serviceName)
|
glog.V(2).Infof("delete(%s): FINISH", serviceName)
|
||||||
return nil
|
return nil
|
||||||
|
@ -192,10 +192,6 @@ func getFrontendIPConfigName(service *v1.Service) string {
|
|||||||
return cloudprovider.GetLoadBalancerName(service)
|
return cloudprovider.GetLoadBalancerName(service)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getPublicIPName(clusterName string, service *v1.Service) string {
|
|
||||||
return fmt.Sprintf("%s-%s", clusterName, cloudprovider.GetLoadBalancerName(service))
|
|
||||||
}
|
|
||||||
|
|
||||||
// This returns the next available rule priority level for a given set of security rules.
|
// This returns the next available rule priority level for a given set of security rules.
|
||||||
func getNextAvailablePriority(rules []network.SecurityRule) (int32, error) {
|
func getNextAvailablePriority(rules []network.SecurityRule) (int32, error) {
|
||||||
var smallest int32 = loadBalancerMinimumPriority
|
var smallest int32 = loadBalancerMinimumPriority
|
||||||
|
Loading…
Reference in New Issue
Block a user