Skip to content

Commit eb09574

Browse files
authored
Implement internal load balancer (#698)
Add `Internal` as a new `type` for `networking.LoadBalancer`s. Update & extend all relevant code (`machinepoollet`, `machinebroker`, `ori-machine`). Update test cases.
1 parent 79e9a92 commit eb09574

File tree

35 files changed

+592
-279
lines changed

35 files changed

+592
-279
lines changed

api/networking/v1alpha1/loadbalancer_type.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ type LoadBalancerType string
2828
const (
2929
// LoadBalancerTypePublic is a LoadBalancer that allocates and routes a stable public IP.
3030
LoadBalancerTypePublic LoadBalancerType = "Public"
31+
// LoadBalancerTypeInternal is a LoadBalancer that allocates and routes network-internal, stable IPs.
32+
LoadBalancerTypeInternal LoadBalancerType = "Internal"
3133
)
3234

3335
// LoadBalancerSpec defines the desired state of LoadBalancer
@@ -36,6 +38,8 @@ type LoadBalancerSpec struct {
3638
Type LoadBalancerType `json:"type"`
3739
// IPFamilies are the ip families the load balancer should have.
3840
IPFamilies []corev1.IPFamily `json:"ipFamilies"`
41+
// IPs are the ips to use. Can only be used when Type is LoadBalancerTypeInternal.
42+
IPs []IPSource `json:"ips,omitempty"`
3943
// NetworkRef is the Network this LoadBalancer should belong to.
4044
NetworkRef corev1.LocalObjectReference `json:"networkRef"`
4145
// NetworkInterfaceSelector defines the NetworkInterfaces

api/networking/v1alpha1/zz_generated.deepcopy.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

broker/machinebroker/aliasprefixes/aliasprefixes.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func (m *AliasPrefixes) createAliasPrefix(
121121
},
122122
}
123123
apiutils.SetManagerLabel(aliasPrefix, machinebrokerv1alpha1.MachineBrokerManager)
124-
apiutils.SetNetworkHandle(aliasPrefix, key.networkHandle)
124+
apiutils.SetNetworkHandleLabel(aliasPrefix, key.networkHandle)
125125
apiutils.SetPrefixLabel(aliasPrefix, key.prefix)
126126

127127
if err := m.cluster.Client().Create(ctx, aliasPrefix); err != nil {
@@ -140,7 +140,7 @@ func (m *AliasPrefixes) createAliasPrefix(
140140
},
141141
}
142142
apiutils.SetManagerLabel(aliasPrefixRouting, machinebrokerv1alpha1.MachineBrokerManager)
143-
apiutils.SetNetworkHandle(aliasPrefixRouting, key.networkHandle)
143+
apiutils.SetNetworkHandleLabel(aliasPrefixRouting, key.networkHandle)
144144
apiutils.SetPrefixLabel(aliasPrefixRouting, key.prefix)
145145
if err := ctrl.SetControllerReference(aliasPrefix, aliasPrefixRouting, m.cluster.Scheme()); err != nil {
146146
return nil, nil, fmt.Errorf("error setting alias prefix routing to be controlled by alias prefix: %w", err)

broker/machinebroker/api/v1alpha1/common_types.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"sort"
2020

2121
commonv1alpha1 "github.com/onmetal/onmetal-api/api/common/v1alpha1"
22+
networkingv1alpha1 "github.com/onmetal/onmetal-api/api/networking/v1alpha1"
2223
corev1 "k8s.io/api/core/v1"
2324
)
2425

@@ -41,6 +42,8 @@ const (
4142

4243
PrefixLabel = "machinebrokerlet.api.onmetal.de/prefix"
4344

45+
LoadBalancerTypeLabel = "machinebrokerlet.api.onmetal.de/load-balancer-type"
46+
4447
IPLabel = "machinebrokerlet.api.onmetal.de/ip"
4548
)
4649

@@ -74,16 +77,18 @@ func LoadBalancerPortsKey(ports []LoadBalancerPort) string {
7477
}
7578

7679
type LoadBalancerTarget struct {
77-
IP commonv1alpha1.IP
78-
Ports []LoadBalancerPort
80+
LoadBalancerType networkingv1alpha1.LoadBalancerType
81+
IP commonv1alpha1.IP
82+
Ports []LoadBalancerPort
7983
}
8084

8185
func (t LoadBalancerTarget) Key() string {
8286
portKeys := LoadBalancerPortsKey(t.Ports)
83-
return fmt.Sprintf("%s%s", t.IP, portKeys)
87+
return fmt.Sprintf("%s-%s%s", t.LoadBalancerType, t.IP, portKeys)
8488
}
8589

8690
type LoadBalancer struct {
91+
Type networkingv1alpha1.LoadBalancerType
8792
NetworkHandle string
8893
IP commonv1alpha1.IP
8994
Ports []LoadBalancerPort

broker/machinebroker/apiutils/apiutils.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222

2323
"github.com/onmetal/controller-utils/metautils"
2424
commonv1alpha1 "github.com/onmetal/onmetal-api/api/common/v1alpha1"
25+
networkingv1alpha1 "github.com/onmetal/onmetal-api/api/networking/v1alpha1"
2526
machinebrokerv1alpha1 "github.com/onmetal/onmetal-api/broker/machinebroker/api/v1alpha1"
2627
orimeta "github.com/onmetal/onmetal-api/ori/apis/meta/v1alpha1"
2728
"golang.org/x/exp/slices"
@@ -159,7 +160,7 @@ var (
159160
reverseIPAndPrefixReplacer = strings.NewReplacer("-", "/", "_", ":")
160161
)
161162

162-
func SetNetworkHandle(o metav1.Object, handle string) {
163+
func SetNetworkHandleLabel(o metav1.Object, handle string) {
163164
metautils.SetLabel(o, machinebrokerv1alpha1.NetworkHandleLabel, handle)
164165
}
165166

@@ -181,6 +182,10 @@ func GetPrefixLabel(o metav1.Object) (commonv1alpha1.IPPrefix, error) {
181182
return UnescapePrefix(escapedPrefix)
182183
}
183184

185+
func SetLoadBalancerTypeLabel(o metav1.Object, typ networkingv1alpha1.LoadBalancerType) {
186+
metautils.SetLabel(o, machinebrokerv1alpha1.LoadBalancerTypeLabel, string(typ))
187+
}
188+
184189
func EscapeIP(ip commonv1alpha1.IP) string {
185190
return ipAndPrefixReplacer.Replace(ip.String())
186191
}

broker/machinebroker/loadbalancers/loadbalancers.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,11 @@ func (m *LoadBalancers) getLoadBalancerByKey(ctx context.Context, key loadBalanc
8484
if err := m.cluster.Client().List(ctx, loadBalancerList,
8585
client.InNamespace(m.cluster.Namespace()),
8686
client.MatchingLabels{
87-
machinebrokerv1alpha1.ManagerLabel: machinebrokerv1alpha1.MachineBrokerManager,
88-
machinebrokerv1alpha1.CreatedLabel: "true",
89-
machinebrokerv1alpha1.NetworkHandleLabel: key.networkHandle,
90-
machinebrokerv1alpha1.IPLabel: apiutils.EscapeIP(key.target.IP),
87+
machinebrokerv1alpha1.ManagerLabel: machinebrokerv1alpha1.MachineBrokerManager,
88+
machinebrokerv1alpha1.CreatedLabel: "true",
89+
machinebrokerv1alpha1.NetworkHandleLabel: key.networkHandle,
90+
machinebrokerv1alpha1.LoadBalancerTypeLabel: string(key.target.LoadBalancerType),
91+
machinebrokerv1alpha1.IPLabel: apiutils.EscapeIP(key.target.IP),
9192
},
9293
); err != nil {
9394
return nil, nil, false, fmt.Errorf("error listing load balanceres by key: %w", err)
@@ -134,7 +135,8 @@ func (m *LoadBalancers) createLoadBalancer(
134135
}
135136
annotations.SetExternallyMangedBy(loadBalancer, machinebrokerv1alpha1.MachineBrokerManager)
136137
apiutils.SetManagerLabel(loadBalancer, machinebrokerv1alpha1.MachineBrokerManager)
137-
apiutils.SetNetworkHandle(loadBalancer, key.networkHandle)
138+
apiutils.SetNetworkHandleLabel(loadBalancer, key.networkHandle)
139+
apiutils.SetLoadBalancerTypeLabel(loadBalancer, key.target.LoadBalancerType)
138140
apiutils.SetIPLabel(loadBalancer, key.target.IP)
139141

140142
if err := m.cluster.Client().Create(ctx, loadBalancer); err != nil {
@@ -159,7 +161,7 @@ func (m *LoadBalancers) createLoadBalancer(
159161
},
160162
}
161163
apiutils.SetManagerLabel(loadBalancerRouting, machinebrokerv1alpha1.MachineBrokerManager)
162-
apiutils.SetNetworkHandle(loadBalancerRouting, key.networkHandle)
164+
apiutils.SetNetworkHandleLabel(loadBalancerRouting, key.networkHandle)
163165
apiutils.SetIPLabel(loadBalancerRouting, key.target.IP)
164166
if err := ctrl.SetControllerReference(loadBalancer, loadBalancerRouting, m.cluster.Scheme()); err != nil {
165167
return nil, nil, fmt.Errorf("error setting load balancer routing to be controlled by load balancer: %w", err)
@@ -377,6 +379,7 @@ func (m *LoadBalancers) joinLoadBalancersAndRoutings(
377379
)
378380

379381
res = append(res, machinebrokerv1alpha1.LoadBalancer{
382+
Type: loadBalancer.Spec.Type,
380383
NetworkHandle: networkHandle,
381384
IP: ip,
382385
Ports: apiutils.ConvertNetworkingLoadBalancerPortsToLoadBalancerPorts(loadBalancer.Spec.Ports),

broker/machinebroker/natgateways/natgateways.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ func (m *NATGateways) createNATGateway(
126126
}
127127
annotations.SetExternallyMangedBy(natGateway, machinebrokerv1alpha1.MachineBrokerManager)
128128
apiutils.SetManagerLabel(natGateway, machinebrokerv1alpha1.MachineBrokerManager)
129-
apiutils.SetNetworkHandle(natGateway, network.Spec.Handle)
129+
apiutils.SetNetworkHandleLabel(natGateway, network.Spec.Handle)
130130
apiutils.SetIPLabel(natGateway, key.ip)
131131

132132
if err := m.cluster.Client().Create(ctx, natGateway); err != nil {
@@ -153,7 +153,7 @@ func (m *NATGateways) createNATGateway(
153153
},
154154
}
155155
apiutils.SetManagerLabel(natGatewayRouting, machinebrokerv1alpha1.MachineBrokerManager)
156-
apiutils.SetNetworkHandle(natGatewayRouting, network.Spec.Handle)
156+
apiutils.SetNetworkHandleLabel(natGatewayRouting, network.Spec.Handle)
157157
apiutils.SetIPLabel(natGateway, key.ip)
158158
if err := ctrl.SetControllerReference(natGateway, natGatewayRouting, m.cluster.Scheme()); err != nil {
159159
return nil, nil, fmt.Errorf("error setting nat gateway routing to be controlled by nat gateway: %w", err)

broker/machinebroker/networks/networks.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func (m *Networks) createNetwork(ctx context.Context, handle string) (res *netwo
9797
}
9898
annotations.SetExternallyMangedBy(network, machinebrokerv1alpha1.MachineBrokerManager)
9999
apiutils.SetManagerLabel(network, machinebrokerv1alpha1.MachineBrokerManager)
100-
apiutils.SetNetworkHandle(network, handle)
100+
apiutils.SetNetworkHandleLabel(network, handle)
101101

102102
if err := m.cluster.Client().Create(ctx, network); err != nil {
103103
return nil, fmt.Errorf("error creating network: %w", err)

broker/machinebroker/server/common.go

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,17 @@ func (s *Server) convertOnmetalPrefixes(prefixes []commonv1alpha1.IPPrefix) []st
113113
return res
114114
}
115115

116+
func (s *Server) convertOnmetalLoadBalancerType(typ networkingv1alpha1.LoadBalancerType) (ori.LoadBalancerType, error) {
117+
switch typ {
118+
case networkingv1alpha1.LoadBalancerTypePublic:
119+
return ori.LoadBalancerType_PUBLIC, nil
120+
case networkingv1alpha1.LoadBalancerTypeInternal:
121+
return ori.LoadBalancerType_INTERNAL, nil
122+
default:
123+
return 0, fmt.Errorf("unrecognized load balancer type %q", typ)
124+
}
125+
}
126+
116127
func (s *Server) convertOnmetalProtocol(protocol corev1.Protocol) (ori.Protocol, error) {
117128
switch protocol {
118129
case corev1.ProtocolTCP:
@@ -142,6 +153,11 @@ func (s *Server) convertOnmetalLoadBalancerTargetPort(port machinebrokerv1alpha1
142153
func (s *Server) convertOnmetalLoadBalancerTargets(loadBalancerTargets []machinebrokerv1alpha1.LoadBalancerTarget) ([]*ori.LoadBalancerTargetSpec, error) {
143154
res := make([]*ori.LoadBalancerTargetSpec, len(loadBalancerTargets))
144155
for i, loadBalancerTarget := range loadBalancerTargets {
156+
typ, err := s.convertOnmetalLoadBalancerType(loadBalancerTarget.LoadBalancerType)
157+
if err != nil {
158+
return nil, err
159+
}
160+
145161
ports := make([]*ori.LoadBalancerPort, len(loadBalancerTarget.Ports))
146162
for j, port := range loadBalancerTarget.Ports {
147163
p, err := s.convertOnmetalLoadBalancerTargetPort(port)
@@ -153,8 +169,9 @@ func (s *Server) convertOnmetalLoadBalancerTargets(loadBalancerTargets []machine
153169
}
154170

155171
res[i] = &ori.LoadBalancerTargetSpec{
156-
Ip: loadBalancerTarget.IP.String(),
157-
Ports: ports,
172+
LoadBalancerType: typ,
173+
Ip: loadBalancerTarget.IP.String(),
174+
Ports: ports,
158175
}
159176
}
160177
return res, nil
@@ -225,6 +242,17 @@ func (s *Server) convertORIProtocol(protocol ori.Protocol) (corev1.Protocol, err
225242
}
226243
}
227244

245+
func (s *Server) convertORILoadBalancerType(typ ori.LoadBalancerType) (networkingv1alpha1.LoadBalancerType, error) {
246+
switch typ {
247+
case ori.LoadBalancerType_PUBLIC:
248+
return networkingv1alpha1.LoadBalancerTypePublic, nil
249+
case ori.LoadBalancerType_INTERNAL:
250+
return networkingv1alpha1.LoadBalancerTypeInternal, nil
251+
default:
252+
return "", fmt.Errorf("unknown load balancer type %d", typ)
253+
}
254+
}
255+
228256
func (s *Server) parseIPPrefixes(prefixStrings []string) ([]commonv1alpha1.IPPrefix, error) {
229257
var ipPrefixes []commonv1alpha1.IPPrefix
230258
for _, prefixString := range prefixStrings {

broker/machinebroker/server/networkinterface_create.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ func (s *Server) prepareOnmetalVirtualIP(virtualIPSpec *ori.VirtualIPSpec) (*net
5656
}
5757

5858
func (s *Server) prepareOnmetalLoadBalancerTarget(lbTgt *ori.LoadBalancerTargetSpec) (*machinebrokerv1alpha1.LoadBalancerTarget, error) {
59+
typ, err := s.convertORILoadBalancerType(lbTgt.LoadBalancerType)
60+
if err != nil {
61+
return nil, err
62+
}
63+
5964
ip, err := commonv1alpha1.ParseIP(lbTgt.Ip)
6065
if err != nil {
6166
return nil, err
@@ -76,8 +81,9 @@ func (s *Server) prepareOnmetalLoadBalancerTarget(lbTgt *ori.LoadBalancerTargetS
7681
}
7782

7883
return &machinebrokerv1alpha1.LoadBalancerTarget{
79-
IP: ip,
80-
Ports: ports,
84+
LoadBalancerType: typ,
85+
IP: ip,
86+
Ports: ports,
8187
}, nil
8288
}
8389

0 commit comments

Comments
 (0)