mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-12 13:31:52 +00:00
Add annotation for internal load balancer type in Azure.
This commit is contained in:
parent
ff603cfc5e
commit
7bf15f66fe
@ -32,37 +32,57 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ServiceAnnotationLoadBalancerInternal is the annotation used on the service
|
||||||
|
const ServiceAnnotationLoadBalancerInternal = "service.beta.kubernetes.io/azure-load-balancer-internal"
|
||||||
|
|
||||||
// GetLoadBalancer returns whether the specified load balancer exists, and
|
// GetLoadBalancer returns whether the specified load balancer exists, and
|
||||||
// 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)
|
isInternal := isLoadBalancerInternal(service)
|
||||||
|
lbName := getLoadBalancerName(clusterName, isInternal)
|
||||||
serviceName := getServiceName(service)
|
serviceName := getServiceName(service)
|
||||||
|
|
||||||
pipName, err := az.getPublicIPName(clusterName, service)
|
lb, existsLb, err := az.getAzureLoadBalancer(lbName)
|
||||||
if err != nil {
|
|
||||||
return nil, false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, existsLb, err := az.getAzureLoadBalancer(lbName)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false, err
|
return nil, false, err
|
||||||
}
|
}
|
||||||
if !existsLb {
|
if !existsLb {
|
||||||
glog.V(5).Infof("get(%s): lb(%s) - doesn't exist", serviceName, pipName)
|
glog.V(5).Infof("get(%s): lb(%s) - doesn't exist", serviceName, lbName)
|
||||||
return nil, false, nil
|
return nil, false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
pip, existsPip, err := az.getPublicIPAddress(pipName)
|
var lbIP *string
|
||||||
if err != nil {
|
|
||||||
return nil, false, err
|
if isInternal {
|
||||||
|
lbFrontendIPConfigName := getFrontendIPConfigName(service)
|
||||||
|
for _, ipConfiguration := range *lb.FrontendIPConfigurations {
|
||||||
|
if lbFrontendIPConfigName == *ipConfiguration.Name {
|
||||||
|
lbIP = ipConfiguration.PrivateIPAddress
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// TODO: Consider also read address from lb's FrontendIPConfigurations
|
||||||
|
pipName, err := az.getPublicIPName(clusterName, service)
|
||||||
|
if err != nil {
|
||||||
|
return nil, false, err
|
||||||
|
}
|
||||||
|
pip, existsPip, err := az.getPublicIPAddress(pipName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, false, err
|
||||||
|
}
|
||||||
|
if existsPip {
|
||||||
|
lbIP = pip.IPAddress
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if !existsPip {
|
|
||||||
glog.V(5).Infof("get(%s): pip(%s) - doesn't exist", serviceName, pipName)
|
if lbIP == nil {
|
||||||
|
glog.V(5).Infof("get(%s): lb(%s) - IP doesn't exist", serviceName, lbName)
|
||||||
return nil, false, nil
|
return nil, false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return &v1.LoadBalancerStatus{
|
return &v1.LoadBalancerStatus{
|
||||||
Ingress: []v1.LoadBalancerIngress{{IP: *pip.IPAddress}},
|
Ingress: []v1.LoadBalancerIngress{{IP: *lbIP}},
|
||||||
}, true, nil
|
}, true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,10 +113,11 @@ func (az *Cloud) getPublicIPName(clusterName string, service *v1.Service) (strin
|
|||||||
|
|
||||||
// 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)
|
isInternal := isLoadBalancerInternal(service)
|
||||||
|
lbName := getLoadBalancerName(clusterName, isInternal)
|
||||||
pipName, err := az.getPublicIPName(clusterName, service)
|
pipName, err := az.getPublicIPName(clusterName, service)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, false, 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)
|
||||||
@ -190,7 +211,8 @@ func (az *Cloud) UpdateLoadBalancer(clusterName string, service *v1.Service, nod
|
|||||||
// have multiple underlying components, meaning a Get could say that the LB
|
// have multiple underlying components, meaning a Get could say that the LB
|
||||||
// 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)
|
isInternal := isLoadBalancerInternal(service)
|
||||||
|
lbName := getLoadBalancerName(clusterName, isInternal)
|
||||||
serviceName := getServiceName(service)
|
serviceName := getServiceName(service)
|
||||||
|
|
||||||
pipName, err := az.getPublicIPName(clusterName, service)
|
pipName, err := az.getPublicIPName(clusterName, service)
|
||||||
@ -307,7 +329,8 @@ func (az *Cloud) ensurePublicIPDeleted(serviceName, pipName string) error {
|
|||||||
// This also reconciles the Service's Ports with the LoadBalancer config.
|
// This also reconciles the Service's Ports with the LoadBalancer config.
|
||||||
// This entails adding rules/probes for expected Ports and removing stale rules/ports.
|
// This entails adding rules/probes for expected Ports and removing stale rules/ports.
|
||||||
func (az *Cloud) reconcileLoadBalancer(lb network.LoadBalancer, pip *network.PublicIPAddress, clusterName string, service *v1.Service, nodes []*v1.Node) (network.LoadBalancer, bool, error) {
|
func (az *Cloud) reconcileLoadBalancer(lb network.LoadBalancer, pip *network.PublicIPAddress, clusterName string, service *v1.Service, nodes []*v1.Node) (network.LoadBalancer, bool, error) {
|
||||||
lbName := getLoadBalancerName(clusterName)
|
isInternal := isLoadBalancerInternal(service)
|
||||||
|
lbName := getLoadBalancerName(clusterName, isInternal)
|
||||||
serviceName := getServiceName(service)
|
serviceName := getServiceName(service)
|
||||||
lbFrontendIPConfigName := getFrontendIPConfigName(service)
|
lbFrontendIPConfigName := getFrontendIPConfigName(service)
|
||||||
lbFrontendIPConfigID := az.getFrontendIPConfigID(lbName, lbFrontendIPConfigName)
|
lbFrontendIPConfigID := az.getFrontendIPConfigID(lbName, lbFrontendIPConfigName)
|
||||||
@ -713,3 +736,12 @@ func (az *Cloud) ensureHostInPool(serviceName string, nodeName types.NodeName, b
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if service requests an internal load balancer.
|
||||||
|
func isLoadBalancerInternal(service *v1.Service) bool {
|
||||||
|
if l, ok := service.Annotations[ServiceAnnotationLoadBalancerInternal]; ok {
|
||||||
|
return l == "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
@ -160,7 +160,14 @@ func getPrimaryIPConfig(nic network.Interface) (*network.InterfaceIPConfiguratio
|
|||||||
return nil, fmt.Errorf("failed to determine the determine primary ipconfig. nicname=%q", *nic.Name)
|
return nil, fmt.Errorf("failed to determine the determine primary ipconfig. nicname=%q", *nic.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getLoadBalancerName(clusterName string) string {
|
// For a load balancer, all frontend ip should reference either a subnet or publicIpAddress.
|
||||||
|
// Thus Azure do not allow mixed type (public and internal) load balancer.
|
||||||
|
// So we'd have a separate name for internal load balancer.
|
||||||
|
func getLoadBalancerName(clusterName string, isInternal bool) string {
|
||||||
|
if isInternal {
|
||||||
|
return fmt.Sprintf("%s-internal", clusterName)
|
||||||
|
}
|
||||||
|
|
||||||
return clusterName
|
return clusterName
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user