Skip to content

Commit 22e9a68

Browse files
refactor: update informer set to use SharedInformerFactory for GKE Networking API and core Kubernetes resources
1 parent ac7731b commit 22e9a68

1 file changed

Lines changed: 54 additions & 91 deletions

File tree

pkg/multiproject/neg/informerset/informerset.go

Lines changed: 54 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,28 @@ import (
44
"fmt"
55

66
networkclient "github.com/GoogleCloudPlatform/gke-networking-api/client/network/clientset/versioned"
7-
informernetwork "github.com/GoogleCloudPlatform/gke-networking-api/client/network/informers/externalversions/network/v1"
7+
networkinformers "github.com/GoogleCloudPlatform/gke-networking-api/client/network/informers/externalversions"
88
nodetopologyclient "github.com/GoogleCloudPlatform/gke-networking-api/client/nodetopology/clientset/versioned"
9-
informernodetopology "github.com/GoogleCloudPlatform/gke-networking-api/client/nodetopology/informers/externalversions/nodetopology/v1"
9+
nodetopologyinformers "github.com/GoogleCloudPlatform/gke-networking-api/client/nodetopology/informers/externalversions"
1010
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11-
informerv1 "k8s.io/client-go/informers/core/v1"
12-
discoveryinformer "k8s.io/client-go/informers/discovery/v1"
13-
informernetworking "k8s.io/client-go/informers/networking/v1"
11+
"k8s.io/client-go/informers"
1412
"k8s.io/client-go/kubernetes"
1513
"k8s.io/client-go/tools/cache"
1614
"k8s.io/ingress-gce/pkg/multiproject/common/filteredinformer"
1715
svcnegclient "k8s.io/ingress-gce/pkg/svcneg/client/clientset/versioned"
18-
informersvcneg "k8s.io/ingress-gce/pkg/svcneg/client/informers/externalversions/svcneg/v1beta1"
19-
"k8s.io/ingress-gce/pkg/utils"
16+
svcneginformers "k8s.io/ingress-gce/pkg/svcneg/client/informers/externalversions"
2017
"k8s.io/ingress-gce/pkg/utils/endpointslices"
2118
"k8s.io/klog/v2"
2219
)
2320

