mirror of
https://github.com/k3s-io/kubernetes.git
synced 2026-01-06 07:57:35 +00:00
Merge pull request #52013 from FengyunPan/autoprobing-external-network
Automatic merge from submit-queue (batch tested with PRs 52013, 56719). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. Support autoprobing floating-network-id for openstack cloud provider Currently if user doesn't specify floatingnetwork-id and loadbalancer.openstack.org/floating-network-id annotation, openstack cloud provider can't create a external LoadBalancer service. Actually we can get floatingnetwork-id automatically. If we get multiple floatingnetwork-ids, then ask user to specify one, or we use the floatingnetwork-id to create floatingip for external LoadBalancer service. This is a part of #50726 **Special notes for your reviewer**: /assign @dims **Release note**: ```release-note Support autoprobing floating-network-id for openstack cloud provider ```
This commit is contained in:
@@ -39,6 +39,7 @@ go_library(
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/extensions/trusts:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/external:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/listeners:go_default_library",
|
||||
@@ -47,6 +48,7 @@ go_library(
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/pools:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/networks:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/ports:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library",
|
||||
"//vendor/github.com/mitchellh/mapstructure:go_default_library",
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
"github.com/golang/glog"
|
||||
"github.com/gophercloud/gophercloud"
|
||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions"
|
||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/external"
|
||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
|
||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/listeners"
|
||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/loadbalancers"
|
||||
@@ -32,6 +33,7 @@ import (
|
||||
v2pools "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/pools"
|
||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
|
||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules"
|
||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
|
||||
neutronports "github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
|
||||
"github.com/gophercloud/gophercloud/pagination"
|
||||
|
||||
@@ -566,6 +568,52 @@ func getNodeSecurityGroupIDForLB(compute *gophercloud.ServiceClient, nodes []*v1
|
||||
return nodeSecurityGroupIDs.List(), nil
|
||||
}
|
||||
|
||||
// getFloatingNetworkIdForLB returns a floating-network-id for cluster.
|
||||
func getFloatingNetworkIdForLB(client *gophercloud.ServiceClient) (string, error) {
|
||||
var floatingNetworkIds []string
|
||||
|
||||
type NetworkWithExternalExt struct {
|
||||
networks.Network
|
||||
external.NetworkExternalExt
|
||||
}
|
||||
|
||||
err := networks.List(client, networks.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
|
||||
var externalNetwork []NetworkWithExternalExt
|
||||
err := networks.ExtractNetworksInto(page, &externalNetwork)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
for _, externalNet := range externalNetwork {
|
||||
if externalNet.External {
|
||||
floatingNetworkIds = append(floatingNetworkIds, externalNet.ID)
|
||||
}
|
||||
}
|
||||
|
||||
if len(floatingNetworkIds) > 1 {
|
||||
return false, ErrMultipleResults
|
||||
}
|
||||
return true, nil
|
||||
})
|
||||
if err != nil {
|
||||
if isNotFound(err) {
|
||||
return "", ErrNotFound
|
||||
}
|
||||
|
||||
if err == ErrMultipleResults {
|
||||
glog.V(4).Infof("find multiple external networks, pick the first one when there are no explicit configuration.")
|
||||
return floatingNetworkIds[0], nil
|
||||
}
|
||||
return "", err
|
||||
}
|
||||
|
||||
if len(floatingNetworkIds) == 0 {
|
||||
return "", ErrNotFound
|
||||
}
|
||||
|
||||
return floatingNetworkIds[0], nil
|
||||
}
|
||||
|
||||
// TODO: This code currently ignores 'region' and always creates a
|
||||
// loadbalancer in only the current OpenStack region. We should take
|
||||
// a list of regions (from config) and query/create loadbalancers in
|
||||
@@ -596,7 +644,13 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
||||
}
|
||||
|
||||
floatingPool := getStringFromServiceAnnotation(apiService, ServiceAnnotationLoadBalancerFloatingNetworkId, lbaas.opts.FloatingNetworkId)
|
||||
glog.V(4).Infof("EnsureLoadBalancer using floatingPool: %v", floatingPool)
|
||||
if len(floatingPool) == 0 {
|
||||
var err error
|
||||
floatingPool, err = getFloatingNetworkIdForLB(lbaas.network)
|
||||
if err != nil {
|
||||
glog.Warningf("Failed to find floating-network-id for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
||||
}
|
||||
}
|
||||
|
||||
var internalAnnotation bool
|
||||
internal := getStringFromServiceAnnotation(apiService, ServiceAnnotationLoadBalancerInternal, "false")
|
||||
@@ -606,7 +660,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
||||
internalAnnotation = true
|
||||
case "false":
|
||||
if len(floatingPool) != 0 {
|
||||
glog.V(4).Infof("Ensure an external loadbalancer service.")
|
||||
glog.V(4).Infof("Ensure an external loadbalancer service, using floatingPool: %v", floatingPool)
|
||||
internalAnnotation = false
|
||||
} else {
|
||||
return nil, fmt.Errorf("floating-network-id or loadbalancer.openstack.org/floating-network-id should be specified when ensuring an external loadbalancer service")
|
||||
|
||||
Reference in New Issue
Block a user