Skip to content

Commit 417208e

Browse files
authored
K8SPSMDB-1329: Add loadBalancerClass (#1884)
* K8SPSMDB-1329: Add loadBalancerClass * address review comments
1 parent 5b2049c commit 417208e

File tree

12 files changed

+396
-46
lines changed

12 files changed

+396
-46
lines changed

config/crd/bases/psmdb.percona.com_perconaservermongodbs.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3433,6 +3433,8 @@ spec:
34333433
additionalProperties:
34343434
type: string
34353435
type: object
3436+
loadBalancerClass:
3437+
type: string
34363438
loadBalancerSourceRanges:
34373439
items:
34383440
type: string
@@ -11197,6 +11199,8 @@ spec:
1119711199
additionalProperties:
1119811200
type: string
1119911201
type: object
11202+
loadBalancerClass:
11203+
type: string
1120011204
loadBalancerSourceRanges:
1120111205
items:
1120211206
type: string
@@ -16653,6 +16657,8 @@ spec:
1665316657
additionalProperties:
1665416658
type: string
1665516659
type: object
16660+
loadBalancerClass:
16661+
type: string
1665616662
loadBalancerSourceRanges:
1665716663
items:
1665816664
type: string

deploy/bundle.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4131,6 +4131,8 @@ spec:
41314131
additionalProperties:
41324132
type: string
41334133
type: object
4134+
loadBalancerClass:
4135+
type: string
41344136
loadBalancerSourceRanges:
41354137
items:
41364138
type: string
@@ -11895,6 +11897,8 @@ spec:
1189511897
additionalProperties:
1189611898
type: string
1189711899
type: object
11900+
loadBalancerClass:
11901+
type: string
1189811902
loadBalancerSourceRanges:
1189911903
items:
1190011904
type: string
@@ -17351,6 +17355,8 @@ spec:
1735117355
additionalProperties:
1735217356
type: string
1735317357
type: object
17358+
loadBalancerClass:
17359+
type: string
1735417360
loadBalancerSourceRanges:
1735517361
items:
1735617362
type: string

deploy/cr.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ spec:
225225
expose:
226226
enabled: false
227227
type: ClusterIP
228+
# loadBalancerClass: "eks.amazonaws.com/nlb"
228229
# loadBalancerSourceRanges:
229230
# - 10.0.0.0/8
230231
# annotations:
@@ -438,6 +439,7 @@ spec:
438439
expose:
439440
enabled: false
440441
type: ClusterIP
442+
# loadBalancerClass: "eks.amazonaws.com/nlb"
441443
# loadBalancerSourceRanges:
442444
# - 10.0.0.0/8
443445
# annotations:
@@ -549,6 +551,7 @@ spec:
549551
expose:
550552
type: ClusterIP
551553
# servicePerPod: true
554+
# loadBalancerClass: "eks.amazonaws.com/nlb"
552555
# loadBalancerSourceRanges:
553556
# - 10.0.0.0/8
554557
# annotations:

deploy/crd.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4131,6 +4131,8 @@ spec:
41314131
additionalProperties:
41324132
type: string
41334133
type: object
4134+
loadBalancerClass:
4135+
type: string
41344136
loadBalancerSourceRanges:
41354137
items:
41364138
type: string
@@ -11895,6 +11897,8 @@ spec:
1189511897
additionalProperties:
1189611898
type: string
1189711899
type: object
11900+
loadBalancerClass:
11901+
type: string
1189811902
loadBalancerSourceRanges:
1189911903
items:
1190011904
type: string
@@ -17351,6 +17355,8 @@ spec:
1735117355
additionalProperties:
1735217356
type: string
1735317357
type: object
17358+
loadBalancerClass:
17359+
type: string
1735417360
loadBalancerSourceRanges:
1735517361
items:
1735617362
type: string

deploy/cw-bundle.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4131,6 +4131,8 @@ spec:
41314131
additionalProperties:
41324132
type: string
41334133
type: object
4134+
loadBalancerClass:
4135+
type: string
41344136
loadBalancerSourceRanges:
41354137
items:
41364138
type: string
@@ -11895,6 +11897,8 @@ spec:
1189511897
additionalProperties:
1189611898
type: string
1189711899
type: object
11900+
loadBalancerClass:
11901+
type: string
1189811902
loadBalancerSourceRanges:
1189911903
items:
1190011904
type: string
@@ -17351,6 +17355,8 @@ spec:
1735117355
additionalProperties:
1735217356
type: string
1735317357
type: object
17358+
loadBalancerClass:
17359+
type: string
1735417360
loadBalancerSourceRanges:
1735517361
items:
1735617362
type: string

e2e-tests/version-service/conf/crd.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4131,6 +4131,8 @@ spec:
41314131
additionalProperties:
41324132
type: string
41334133
type: object
4134+
loadBalancerClass:
4135+
type: string
41344136
loadBalancerSourceRanges:
41354137
items:
41364138
type: string
@@ -11895,6 +11897,8 @@ spec:
1189511897
additionalProperties:
1189611898
type: string
1189711899
type: object
11900+
loadBalancerClass:
11901+
type: string
1189811902
loadBalancerSourceRanges:
1189911903
items:
1190011904
type: string
@@ -17351,6 +17355,8 @@ spec:
1735117355
additionalProperties:
1735217356
type: string
1735317357
type: object
17358+
loadBalancerClass:
17359+
type: string
1735417360
loadBalancerSourceRanges:
1735517361
items:
1735617362
type: string

pkg/apis/psmdb/v1/psmdb_types.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,6 +1110,12 @@ type Expose struct {
11101110

11111111
LoadBalancerSourceRanges []string `json:"loadBalancerSourceRanges,omitempty"`
11121112

1113+
// LoadBalancerClass is the class of the load balancer implementation the Service belongs to.
1114+
// This field can only be set when the Service type is 'LoadBalancer'.
1115+
// This field can only be set when creating or updating a Service to type 'LoadBalancer'.
1116+
// Once set, it can not be changed.
1117+
LoadBalancerClass *string `json:"loadBalancerClass,omitempty"`
1118+
11131119
ServiceAnnotations map[string]string `json:"annotations,omitempty"`
11141120
DeprecatedServiceAnnotations map[string]string `json:"serviceAnnotations,omitempty"`
11151121

pkg/apis/psmdb/v1/zz_generated.deepcopy.go

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

pkg/psmdb/mongos.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,9 @@ func MongosServiceSpec(cr *api.PerconaServerMongoDB, podName string) corev1.Serv
476476
spec.ExternalTrafficPolicy = corev1.ServiceExternalTrafficPolicyTypeCluster
477477
}
478478
spec.LoadBalancerSourceRanges = cr.Spec.Sharding.Mongos.Expose.LoadBalancerSourceRanges
479+
if cr.CompareVersion("1.20.0") >= 0 {
480+
spec.LoadBalancerClass = cr.Spec.Sharding.Mongos.Expose.LoadBalancerClass
481+
}
479482
default:
480483
spec.Type = corev1.ServiceTypeClusterIP
481484
}