2421
// InformerSet manages all shared informers used by multiproject controllers.
2522
// It provides centralized initialization and lifecycle management.
2623
type InformerSet struct {
24+
kubeFactory informers.SharedInformerFactory
25+
svcNegFactory svcneginformers.SharedInformerFactory
26+
networkFactory networkinformers.SharedInformerFactory
27+
nodetopologyFactory nodetopologyinformers.SharedInformerFactory
28+
2729
// Core Kubernetes informers (always present)
2830
Ingress cache.SharedIndexInformer
2931
Service cache.SharedIndexInformer
@@ -51,80 +53,48 @@ func NewInformerSet(
5153
nodeTopologyClient nodetopologyclient.Interface,
5254
resyncPeriod metav1.Duration,
5355
) *InformerSet {
54-
informers := &InformerSet{}
55-
56-
// Create core Kubernetes informers
57-
informers.Ingress = informernetworking.NewIngressInformer(
58-
kubeClient,
59-
metav1.NamespaceAll,
60-
resyncPeriod.Duration,
61-
utils.NewNamespaceIndexer(),
62-
)
63-
64-
informers.Service = informerv1.NewServiceInformer(
65-
kubeClient,
66-
metav1.NamespaceAll,
67-
resyncPeriod.Duration,
68-
utils.NewNamespaceIndexer(),
69-
)
56+
infSet := &InformerSet{}
7057

71-
informers.Pod = informerv1.NewPodInformer(
72-
kubeClient,
73-
metav1.NamespaceAll,
74-
resyncPeriod.Duration,
75-
utils.NewNamespaceIndexer(),
76-
)
58+
infSet.kubeFactory = informers.NewSharedInformerFactory(kubeClient, resyncPeriod.Duration)
59+
if svcNegClient != nil {
60+
infSet.svcNegFactory = svcneginformers.NewSharedInformerFactory(svcNegClient, resyncPeriod.Duration)
61+
}
62+
if networkClient != nil {
63+
infSet.networkFactory = networkinformers.NewSharedInformerFactory(networkClient, resyncPeriod.Duration)
64+
}
65+
if nodeTopologyClient != nil {
66+
infSet.nodetopologyFactory = nodetopologyinformers.NewSharedInformerFactory(nodeTopologyClient, resyncPeriod.Duration)
67+
}
7768

78-
informers.Node = informerv1.NewNodeInformer(
79-
kubeClient,
80-
resyncPeriod.Duration,
81-
utils.NewNamespaceIndexer(),
82-
)
69+
// Create core Kubernetes informers from factory
70+
infSet.Ingress = infSet.kubeFactory.Networking().V1().Ingresses().Informer()
71+
infSet.Service = infSet.kubeFactory.Core().V1().Services().Informer()
72+
infSet.Pod = infSet.kubeFactory.Core().V1().Pods().Informer()
73+
infSet.Node = infSet.kubeFactory.Core().V1().Nodes().Informer()
8374

8475
// EndpointSlice informer with custom indexers for NEG controller
85-
informers.EndpointSlice = discoveryinformer.NewEndpointSliceInformer(
86-
kubeClient,
87-
metav1.NamespaceAll,
88-
resyncPeriod.Duration,
89-
cache.Indexers{
90-
cache.NamespaceIndex: cache.MetaNamespaceIndexFunc,
91-
endpointslices.EndpointSlicesByServiceIndex: endpointslices.EndpointSlicesByServiceFunc,
92-
},
93-
)
94-
95-
// Create CRD informers if clients are available
96-
if svcNegClient != nil {
97-
informers.SvcNeg = informersvcneg.NewServiceNetworkEndpointGroupInformer(
98-
svcNegClient,
99-
metav1.NamespaceAll,
100-
resyncPeriod.Duration,
101-
utils.NewNamespaceIndexer(),
102-
)
76+
endpointSliceInformer := infSet.kubeFactory.Discovery().V1().EndpointSlices().Informer()
77+
if err := endpointSliceInformer.AddIndexers(cache.Indexers{
78+
endpointslices.EndpointSlicesByServiceIndex: endpointslices.EndpointSlicesByServiceFunc,
79+
}); err != nil {
80+
klog.Fatalf("failed to add indexers to endpointSlice informer: %v", err)
10381
}
82+
infSet.EndpointSlice = endpointSliceInformer
10483

105-
if networkClient != nil {
106-
informers.Network = informernetwork.NewNetworkInformer(
107-
networkClient,
108-
resyncPeriod.Duration,
109-
utils.NewNamespaceIndexer(),
110-
)
111-
112-
informers.GkeNetworkParams = informernetwork.NewGKENetworkParamSetInformer(
113-
networkClient,
114-
resyncPeriod.Duration,
115-
utils.NewNamespaceIndexer(),
116-
)
84+
// Create CRD informers if factories are available
85+
if infSet.svcNegFactory != nil {
86+
infSet.SvcNeg = infSet.svcNegFactory.Networking().V1beta1().ServiceNetworkEndpointGroups().Informer()
11787
}
11888

119-
if nodeTopologyClient != nil {
120-
informers.NodeTopology = informernodetopology.NewNodeTopologyInformer(
121-
nodeTopologyClient,
122-
resyncPeriod.Duration,
123-
utils.NewNamespaceIndexer(),
124-
)
89+
if infSet.networkFactory != nil {
90+
infSet.Network = infSet.networkFactory.Networking().V1().Networks().Informer()
91+
infSet.GkeNetworkParams = infSet.networkFactory.Networking().V1().GKENetworkParamSets().Informer()
12592
}
12693

127-
return informers
94+
if infSet.nodetopologyFactory != nil {
95+
infSet.NodeTopology = infSet.nodetopologyFactory.Networking().V1().NodeTopologies().Informer()
96+
}
97+
return infSet
12898
}
12999

130100
// Start starts all informers and waits for their caches to sync.
@@ -147,18 +117,19 @@ func (i *InformerSet) Start(stopCh <-chan struct{}, logger klog.Logger) error {
147117
default:
148118
}
149119

150-
// Start all core informers
151-
startInformer(i.Ingress, stopCh)
152-
startInformer(i.Service, stopCh)
153-
startInformer(i.Pod, stopCh)
154-
startInformer(i.Node, stopCh)
155-
startInformer(i.EndpointSlice, stopCh)
156-
157-
// Start optional informers
158-
startInformer(i.SvcNeg, stopCh)
159-
startInformer(i.Network, stopCh)
160-
startInformer(i.GkeNetworkParams, stopCh)
161-
startInformer(i.NodeTopology, stopCh)
120+
// Start factories
121+
if i.kubeFactory != nil {
122+
i.kubeFactory.Start(stopCh)
123+
}
124+
if i.svcNegFactory != nil {
125+
i.svcNegFactory.Start(stopCh)
126+
}
127+
if i.networkFactory != nil {
128+
i.networkFactory.Start(stopCh)
129+
}
130+
if i.nodetopologyFactory != nil {
131+
i.nodetopologyFactory.Start(stopCh)
132+
}
162133

163134
i.started = true
164135

@@ -271,11 +242,3 @@ func (i *InformerSet) hasSyncedFuncs() []func() bool {
271242

272243
return funcs
273244
}
274-
275-
// startInformer starts the informer if it is non-nil.
276-
func startInformer(inf cache.SharedIndexInformer, stopCh <-chan struct{}) {
277-
if inf == nil {
278-
return
279-
}
280-
go inf.Run(stopCh)
281-
}

0 commit comments

Comments
 (0)