@@ -75,6 +75,7 @@ func (c *Controller) handleUpdateEndpoint(key string) error {
75
75
vip , vpcName , subnetName string
76
76
ok bool
77
77
ignoreHealthCheck = true
78
+ isPreferLocalBackend = false
78
79
)
79
80
80
81
if vip , ok = svc .Annotations [util .SwitchLBRuleVipsAnnotation ]; ok {
@@ -93,6 +94,20 @@ func (c *Controller) handleUpdateEndpoint(key string) error {
93
94
return nil
94
95
}
95
96
97
+ // 注意这些东西只有在ovn lb开关打开的时候才能用
98
+ if svc .Spec .Type == v1 .ServiceTypeLoadBalancer && svc .Spec .ExternalTrafficPolicy == v1 .ServiceExternalTrafficPolicyTypeLocal {
99
+ if externalIP := util .GetLoadBalancerIP (* svc ); err == nil && externalIP != "" {
100
+ lbVips = append (lbVips , externalIP )
101
+ } else if err != nil {
102
+ klog .Errorf ("failed to get external load balancer IP for service %s/%s: %v" , namespace , name , err )
103
+ return err
104
+ }
105
+ isPreferLocalBackend = true
106
+ } else if svc .Spec .Type == v1 .ServiceTypeClusterIP && svc .Spec .InternalTrafficPolicy != nil && * svc .Spec .InternalTrafficPolicy == v1 .ServiceInternalTrafficPolicyLocal {
107
+ isPreferLocalBackend = true
108
+ }
109
+
110
+ klog .Errorf ("clyi lbVips %v" , lbVips )
96
111
if pods , err = c .podsLister .Pods (namespace ).List (labels .Set (svc .Spec .Selector ).AsSelector ()); err != nil {
97
112
klog .Errorf ("failed to get pods for service %s in namespace %s: %v" , name , namespace , err )
98
113
return err
@@ -157,19 +172,40 @@ func (c *Controller) handleUpdateEndpoint(key string) error {
157
172
backends []string
158
173
ipPortMapping , externals map [string ]string
159
174
)
160
-
161
- if ! ignoreHealthCheck {
175
+ isGenIPPortMapping := ! ignoreHealthCheck || isPreferLocalBackend
176
+ if isGenIPPortMapping {
162
177
if checkIP , err = c .getHealthCheckVip (subnetName , lbVip ); err != nil {
163
178
klog .Error (err )
164
179
return err
165
180
}
181
+
182
+ // subnet, err := c.subnetsLister.Get(subnetName)
183
+ // if err != nil {
184
+ // klog.Errorf("failed to get subnet %s: %v", subnetName, err)
185
+ // return err
186
+ // }
187
+
188
+ // if subnet.Spec.IsExternalLBAddressPool {
189
+ // vipName := fmt.Sprintf("%s.%s", svc.Name, svc.Namespace)
190
+ // vip := &kubeovnv1.Vip{
191
+ // ObjectMeta: metav1.ObjectMeta{
192
+ // Name: vipName,
193
+ // },
194
+ // Spec: kubeovnv1.VipSpec{
195
+ // Subnet: subnetName,
196
+ // },
197
+ // }
198
+ // if _, err = c.config.KubeOvnClient.KubeovnV1().Vips().Create(context.Background(), vip, metav1.CreateOptions{}); err != nil {
199
+ // klog.Errorf("failed to create vip %s, %v", vipName, err)
200
+ // return err
201
+ // }
202
+ // }
203
+
166
204
externals = map [string ]string {
167
205
util .SwitchLBRuleSubnet : subnetName ,
168
206
}
169
207
}
170
-
171
- ipPortMapping , backends = getIPPortMappingBackend (ep , pods , port , lbVip , checkIP , ignoreHealthCheck )
172
-
208
+ ipPortMapping , backends = getIPPortMappingBackend (ep , pods , port , lbVip , checkIP , isGenIPPortMapping )
173
209
// for performance reason delete lb with no backends
174
210
if len (backends ) != 0 {
175
211
vip = util .JoinHostPort (lbVip , port .Port )
@@ -178,6 +214,14 @@ func (c *Controller) handleUpdateEndpoint(key string) error {
178
214
klog .Errorf ("failed to add vip %s with backends %s to LB %s: %v" , lbVip , backends , lb , err )
179
215
return err
180
216
}
217
+
218
+ if isPreferLocalBackend {
219
+ if err = c .OVNNbClient .LoadBalancerUpdateIPPortMapping (lb , vip , ipPortMapping ); err != nil {
220
+ klog .Errorf ("failed to update ip port mapping %s for vip %s to LB %s: %v" , ipPortMapping , vip , lb , err )
221
+ return err
222
+ }
223
+ }
224
+
181
225
if ! ignoreHealthCheck && len (ipPortMapping ) != 0 {
182
226
klog .Infof ("add health check ip port mapping %v to LB %s" , ipPortMapping , lb )
183
227
if err = c .OVNNbClient .LoadBalancerAddHealthCheck (lb , vip , ignoreHealthCheck , ipPortMapping , externals ); err != nil {
@@ -321,7 +365,7 @@ func (c *Controller) getHealthCheckVip(subnetName, lbVip string) (string, error)
321
365
return checkIP , nil
322
366
}
323
367
324
- func getIPPortMappingBackend (endpoints * v1.Endpoints , pods []* v1.Pod , servicePort v1.ServicePort , serviceIP , checkVip string , ignoreHealthCheck bool ) (map [string ]string , []string ) {
368
+ func getIPPortMappingBackend (endpoints * v1.Endpoints , pods []* v1.Pod , servicePort v1.ServicePort , serviceIP , checkVip string , isGenIPPortMapping bool ) (map [string ]string , []string ) {
325
369
var (
326
370
ipPortMapping = map [string ]string {}
327
371
backends = []string {}
@@ -341,7 +385,7 @@ func getIPPortMappingBackend(endpoints *v1.Endpoints, pods []*v1.Pod, servicePor
341
385
}
342
386
343
387
for _ , address := range subset .Addresses {
344
- if ! ignoreHealthCheck && address .TargetRef .Name != "" {
388
+ if isGenIPPortMapping && address .TargetRef .Name != "" {
345
389
ipName := fmt .Sprintf ("%s.%s" , address .TargetRef .Name , endpoints .Namespace )
346
390
ipPortMapping [address .IP ] = fmt .Sprintf (util .HealthCheckNamedVipTemplate , ipName , checkVip )
347
391
}
0 commit comments