pkg/psmdb/mongos_test.go

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package psmdb
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
corev1 "k8s.io/api/core/v1"
8+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+
"k8s.io/apimachinery/pkg/util/intstr"
10+
"k8s.io/utils/ptr"
11+
12+
api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
13+
"github.com/percona/percona-server-mongodb-operator/version"
14+
)
15+
16+
func TestMongosService(t *testing.T) {
17+
tests := map[string]struct {
18+
expose api.Expose
19+
podName string
20+
expectedSpec corev1.ServiceSpec
21+
}{
22+
"ClusterIP": {
23+
expose: api.Expose{
24+
ServiceLabels: map[string]string{
25+
"percona.com/test": "label",
26+
},
27+
ServiceAnnotations: map[string]string{
28+
"percona.com/test": "annotation",
29+
},
30+
ExposeType: corev1.ServiceTypeClusterIP,
31+
},
32+
podName: "test-cr-mongos-0",
33+
expectedSpec: corev1.ServiceSpec{
34+
PublishNotReadyAddresses: false,
35+
Ports: []corev1.ServicePort{
36+
{
37+
Name: "mongos",
38+
Port: 27017,
39+
TargetPort: intstr.FromInt(27017),
40+
},
41+
},
42+
Selector: map[string]string{
43+
"app.kubernetes.io/component": "mongos",
44+
"app.kubernetes.io/instance": "test-cr",
45+
"app.kubernetes.io/managed-by": "percona-server-mongodb-operator",
46+
"app.kubernetes.io/name": "percona-server-mongodb",
47+
"app.kubernetes.io/part-of": "percona-server-mongodb",
48+
},
49+
Type: corev1.ServiceTypeClusterIP,
50+
},
51+
},
52+
"NodePort": {
53+
expose: api.Expose{
54+
ServiceLabels: map[string]string{
55+
"percona.com/test": "label",
56+
},
57+
ServiceAnnotations: map[string]string{
58+
"percona.com/test": "annotation",
59+
},
60+
ExposeType: corev1.ServiceTypeNodePort,
61+
},
62+
podName: "test-cr-mongos-0",
63+
expectedSpec: corev1.ServiceSpec{
64+
PublishNotReadyAddresses: false,
65+
Ports: []corev1.ServicePort{
66+
{
67+
Name: "mongos",
68+
Port: 27017,
69+
TargetPort: intstr.FromInt(27017),
70+
},
71+
},
72+
Selector: map[string]string{
73+
"app.kubernetes.io/component": "mongos",
74+
"app.kubernetes.io/instance": "test-cr",
75+
"app.kubernetes.io/managed-by": "percona-server-mongodb-operator",
76+
"app.kubernetes.io/name": "percona-server-mongodb",
77+
"app.kubernetes.io/part-of": "percona-server-mongodb",
78+
},
79+
Type: corev1.ServiceTypeNodePort,
80+
ExternalTrafficPolicy: corev1.ServiceExternalTrafficPolicyCluster,
81+
},
82+
},
83+
"LoadBalancer": {
84+
expose: api.Expose{
85+
ServiceLabels: map[string]string{
86+
"percona.com/test": "label",
87+
},
88+
ServiceAnnotations: map[string]string{
89+
"percona.com/test": "annotation",
90+
},
91+
ExposeType: corev1.ServiceTypeLoadBalancer,
92+
LoadBalancerClass: ptr.To("eks.amazonaws.com/nlb"),
93+
LoadBalancerSourceRanges: []string{"10.0.0.0/16"},
94+
},
95+
podName: "test-cr-mongos-0",
96+
expectedSpec: corev1.ServiceSpec{
97+
PublishNotReadyAddresses: false,
98+
Ports: []corev1.ServicePort{
99+
{
100+
Name: "mongos",
101+
Port: 27017,
102+
TargetPort: intstr.FromInt(27017),
103+
},
104+
},
105+
Selector: map[string]string{
106+
"app.kubernetes.io/component": "mongos",
107+
"app.kubernetes.io/instance": "test-cr",
108+
"app.kubernetes.io/managed-by": "percona-server-mongodb-operator",
109+
"app.kubernetes.io/name": "percona-server-mongodb",
110+
"app.kubernetes.io/part-of": "percona-server-mongodb",
111+
},
112+
Type: corev1.ServiceTypeLoadBalancer,
113+
ExternalTrafficPolicy: corev1.ServiceExternalTrafficPolicyLocal,
114+
LoadBalancerClass: ptr.To("eks.amazonaws.com/nlb"),
115+
LoadBalancerSourceRanges: []string{"10.0.0.0/16"},
116+
},
117+
},
118+
}
119+
for name, tt := range tests {
120+
t.Run(name, func(t *testing.T) {
121+
cr := &api.PerconaServerMongoDB{
122+
ObjectMeta: metav1.ObjectMeta{
123+
Name: "test-cr",
124+
Namespace: "test-ns",
125+
},
126+
Spec: api.PerconaServerMongoDBSpec{
127+
CRVersion: version.Version,
128+
Sharding: api.Sharding{
129+
Mongos: &api.MongosSpec{
130+
Expose: api.MongosExpose{
131+
Expose: tt.expose,
132+
},
133+
},
134+
},
135+
},
136+
}
137+
spec := MongosServiceSpec(cr, tt.podName)
138+
assert.Equal(t, tt.expectedSpec, spec)
139+
})
140+
}
141+
142+
}

0 commit comments

Comments
 (0)