Skip to content

Commit 551c124

Browse files
ivankatliarchuktroll-os
authored andcommitted
chore(source/istio): replace kube API calls with caching and ingress informers (kubernetes-sigs#5743)
* chore(source/istio): ingress to use informers instead of kube API calls Signed-off-by: ivan katliarchuk <[email protected]> * chore(source/istio): ingress to use informers instead of kube API calls Signed-off-by: ivan katliarchuk <[email protected]> * chore(source/istio): ingress to use informers instead of kube API calls Signed-off-by: ivan katliarchuk <[email protected]> * chore(source/istio): ingress to use informers instead of kube API calls Signed-off-by: ivan katliarchuk <[email protected]> * chore(source/istio): ingress to use informers instead of kube API calls Signed-off-by: ivan katliarchuk <[email protected]> * chore(source/istio): ingress to use informers instead of kube API calls Signed-off-by: ivan katliarchuk <[email protected]> --------- Signed-off-by: ivan katliarchuk <[email protected]>
1 parent 0dbbfe6 commit 551c124

File tree

4 files changed

+28
-19
lines changed

4 files changed

+28
-19
lines changed

source/ingress.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import (
3131
kubeinformers "k8s.io/client-go/informers"
3232
netinformers "k8s.io/client-go/informers/networking/v1"
3333
"k8s.io/client-go/kubernetes"
34-
"k8s.io/client-go/tools/cache"
3534

3635
"sigs.k8s.io/external-dns/source/informers"
3736

@@ -100,12 +99,7 @@ func NewIngressSource(
10099
ingressInformer := informerFactory.Networking().V1().Ingresses()
101100

102101
// Add default resource event handlers to properly initialize informer.
103-
ingressInformer.Informer().AddEventHandler(
104-
cache.ResourceEventHandlerFuncs{
105-
AddFunc: func(obj interface{}) {
106-
},
107-
},
108-
)
102+
_, _ = ingressInformer.Informer().AddEventHandler(informers.DefaultEventHandler())
109103

110104
informerFactory.Start(ctx.Done())
111105

@@ -360,5 +354,5 @@ func (sc *ingressSource) AddEventHandler(ctx context.Context, handler func()) {
360354

361355
// Right now there is no way to remove event handler from informer, see:
362356
// https://github.com/kubernetes/kubernetes/issues/79610
363-
sc.ingressInformer.Informer().AddEventHandler(eventHandlerFunc(handler))
357+
_, _ = sc.ingressInformer.Informer().AddEventHandler(eventHandlerFunc(handler))
364358
}

source/istio_gateway.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"k8s.io/apimachinery/pkg/labels"
3434
kubeinformers "k8s.io/client-go/informers"
3535
coreinformers "k8s.io/client-go/informers/core/v1"
36+
netinformers "k8s.io/client-go/informers/networking/v1"
3637
"k8s.io/client-go/kubernetes"
3738

3839
"sigs.k8s.io/external-dns/endpoint"
@@ -58,6 +59,7 @@ type gatewaySource struct {
5859
ignoreHostnameAnnotation bool
5960
serviceInformer coreinformers.ServiceInformer
6061
gatewayInformer networkingv1beta1informer.GatewayInformer
62+
ingressInformer netinformers.IngressInformer
6163
}
6264

6365
// NewIstioGatewaySource creates a new gatewaySource with the given config.
@@ -82,6 +84,9 @@ func NewIstioGatewaySource(
8284
serviceInformer := informerFactory.Core().V1().Services()
8385
istioInformerFactory := istioinformers.NewSharedInformerFactory(istioClient, 0)
8486
gatewayInformer := istioInformerFactory.Networking().V1beta1().Gateways()
87+
ingressInformer := informerFactory.Networking().V1().Ingresses()
88+
89+
_, _ = ingressInformer.Informer().AddEventHandler(informers.DefaultEventHandler())
8590

8691
// Add default resource event handlers to properly initialize informer.
8792
_, _ = serviceInformer.Informer().AddEventHandler(informers.DefaultEventHandler())
@@ -117,6 +122,7 @@ func NewIstioGatewaySource(
117122
ignoreHostnameAnnotation: ignoreHostnameAnnotation,
118123
serviceInformer: serviceInformer,
119124
gatewayInformer: gatewayInformer,
125+
ingressInformer: ingressInformer,
120126
}, nil
121127
}
122128

@@ -196,7 +202,7 @@ func (sc *gatewaySource) Endpoints(ctx context.Context) ([]*endpoint.Endpoint, e
196202
}
197203

198204
// AddEventHandler adds an event handler that should be triggered if the watched Istio Gateway changes.
199-
func (sc *gatewaySource) AddEventHandler(ctx context.Context, handler func()) {
205+
func (sc *gatewaySource) AddEventHandler(_ context.Context, handler func()) {
200206
log.Debug("Adding event handler for Istio Gateway")
201207

202208
_, _ = sc.gatewayInformer.Informer().AddEventHandler(eventHandlerFunc(handler))
@@ -226,7 +232,7 @@ func (sc *gatewaySource) filterByAnnotations(gateways []*networkingv1beta1.Gatew
226232
return filteredList, nil
227233
}
228234

229-
func (sc *gatewaySource) targetsFromIngress(ctx context.Context, ingressStr string, gateway *networkingv1beta1.Gateway) (endpoint.Targets, error) {
235+
func (sc *gatewaySource) targetsFromIngress(ingressStr string, gateway *networkingv1beta1.Gateway) (endpoint.Targets, error) {
230236
namespace, name, err := ParseIngress(ingressStr)
231237
if err != nil {
232238
return nil, fmt.Errorf("failed to parse Ingress annotation on Gateway (%s/%s): %w", gateway.Namespace, gateway.Name, err)
@@ -237,7 +243,7 @@ func (sc *gatewaySource) targetsFromIngress(ctx context.Context, ingressStr stri
237243

238244
targets := make(endpoint.Targets, 0)
239245

240-
ingress, err := sc.kubeClient.NetworkingV1().Ingresses(namespace).Get(ctx, name, metav1.GetOptions{})
246+
ingress, err := sc.ingressInformer.Lister().Ingresses(namespace).Get(name)
241247
if err != nil {
242248
log.Error(err)
243249
return nil, err
@@ -260,7 +266,7 @@ func (sc *gatewaySource) targetsFromGateway(ctx context.Context, gateway *networ
260266

261267
ingressStr, ok := gateway.Annotations[IstioGatewayIngressSource]
262268
if ok && ingressStr != "" {
263-
return sc.targetsFromIngress(ctx, ingressStr, gateway)
269+
return sc.targetsFromIngress(ingressStr, gateway)
264270
}
265271

266272
return EndpointTargetsFromServices(sc.serviceInformer, sc.namespace, gateway.Spec.Selector)

source/istio_gateway_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1481,6 +1481,7 @@ func testGatewayEndpoints(t *testing.T) {
14811481
t.Parallel()
14821482

14831483
fakeKubernetesClient := fake.NewClientset()
1484+
targetNamespace := ti.targetNamespace
14841485

14851486
for _, lb := range ti.lbServices {
14861487
service := lb.Service()
@@ -1490,6 +1491,9 @@ func testGatewayEndpoints(t *testing.T) {
14901491

14911492
for _, ing := range ti.ingresses {
14921493
ingress := ing.Ingress()
1494+
if ingress.Namespace != targetNamespace {
1495+
targetNamespace = v1.NamespaceAll
1496+
}
14931497
_, err := fakeKubernetesClient.NetworkingV1().Ingresses(ingress.Namespace).Create(context.Background(), ingress, metav1.CreateOptions{})
14941498
require.NoError(t, err)
14951499
}
@@ -1505,7 +1509,7 @@ func testGatewayEndpoints(t *testing.T) {
15051509
context.TODO(),
15061510
fakeKubernetesClient,
15071511
fakeIstioClient,
1508-
ti.targetNamespace,
1512+
targetNamespace,
15091513
ti.annotationFilter,
15101514
ti.fqdnTemplate,
15111515
ti.combineFQDNAndAnnotation,

source/istio_virtualservice.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ import (
3232
networkingv1beta1informer "istio.io/client-go/pkg/informers/externalversions/networking/v1beta1"
3333
corev1 "k8s.io/api/core/v1"
3434
"k8s.io/apimachinery/pkg/api/errors"
35-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3635
"k8s.io/apimachinery/pkg/labels"
3736
kubeinformers "k8s.io/client-go/informers"
3837
coreinformers "k8s.io/client-go/informers/core/v1"
38+
netinformers "k8s.io/client-go/informers/networking/v1"
3939
"k8s.io/client-go/kubernetes"
4040

4141
"sigs.k8s.io/external-dns/endpoint"
@@ -61,6 +61,7 @@ type virtualServiceSource struct {
6161
serviceInformer coreinformers.ServiceInformer
6262
vServiceInformer networkingv1beta1informer.VirtualServiceInformer
6363
gatewayInformer networkingv1beta1informer.GatewayInformer
64+
ingressInformer netinformers.IngressInformer
6465
}
6566

6667
// NewIstioVirtualServiceSource creates a new virtualServiceSource with the given config.
@@ -86,6 +87,9 @@ func NewIstioVirtualServiceSource(
8687
istioInformerFactory := istioinformers.NewSharedInformerFactoryWithOptions(istioClient, 0, istioinformers.WithNamespace(namespace))
8788
virtualServiceInformer := istioInformerFactory.Networking().V1beta1().VirtualServices()
8889
gatewayInformer := istioInformerFactory.Networking().V1beta1().Gateways()
90+
ingressInformer := informerFactory.Networking().V1().Ingresses()
91+
92+
_, _ = ingressInformer.Informer().AddEventHandler(informers.DefaultEventHandler())
8993

9094
// Add default resource event handlers to properly initialize informer.
9195
_, _ = serviceInformer.Informer().AddEventHandler(informers.DefaultEventHandler())
@@ -124,6 +128,7 @@ func NewIstioVirtualServiceSource(
124128
serviceInformer: serviceInformer,
125129
vServiceInformer: virtualServiceInformer,
126130
gatewayInformer: gatewayInformer,
131+
ingressInformer: ingressInformer,
127132
}, nil
128133
}
129134

@@ -292,7 +297,7 @@ func (sc *virtualServiceSource) targetsFromVirtualService(ctx context.Context, v
292297
if !virtualServiceBindsToGateway(vService, gw, vsHost) {
293298
continue
294299
}
295-
tgs, err := sc.targetsFromGateway(ctx, gw)
300+
tgs, err := sc.targetsFromGateway(gw)
296301
if err != nil {
297302
return targets, err
298303
}
@@ -407,7 +412,7 @@ func virtualServiceBindsToGateway(vService *v1beta1.VirtualService, gateway *v1b
407412
return false
408413
}
409414

410-
func (sc *virtualServiceSource) targetsFromIngress(ctx context.Context, ingressStr string, gateway *v1beta1.Gateway) (endpoint.Targets, error) {
415+
func (sc *virtualServiceSource) targetsFromIngress(ingressStr string, gateway *v1beta1.Gateway) (endpoint.Targets, error) {
411416
namespace, name, err := ParseIngress(ingressStr)
412417
if err != nil {
413418
return nil, fmt.Errorf("failed to parse Ingress annotation on Gateway (%s/%s): %w", gateway.Namespace, gateway.Name, err)
@@ -416,7 +421,7 @@ func (sc *virtualServiceSource) targetsFromIngress(ctx context.Context, ingressS
416421
namespace = gateway.Namespace
417422
}
418423

419-
ingress, err := sc.kubeClient.NetworkingV1().Ingresses(namespace).Get(ctx, name, metav1.GetOptions{})
424+
ingress, err := sc.ingressInformer.Lister().Ingresses(namespace).Get(name)
420425
if err != nil {
421426
log.Error(err)
422427
return nil, err
@@ -434,15 +439,15 @@ func (sc *virtualServiceSource) targetsFromIngress(ctx context.Context, ingressS
434439
return targets, nil
435440
}
436441

437-
func (sc *virtualServiceSource) targetsFromGateway(ctx context.Context, gateway *v1beta1.Gateway) (endpoint.Targets, error) {
442+
func (sc *virtualServiceSource) targetsFromGateway(gateway *v1beta1.Gateway) (endpoint.Targets, error) {
438443
targets := annotations.TargetsFromTargetAnnotation(gateway.Annotations)
439444
if len(targets) > 0 {
440445
return targets, nil
441446
}
442447

443448
ingressStr, ok := gateway.Annotations[IstioGatewayIngressSource]
444449
if ok && ingressStr != "" {
445-
return sc.targetsFromIngress(ctx, ingressStr, gateway)
450+
return sc.targetsFromIngress(ingressStr, gateway)
446451
}
447452

448453
return EndpointTargetsFromServices(sc.serviceInformer, sc.namespace, gateway.Spec.Selector)

0 commit comments

Comments
 (0)