@@ -26,18 +26,20 @@ type EndpointsResolver interface {
26
26
}
27
27
28
28
// NewEndpointsResolver constructs a new defaultEndpointsResolver
29
- func NewEndpointsResolver (k8sClient client.Client , logger logr.Logger ) * defaultEndpointsResolver {
29
+ func NewEndpointsResolver (k8sClient client.Client , listPageSize int , logger logr.Logger ) * defaultEndpointsResolver {
30
30
return & defaultEndpointsResolver {
31
- k8sClient : k8sClient ,
32
- logger : logger ,
31
+ k8sClient : k8sClient ,
32
+ listPageSize : listPageSize ,
33
+ logger : logger ,
33
34
}
34
35
}
35
36
36
37
var _ EndpointsResolver = (* defaultEndpointsResolver )(nil )
37
38
38
39
type defaultEndpointsResolver struct {
39
- k8sClient client.Client
40
- logger logr.Logger
40
+ k8sClient client.Client
41
+ listPageSize int
42
+ logger logr.Logger
41
43
}
42
44
43
45
func (r * defaultEndpointsResolver ) Resolve (ctx context.Context , policy * networking.NetworkPolicy ) ([]policyinfo.EndpointInfo ,
@@ -101,21 +103,47 @@ func (r *defaultEndpointsResolver) computeEgressEndpoints(ctx context.Context, p
101
103
return egressEndpoints , nil
102
104
}
103
105
106
+ // listPodsWithPagination lists pods with pagination to avoid large memory usage and timeout issue from api server side
107
+ func (r * defaultEndpointsResolver ) listPodsWithPagination (ctx context.Context , selector labels.Selector , namespace string ) ([]corev1.Pod , error ) {
108
+ var allPods []corev1.Pod
109
+ continueToken := ""
110
+
111
+ for {
112
+ podList := & corev1.PodList {}
113
+ if err := r .k8sClient .List (ctx , podList , & client.ListOptions {
114
+ LabelSelector : selector ,
115
+ Namespace : namespace ,
116
+ Limit : int64 (r .listPageSize ),
117
+ Continue : continueToken ,
118
+ }); err != nil {
119
+ r .logger .Info ("Unable to List Pods" , "err" , err )
120
+ return nil , err
121
+ }
122
+
123
+ allPods = append (allPods , podList .Items ... )
124
+ continueToken = podList .Continue
125
+
126
+ if continueToken == "" {
127
+ break
128
+ }
129
+ }
130
+
131
+ return allPods , nil
132
+ }
133
+
104
134
func (r * defaultEndpointsResolver ) computePodSelectorEndpoints (ctx context.Context , policy * networking.NetworkPolicy ) ([]policyinfo.PodEndpoint , error ) {
105
135
var podEndpoints []policyinfo.PodEndpoint
106
136
podSelector , err := metav1 .LabelSelectorAsSelector (& policy .Spec .PodSelector )
107
137
if err != nil {
108
138
return nil , errors .Wrap (err , "unable to get pod selector" )
109
139
}
110
- podList := & corev1.PodList {}
111
- if err := r .k8sClient .List (ctx , podList , & client.ListOptions {
112
- LabelSelector : podSelector ,
113
- Namespace : policy .Namespace ,
114
- }); err != nil {
115
- r .logger .Info ("Unable to List Pods" , "err" , err )
140
+
141
+ pods , err := r .listPodsWithPagination (ctx , podSelector , policy .Namespace )
142
+ if err != nil {
116
143
return nil , err
117
144
}
118
- for _ , pod := range podList .Items {
145
+
146
+ for _ , pod := range pods {
119
147
podIP := k8s .GetPodIP (& pod )
120
148
if len (podIP ) > 0 {
121
149
podEndpoints = append (podEndpoints , policyinfo.PodEndpoint {
@@ -212,18 +240,14 @@ func (r *defaultEndpointsResolver) resolveNetworkPeers(ctx context.Context, poli
212
240
}
213
241
214
242
func (r * defaultEndpointsResolver ) getIngressRulesPorts (ctx context.Context , policyNamespace string , policyPodSelector * metav1.LabelSelector , ports []networking.NetworkPolicyPort ) []policyinfo.Port {
215
- podList := & corev1.PodList {}
216
- if err := r .k8sClient .List (ctx , podList , & client.ListOptions {
217
- LabelSelector : r .createPodLabelSelector (policyPodSelector ),
218
- Namespace : policyNamespace ,
219
- }); err != nil {
220
- r .logger .Info ("Unable to List Pods" , "err" , err )
243
+ pods , err := r .listPodsWithPagination (ctx , r .createPodLabelSelector (policyPodSelector ), policyNamespace )
244
+ if err != nil {
221
245
return nil
222
246
}
223
247
224
- r .logger .V (2 ).Info ("list pods for ingress" , "podList " , * podList , "namespace" , policyNamespace , "selector" , * policyPodSelector )
248
+ r .logger .V (2 ).Info ("list pods for ingress" , "podsCount " , len ( pods ) , "namespace" , policyNamespace , "selector" , * policyPodSelector )
225
249
var portList []policyinfo.Port
226
- for _ , pod := range podList . Items {
250
+ for _ , pod := range pods {
227
251
portList = append (portList , r .getPortList (pod , ports )... )
228
252
r .logger .Info ("Got ingress port from pod" , "pod" , types.NamespacedName {Namespace : pod .Namespace , Name : pod .Name }.String ())
229
253
}
@@ -338,17 +362,13 @@ func (r *defaultEndpointsResolver) getMatchingPodAddresses(ctx context.Context,
338
362
}
339
363
340
364
// populate src pods for ingress and dst pods for egress
341
- podList := & corev1.PodList {}
342
- if err := r .k8sClient .List (ctx , podList , & client.ListOptions {
343
- LabelSelector : r .createPodLabelSelector (ls ),
344
- Namespace : namespace ,
345
- }); err != nil {
346
- r .logger .Info ("Unable to List Pods" , "err" , err )
365
+ pods , err := r .listPodsWithPagination (ctx , r .createPodLabelSelector (ls ), namespace )
366
+ if err != nil {
347
367
return nil
348
368
}
349
- r .logger .V (1 ).Info ("Got pods for label selector" , "count" , len (podList . Items ), "selector" , ls .String ())
369
+ r .logger .V (1 ).Info ("Got pods for label selector" , "count" , len (pods ), "selector" , ls .String ())
350
370
351
- for _ , pod := range podList . Items {
371
+ for _ , pod := range pods {
352
372
podIP := k8s .GetPodIP (& pod )
353
373
if len (podIP ) == 0 {
354
374
continue
@@ -463,19 +483,17 @@ func (r *defaultEndpointsResolver) getMatchingServicePort(ctx context.Context, s
463
483
if err != nil {
464
484
return 0 , err
465
485
}
466
- podList := & corev1.PodList {}
467
- if err := r .k8sClient .List (ctx , podList , & client.ListOptions {
468
- LabelSelector : podSelector ,
469
- Namespace : svc .Namespace ,
470
- }); err != nil {
471
- r .logger .Info ("Unable to List Pods" , "err" , err )
486
+
487
+ pods , err := r .listPodsWithPagination (ctx , podSelector , svc .Namespace )
488
+ if err != nil {
472
489
return 0 , err
473
490
}
474
- for i := range podList .Items {
475
- if portVal , err := k8s .LookupListenPortFromPodSpec (svc , & podList .Items [i ], * port , protocol ); err == nil {
491
+
492
+ for i := range pods {
493
+ if portVal , err := k8s .LookupListenPortFromPodSpec (svc , & pods [i ], * port , protocol ); err == nil {
476
494
return portVal , nil
477
495
} else {
478
- r .logger .V (1 ).Info ("The pod doesn't have port matched" , "err" , err , "pod" , podList . Items [i ])
496
+ r .logger .V (1 ).Info ("The pod doesn't have port matched" , "err" , err , "pod" , pods [i ])
479
497
}
480
498
}
481
499
return 0 , errors .Errorf ("unable to find matching service listen port %s for service %s" , port .String (), k8s .NamespacedName (svc ))
0 commit comments